久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

基于虎书实现LALR(1)分析并生成GLSL编译器前端代码(C#)

發布時間:2025/3/20 C# 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于虎书实现LALR(1)分析并生成GLSL编译器前端代码(C#) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基于虎書實現LALR(1)分析并生成GLSL編譯器前端代碼(C#)

為了完美解析GLSL源碼,獲取其中的信息(都有哪些in/out/uniform等),我決定做個GLSL編譯器的前端(以后簡稱編譯器或FrontEndParser)。

以前我做過一個CGCompiler,可以自動生成LL(1)文法的編譯器代碼(C#語言的)。于是我從《The OpenGL ? Shading Language》(以下簡稱"PDF")找到一個GLSL的文法,就開始試圖將他改寫為LL(1)文法。等到我重寫了7次后發現,這是不可能的。GLSL的文法超出了LL(1)的范圍,必須用更強的分析算法。于是有了現在的LALR(1)Compiler。

理論來源

《現代編譯原理-c語言描述》(即"虎書")中提供了詳盡的資料。我就以虎書為理論依據。

虎書中的下圖表明了各種類型的文法的范圍。一般正常的程序語言都是符合LALR(1)文法的。

由于LR(0)是SLR的基礎,SLR是LR(1)的基礎;又由于LR(1)是LALR(1)的基礎(這看上去有點奇怪),所以我必須從LR(0)文法開始一步一步實現LALR(1)算法

輸入

給定文法,這個文法所描述的語言的全部信息就都包含進去了。文法里包含了這個語言的關鍵字、推導結構等所有信息。這也是我覺得YACC那些東西不好的地方:明明有了文法,還得自己整理出各種關鍵字。

下面是一個文法的例子:

1 // 虎書中的文法3-10 2 <S> ::= <V> "=" <E> ; 3 <S> ::= <E> ; 4 <E> ::= <V> ; 5 <V> ::= "x" ; 6 <V> ::= "*" <E> ;

下面是6個符合此文法的代碼:

1 x 2 *x 3 x = x 4 x = * x 5 *x = x 6 **x = **x

輸出

輸出結果是此文法的編譯器代碼(C#)。這主要是詞法分析器LexicalAnalyzer和語法分析器SyntaxParser兩個類。

之后利用C#的CSharpCodeProvider和反射技術來加載、編譯、運行生成的代碼,用一些例子(例如上面的*x = x)測試是否能正常運行。只要能正常生成語法樹,就證明了我的LALR(1)Compiler的實現是正確的。

例如對上述文法的6個示例代碼,LALR(1)Compiler可以分別dump出如下的語法樹:

1 (__S)[S][<S>] 2 └─(__E)[E][<E>] 3 └─(__V)[V][<V>] 4 └─(__xLeave__)[x][x] x 1 (__S)[S][<S>] 2 └─(__E)[E][<E>] 3 └─(__V)[V][<V>] 4 ├─(__starLeave__)[*]["*"] 5 └─(__E)[E][<E>] 6 └─(__V)[V][<V>] 7 └─(__xLeave__)[x][x] *x 1 (__S)[S][<S>] 2 ├─(__V)[V][<V>] 3 │ └─(__xLeave__)[x][x] 4 ├─(__equalLeave__)[=]["="] 5 └─(__E)[E][<E>] 6 └─(__V)[V][<V>] 7 └─(__xLeave__)[x][x] x = x 1 (__S)[S][<S>] 2 ├─(__V)[V][<V>] 3 │ └─(__xLeave__)[x][x] 4 ├─(__equalLeave__)[=]["="] 5 └─(__E)[E][<E>] 6 └─(__V)[V][<V>] 7 ├─(__starLeave__)[*]["*"] 8 └─(__E)[E][<E>] 9 └─(__V)[V][<V>] 10 └─(__xLeave__)[x][x] x = * x 1 (__S)[S][<S>] 2 ├─(__V)[V][<V>] 3 │ ├─(__starLeave__)[*]["*"] 4 │ └─(__E)[E][<E>] 5 │ └─(__V)[V][<V>] 6 │ └─(__xLeave__)[x][x] 7 ├─(__equalLeave__)[=]["="] 8 └─(__E)[E][<E>] 9 └─(__V)[V][<V>] 10 └─(__xLeave__)[x][x] *x = x 1 (__S)[S][<S>] 2 ├─(__V)[V][<V>] 3 │ ├─(__starLeave__)[*]["*"] 4 │ └─(__E)[E][<E>] 5 │ └─(__V)[V][<V>] 6 │ ├─(__starLeave__)[*]["*"] 7 │ └─(__E)[E][<E>] 8 │ └─(__V)[V][<V>] 9 │ └─(__xLeave__)[x][x] 10 ├─(__equalLeave__)[=]["="] 11 └─(__E)[E][<E>] 12 └─(__V)[V][<V>] 13 ├─(__starLeave__)[*]["*"] 14 └─(__E)[E][<E>] 15 └─(__V)[V][<V>] 16 ├─(__starLeave__)[*]["*"] 17 └─(__E)[E][<E>] 18 └─(__V)[V][<V>] 19 └─(__xLeave__)[x][x] **x = **x

能夠正確地導出這些結果,就說明整個庫是正確的。其實,只要能導出這些結果而不throw Exception(),就可以斷定結果是正確的了

計劃

所以我的開發步驟如下:

示例

虎書中已有了文法3-1(如下)的分析表和一個示例分析過程,所以先手工實現文法3-1的分析器。從這個分析器的代碼中抽取出所有LR分析器通用的部分,作為LALR(1)Compiler的一部分。

1 // 虎書中的文法3-1 2 <S> ::= <S> ";" <S> ; 3 <S> ::= identifier ":=" <E> ; 4 <S> ::= "print" "(" <L> ")" ; 5 <E> ::= identifier ; 6 <E> ::= number ; 7 <E> ::= <E> "+" <E> ; 8 <E> ::= "(" <S> "," <E> ")" ; 9 <L> ::= <E> ; 10 <L> ::= <L> "," <E> ;

算法

經此之后就對語法分析器的構成心中有數了。下面實現虎書中關于自動生成工具的算法。

最妙的是,即使開始時不理解這些算法的原理,也能夠實現之。實現后通過測試用例debug的過程,就很容易理解這些算法了。

LR(0)

首先有兩個基礎算法。Closure用于補全一個state。Goto用于找到一個state經過某個Node后會進入的下一個state。說是算法,其實卻非常簡單。雖然簡單,要想實現卻有很多額外的工作。例如比較兩個LR(0)Item的問題。

然后就是計算文法的狀態集邊集(Goto動作集)的算法。這個是核心內容。

用此算法可以畫出文法3-8的狀態圖如下:

1 // 虎書中的文法3-8 2 <S> ::= "(" <L> ")" ; 3 <S> ::= "x" ; 4 <L> ::= <S> ; 5 <L> ::= <L> "," <S> ;

最后就是看圖作文——構造分析表了。有了分析表,語法分析器的核心部分就完成了。

?

SLR

在A->α.可以被歸約時,只在下一個單詞是Follow(A)時才進行歸約。看起來很有道理的樣子。

LR(1)

LR(1)項(A->α.β,x)指出,序列α在棧頂,且輸入中開頭的是可以從βx導出的符號。看起來更有道理的樣子。

LR(1)的state補全和轉換算法也要調整。

然后又是看圖作文。

?

LALR(1)

LALR(1)是對LA(1)的化簡處理。他占用空間比LR(1)少,但應用范圍也比LR(1)小了點。

為了實現LALR(1),也為了提高LR(1)的效率,必須優化LR(1)State,不能再單純模仿LR(0)State了。

文法的文法

輸入的是文法,輸出的是編譯器代碼,這個過程也可以用一個編譯器來實現。這個特別的編譯器所對應的文法(即描述文法的文法)如下:(此編譯器命名為ContextfreeGrammarCompiler)

1 // 文法是1到多個產生式 2 <Grammar> ::= <ProductionList> <Production> ; 3 // 產生式列表是0到多個產生式 4 <ProductionList> ::= <ProductionList> <Production> | null ; 5 // 產生式是左部+第一個候選式+若干右部 6 <Production> ::= <Vn> "::=" <Canditate> <RightPartList> ";" ; 7 // 候選式是1到多個結點 8 <Canditate> ::= <VList> <V> ; 9 // 結點列表是0到多個結點 10 <VList> ::= <VList> <V> | null ; 11 // 右部列表是0到多個候選式 12 <RightPartList> ::= "|" <Canditate> <RightPartList> | null ; 13 // 結點是非葉結點或葉結點 14 <V> ::= <Vn> | <Vt> ; 15 // 非葉結點是<>括起來的標識符 16 <Vn> ::= "<" identifier ">" ; 17 // 葉結點是用"引起來的字符串常量或下列內容:null, identifier, number, constString, userDefinedType 18 // 這幾個標識符就是ContextfreeGrammar的關鍵字 19 <Vt> ::= "null" | "identifier" | "number" | "constString" | "userDefinedType"| constString ;

設計

算法看起來還是很簡單的。即使不理解他也能實現他。但是實現過程中還是出現了不少的問題。

Hash緩存

如何判定兩個對象(LR(0)Item)相同?

這是個不可小覷的問題。

必須重寫==、!=運算符,override掉Equals和GetHashCode方法。這樣才能判定兩個內容相同但不是同一個對象的Item、State相等。

對于LR(0)Item的比較,在計算過程中有太多次,這對于實際應用(例如GLSL的文法)是不可接受的。所以必須緩存這類對象的HashCode。

1 /// <summary> 2 /// 緩存一個對象的hash code。提高比較(==、!=、Equals、GetHashCode、Compare)的效率。 3 /// </summary> 4 public abstract class HashCache : IComparable<HashCache> 5 { 6 public static bool operator ==(HashCache left, HashCache right) 7 { 8 object leftObj = left, rightObj = right; 9 if (leftObj == null) 10 { 11 if (rightObj == null) { return true; } 12 else { return false; } 13 } 14 else 15 { 16 if (rightObj == null) { return false; } 17 } 18 19 return left.Equals(right); 20 } 21 22 public static bool operator !=(HashCache left, HashCache right) 23 { 24 return !(left == right); 25 } 26 27 public override bool Equals(object obj) 28 { 29 HashCache p = obj as HashCache; 30 if ((System.Object)p == null) 31 { 32 return false; 33 } 34 35 return this.HashCode == p.HashCode; 36 } 37 38 public override int GetHashCode() 39 { 40 return this.HashCode; 41 } 42 43 private Func<HashCache, string> GetUniqueString; 44 45 private bool dirty = true; 46 47 /// <summary> 48 /// 指明此cache需要更新才能用。 49 /// </summary> 50 public void SetDirty() { this.dirty = true; } 51 52 private int hashCode; 53 /// <summary> 54 /// hash值。 55 /// </summary> 56 public int HashCode 57 { 58 get 59 { 60 if (this.dirty) 61 { 62 Update(); 63 64 this.dirty = false; 65 } 66 67 return this.hashCode; 68 } 69 } 70 71 private void Update() 72 { 73 string str = GetUniqueString(this); 74 int hashCode = str.GetHashCode(); 75 this.hashCode = hashCode; 76 #if DEBUG 77 this.uniqueString = str;// debug時可以看到可讀的信息 78 #else 79 this.uniqueString = string.Format("[{0}]", hashCode);// release后用最少的內存區分此對象 80 #endif 81 } 82 83 // TODO: 功能穩定后應精簡此字段的內容。 84 /// <summary> 85 /// 功能穩定后應精簡此字段的內容。 86 /// </summary> 87 private string uniqueString = string.Empty; 88 89 /// <summary> 90 /// 可唯一標識該對象的字符串。 91 /// 功能穩定后應精簡此字段的內容。 92 /// </summary> 93 public string UniqueString 94 { 95 get 96 { 97 if (this.dirty) 98 { 99 Update(); 100 101 this.dirty = false; 102 } 103 104 return this.uniqueString; 105 } 106 } 107 108 /// <summary> 109 /// 緩存一個對象的hash code。提高比較(==、!=、Equals、GetHashCode、Compare)的效率。 110 /// </summary> 111 /// <param name="GetUniqueString">獲取一個可唯一標識此對象的字符串。</param> 112 public HashCache(Func<HashCache, string> GetUniqueString) 113 { 114 if (GetUniqueString == null) { throw new ArgumentNullException(); } 115 116 this.GetUniqueString = GetUniqueString; 117 } 118 119 public override string ToString() 120 { 121 return this.UniqueString; 122 } 123 124 public int CompareTo(HashCache other) 125 { 126 if (other == null) { return 1; } 127 128 if (this.HashCode < other.HashCode)// 如果用this.HashCode - other.HashCode < 0,就會發生溢出,這個bug讓我折騰了近8個小時。 129 { return -1; } 130 else if (this.HashCode == other.HashCode) 131 { return 0; } 132 else 133 { return 1; } 134 } 135 } HashCache

有序集合

如何判定兩個集合(LR(0)State)相同?

一個LR(0)State是一個集合,集合內部的元素是沒有先后順序的區別的。但是為了比較兩個State,其內部元素必須是有序的(這就可以用二分法進行插入和比較)。否則比較兩個State會耗費太多時間。為了盡可能快地比較State,也要緩存State的HashCode。

有序集合的應用廣泛,因此獨立成類。

1 /// <summary> 2 /// 經過優化的列表。插入新元素用二分法,速度更快,但使用者不能控制元素的位置。 3 /// 對于LALR(1)Compiler項目,只需支持“添加元素”的功能,所以我沒有寫修改和刪除元素的功能。 4 /// </summary> 5 /// <typeparam name="T">元素也要支持快速比較。</typeparam> 6 public class OrderedCollection<T> : 7 HashCache // 快速比較兩個OrderedCollection<T>是否相同。 8 , IEnumerable<T> // 可枚舉該集合的元素。 9 where T : HashCache // 元素也要支持快速比較。 10 { 11 private List<T> list = new List<T>(); 12 private string seperator = Environment.NewLine; 13 14 /// <summary> 15 /// 這是一個只能添加元素的集合,其元素是有序的,是按二分法插入的。 16 /// 但是使用者不能控制元素的順序。 17 /// </summary> 18 /// <param name="separator">在Dump到流時用什么分隔符分隔各個元素?</param> 19 public OrderedCollection(string separator) 20 : base(GetUniqueString) 21 { 22 this.seperator = separator; 23 } 24 25 private static string GetUniqueString(HashCache cache) 26 { 27 OrderedCollection<T> obj = cache as OrderedCollection<T>; 28 return obj.Dump(); 29 } 30 31 public virtual bool TryInsert(T item) 32 { 33 if (this.list.TryBinaryInsert(item)) 34 { 35 this.SetDirty(); 36 return true; 37 } 38 else 39 { 40 return false; 41 } 42 } 43 44 public int IndexOf(T item) 45 { 46 return this.list.BinarySearch(item); 47 } 48 49 public bool Contains(T item) 50 { 51 int index = this.list.BinarySearch(item); 52 return (0 <= index && index < this.list.Count); 53 } 54 55 public T this[int index] { get { return this.list[index]; } } 56 57 public IEnumerator<T> GetEnumerator() 58 { 59 foreach (var item in this.list) 60 { 61 yield return item; 62 } 63 } 64 65 public int Count { get { return this.list.Count; } } 66 67 System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 68 { 69 return this.GetEnumerator(); 70 } 71 72 public override void Dump(System.IO.TextWriter stream) 73 { 74 for (int i = 0; i < this.list.Count; i++) 75 { 76 this.list[i].Dump(stream); 77 if (i + 1 < this.list.Count) 78 { 79 stream.Write(this.seperator); 80 } 81 } 82 } 83 } OrderedCollection<T>

其中有個TryBinaryInsert的擴展方法,用于向?IList<T>?插入元素。這個方法我經過嚴格測試。如果有發現此方法的bug向我說明,我愿意獎勵¥100元。

1 /// <summary> 2 /// 嘗試插入新元素。如果存在相同的元素,就不插入,并返回false。否則返回true。 3 /// </summary> 4 /// <typeparam name="T"></typeparam> 5 /// <param name="list"></param> 6 /// <param name="item"></param> 7 /// <returns></returns> 8 public static bool TryBinaryInsert<T>(this List<T> list, T item) 9 where T : IComparable<T> 10 { 11 bool inserted = false; 12 13 if (list == null || item == null) { return inserted; } 14 15 int left = 0, right = list.Count - 1; 16 if (right < 0) 17 { 18 list.Add(item); 19 inserted = true; 20 } 21 else 22 { 23 while (left < right) 24 { 25 int mid = (left + right) / 2; 26 T current = list[mid]; 27 int result = item.CompareTo(current); 28 if (result < 0) 29 { right = mid; } 30 else if (result == 0) 31 { left = mid; right = mid; } 32 else 33 { left = mid + 1; } 34 } 35 { 36 T current = list[left]; 37 int result = item.CompareTo(current); 38 if (result < 0) 39 { 40 list.Insert(left, item); 41 inserted = true; 42 } 43 else if (result > 0) 44 { 45 list.Insert(left + 1, item); 46 inserted = true; 47 } 48 } 49 } 50 51 return inserted; 52 } TryBinaryInsert<T>(this IList<T> list, T item) where T : IComparable<T>

迭代到不動點

虎書中的算法大量使用了迭代到不動點的方式。

這個方法雖好,卻仍有可優化的余地。而且這屬于核心的計算過程,也應當優化。

優化方法也簡單,用一個Queue代替"迭代不動點"的方式即可。這就避免了很多不必要的重復計算。

1 /// <summary> 2 /// LR(0)的Closure操作。 3 /// 補全一個狀態。 4 /// </summary> 5 /// <param name="list"></param> 6 /// <param name="state"></param> 7 /// <returns></returns> 8 static LR0State Closure(this RegulationList list, LR0State state) 9 { 10 Queue<LR0Item> queue = new Queue<LR0Item>(); 11 foreach (var item in state) 12 { 13 queue.Enqueue(item); 14 } 15 while (queue.Count > 0) 16 { 17 LR0Item item = queue.Dequeue(); 18 TreeNodeType node = item.GetNodeNext2Dot(); 19 if (node == null) { continue; } 20 21 foreach (var regulation in list) 22 { 23 if (regulation.Left == node) 24 { 25 var newItem = new LR0Item(regulation, 0); 26 if (state.TryInsert(newItem)) 27 { 28 queue.Enqueue(newItem); 29 } 30 } 31 } 32 } 33 34 return state; 35 } Closure

測試

以前我總喜歡做個非常精致的GUI來測試。現在發現沒那個必要,簡單的Console就可以了。

詳細的測試結果導出到文件里,可以慢慢查看分析。

1 =====> Processing .\TestCases\3_8.Grammar\3_8.Grammar 2 Get grammar from source code... 3 Dump 3_8.TokenList.log 4 Dump 3_8.Tree.log 5 Dump 3_8.FormatedGrammar.log 6 Dump 3_8.FIRST.log 7 Dump 3_8.FOLLOW.log 8 LR(0) parsing... 9 Dump 3_8.State.log 10 Dump 3_8.Edge.log 11 Dump LR(0) Compiler's source code... 12 SLR parsing... 13 Dump 3_8.State.log 14 Dump 3_8.Edge.log 15 Dump SLR Compiler's source code... 16 LALR(1) parsing... 17 Dump 3_8.State.log 18 Dump 3_8.Edge.log 19 Dump LALR(1) Compiler's source code... 20 LR(1) parsing... 21 Dump 3_8.State.log 22 Dump 3_8.Edge.log 23 Dump LR(1) Compiler's source code... 24 Compiling 3_8 of LR(0) version 25 Test Code 3_8 of LR(0) version 26 Compiling 3_8 of SLR version 27 Test Code 3_8 of SLR version 28 Compiling 3_8 of LALR(1) version 29 Test Code 3_8 of LALR(1) version 30 Compiling 3_8 of LR(1) version 31 Test Code 3_8 of LR(1) version 32 =====> Processing .\TestCases\Demo.Grammar\Demo.Grammar 33 Get grammar from source code... 34 Dump Demo.TokenList.log 35 Dump Demo.Tree.log 36 Dump Demo.FormatedGrammar.log 37 Dump Demo.FIRST.log 38 Dump Demo.FOLLOW.log 39 LR(0) parsing... 40 Dump Demo.State.log 41 Dump Demo.Edge.log 42 Dump LR(0) Compiler's source code... 43 【Exists 5 Conflicts in Parsingmap】 44 SLR parsing... 45 Dump Demo.State.log 46 Dump Demo.Edge.log 47 Dump SLR Compiler's source code... 48 【Exists 2 Conflicts in Parsingmap】 49 LALR(1) parsing... 50 Dump Demo.State.log 51 Dump Demo.Edge.log 52 Dump LALR(1) Compiler's source code... 53 【Exists 2 Conflicts in Parsingmap】 54 LR(1) parsing... 55 Dump Demo.State.log 56 Dump Demo.Edge.log 57 Dump LR(1) Compiler's source code... 58 【Exists 6 Conflicts in Parsingmap】 59 Compiling Demo of LR(0) version 60 Test Code Demo of LR(0) version 61 No need to Test Code with conflicts in SyntaxParser 62 Compiling Demo of SLR version 63 Test Code Demo of SLR version 64 No need to Test Code with conflicts in SyntaxParser 65 Compiling Demo of LALR(1) version 66 Test Code Demo of LALR(1) version 67 No need to Test Code with conflicts in SyntaxParser 68 Compiling Demo of LR(1) version 69 Test Code Demo of LR(1) version 70 No need to Test Code with conflicts in SyntaxParser 71 =====> Processing .\TestCases\GLSL.Grammar\GLSL.Grammar 72 Get grammar from source code... 73 Dump GLSL.TokenList.log 74 Dump GLSL.Tree.log 75 Dump GLSL.FormatedGrammar.log 76 Dump GLSL.FIRST.log 77 Dump GLSL.FOLLOW.log 78 LR(0) parsing... Test.log

初戰GLSL

測試完成后,就可以磨刀霍霍向GLSL文法了。由于GLSL文法比那些測試用的文法規模大的多,最初的版本里,計算過程居然花了好幾個小時。最終出現內存不足的Exception,不得不進行優化。

書中給的GLSL文法也是比較奇葩。或許是有什么特別的門道我沒有看懂吧。總之要降低難度先。

思路是,把grammar拆分成幾個部分,分別處理。

首先是Expression,這是其他部分的基礎。Expression部分是符合SLR的,非常好。

然后是statement,statement里有個else懸空的問題,幸好虎書里專門對這個問題做了說明,說可以容忍這個沖突,直接選擇Shift,忽略Reduction即可。也非常好。

然后是function_definition,出乎意料的是這部分也是符合SLR的。Nice。

最后是declaration,這里遇到了意想不到的大麻煩。GLSL文法里有個<TYPE_NAME>。這個東西我研究了好久,最后發現他代表的含義竟然是"在讀取源代碼時動態發現的用戶定義的類型"。比如?struct LightInfo{ … }?,他代表的是?LightInfo?這種類型。如果簡單的用identifier代替<TYPE_NAME>,文法就會產生無法解決的沖突。

我只好就此打住,先去實現另一種更強的分析方式——同步分析。

同步分析

現在,我的詞法分析、語法分析是分開進行的。詞法分析全部完成后,才把單詞流交給語法分析器進行分析。為了及時識別出用戶自定義的類型,這種方式完全不行,必須用"分析一個單詞->語法分析->可能的語義分析->分析一個單詞"這樣的同步分析方式。例如下面的代碼:

1 struct LightInfo { 2 vec4 Position; // Light position in eyecoords. 3 vec3 La; // Ambient light intensity 4 vec3 Ld; // Diffuse light intensity 5 vec3 Ls; // Specular light intensity 6 }; 7 uniform LightInfo Light;

在讀到第二個單詞"LightInfo"后,就必須立即將這個"LightInfo"類型加到用戶自定義的類型表里。這樣,在繼續讀到"uniform LightInfo Light"里的"LightInfo"時,詞法分析器才會知道"LightInfo"是一個userDefinedType,而不是一個隨隨便便的identifier。(對照上文的文法的文法,可見為實現一個看似不起眼的userDefinedType需要做多少事)

前端分析器(FrontEndParser)

既然要同步解析了,那么詞法分析和語法分析就是結結實實綁在一起的過程,所有用個FrontEndParser封裝一下就很有必要。其中的UserDefinedTypeCollection就用來記錄用戶自定義的類型。

1 /// <summary> 2 /// 前端分析器。 3 /// 詞法分析、語法分析、語義動作同步進行。 4 /// </summary> 5 public class FrontEndParser 6 { 7 private LexicalAnalyzer lexicalAnalyzer; 8 private LRSyntaxParser syntaxParser; 9 10 public FrontEndParser(LexicalAnalyzer lexicalAnalyzer, LRSyntaxParser syntaxParser) 11 { 12 this.lexicalAnalyzer = lexicalAnalyzer; 13 this.syntaxParser = syntaxParser; 14 } 15 16 /// <summary> 17 /// 詞法分析、語法分析、語義動作同步進行。 18 /// </summary> 19 /// <param name="sourceCode"></param> 20 /// <param name="tokenList"></param> 21 /// <returns></returns> 22 public SyntaxTree Parse(string sourceCode, out TokenList tokenList) 23 { 24 tokenList = new TokenList(); 25 UserDefinedTypeCollection userDefinedTypeTable = new UserDefinedTypeCollection(); 26 this.lexicalAnalyzer.StartAnalyzing(userDefinedTypeTable); 27 this.syntaxParser.StartParsing(userDefinedTypeTable); 28 foreach (var token in this.lexicalAnalyzer.AnalyzeStep(sourceCode)) 29 { 30 tokenList.Add(token); 31 this.syntaxParser.ParseStep(token); 32 } 33 34 SyntaxTree result = this.syntaxParser.StopParsing(); 35 return result; 36 } 37 }

同步詞法分析

詞法分析器需要每讀取一個單詞就返回之,等待語法分析、語義分析結束后再繼續。C#的?yield return?語法糖真是甜。

1 public abstract partial class LexicalAnalyzer 2 { 3 protected UserDefinedTypeCollection userDefinedTypeTable; 4 private bool inAnalyzingStep = false; 5 6 internal void StartAnalyzing(UserDefinedTypeCollection userDefinedTypeTable) 7 { 8 if (!inAnalyzingStep) 9 { 10 this.userDefinedTypeTable = userDefinedTypeTable; 11 inAnalyzingStep = true; 12 } 13 } 14 15 internal void StopAnalyzing() 16 { 17 if (inAnalyzingStep) 18 { 19 this.userDefinedTypeTable = null; 20 inAnalyzingStep = false; 21 } 22 } 23 24 /// <summary> 25 /// 每次分析都返回一個<see cref="Token"/>26 /// </summary> 27 /// <param name="sourceCode"></param> 28 /// <returns></returns> 29 internal IEnumerable<Token> AnalyzeStep(string sourceCode) 30 { 31 if (!inAnalyzingStep) { throw new Exception("Must invoke this.StartAnalyzing() first!"); } 32 33 if (!string.IsNullOrEmpty(sourceCode)) 34 { 35 var context = new AnalyzingContext(sourceCode); 36 int count = sourceCode.Length; 37 38 while (context.NextLetterIndex < count) 39 { 40 Token token = NextToken(context); 41 if (token != null) 42 { 43 yield return token; 44 } 45 } 46 } 47 48 this.StopAnalyzing(); 49 } 50 } 同步詞法分析

同步語法/語義分析

每次只獲取一個新單詞,據此執行可能的分析步驟。如果分析動作還綁定了語義分析(這里是為了找到自定義類型),也執行之。

1 public abstract partial class LRSyntaxParser 2 { 3 bool inParsingStep = false; 4 ParsingStepContext parsingStepContext; 5 6 internal void StartParsing(UserDefinedTypeCollection userDefinedTypeTable) 7 { 8 if (!inParsingStep) 9 { 10 LRParsingMap parsingMap = GetParsingMap(); 11 RegulationList grammar = GetGrammar(); 12 var tokenTypeConvertor = new TokenType2TreeNodeType(); 13 parsingStepContext = new ParsingStepContext( 14 grammar, parsingMap, tokenTypeConvertor, userDefinedTypeTable); 15 inParsingStep = true; 16 } 17 } 18 19 internal SyntaxTree StopParsing() 20 { 21 SyntaxTree result = null; 22 if (inParsingStep) 23 { 24 result = ParseStep(Token.endOfTokenList); 25 parsingStepContext.TokenList.RemoveAt(parsingStepContext.TokenList.Count - 1); 26 parsingStepContext = null; 27 inParsingStep = false; 28 } 29 30 return result; 31 } 32 /// <summary> 33 /// 獲取歸約動作對應的語義動作。 34 /// </summary> 35 /// <param name="parsingAction"></param> 36 /// <returns></returns> 37 protected virtual Action<ParsingStepContext> GetSemanticAction(LRParsingAction parsingAction) 38 { 39 return null; 40 } 41 42 internal SyntaxTree ParseStep(Token token) 43 { 44 if (!inParsingStep) { throw new Exception("Must invoke this.StartParsing() first!"); } 45 46 parsingStepContext.AddToken(token); 47 48 while (parsingStepContext.CurrentTokenIndex < parsingStepContext.TokenList.Count) 49 { 50 // 語法分析 51 TreeNodeType nodeType = parsingStepContext.CurrentNodeType(); 52 int stateId = parsingStepContext.StateIdStack.Peek(); 53 LRParsingAction action = parsingStepContext.ParsingMap.GetAction(stateId, nodeType); 54 int currentTokenIndex = action.Execute(parsingStepContext); 55 parsingStepContext.CurrentTokenIndex = currentTokenIndex; 56 // 語義分析 57 Action<ParsingStepContext> semanticAction = GetSemanticAction(action); 58 if (semanticAction != null) 59 { 60 semanticAction(parsingStepContext); 61 } 62 } 63 64 if (parsingStepContext.TreeStack.Count > 0) 65 { 66 return parsingStepContext.TreeStack.Peek(); 67 } 68 else 69 { 70 return new SyntaxTree(); 71 } 72 } 73 } 同步語法/語義分析

再戰GLSL

此時武器終于齊備。

文法->解析器

為下面的GLSL文法生成解析器,我的筆記本花費大概10分鐘左右。

1 <translation_unit> ::= <external_declaration> ; 2 <translation_unit> ::= <translation_unit> <external_declaration> ; 3 <external_declaration> ::= <function_definition> ; 4 <external_declaration> ::= <declaration> ; 5 <function_definition> ::= <function_prototype> <compound_statement_no_new_scope> ; 6 <variable_identifier> ::= identifier ; 7 <primary_expression> ::= <variable_identifier> ; 8 <primary_expression> ::= number ; 9 <primary_expression> ::= number ; 10 <primary_expression> ::= number ; 11 <primary_expression> ::= <BOOLCONSTANT> ; 12 <primary_expression> ::= number ; 13 <primary_expression> ::= "(" <expression> ")" ; 14 <BOOLCONSTANT> ::= "true" ; 15 <BOOLCONSTANT> ::= "false" ; 16 <postfix_expression> ::= <primary_expression> ; 17 <postfix_expression> ::= <postfix_expression> "[" <integer_expression> "]" ; 18 <postfix_expression> ::= <function_call> ; 19 <postfix_expression> ::= <postfix_expression> "." <FIELD_SELECTION> ; 20 <postfix_expression> ::= <postfix_expression> "++" ; 21 <postfix_expression> ::= <postfix_expression> "--" ; 22 <FIELD_SELECTION> ::= identifier ; 23 <integer_expression> ::= <expression> ; 24 <function_call> ::= <function_call_or_method> ; 25 <function_call_or_method> ::= <function_call_generic> ; 26 <function_call_generic> ::= <function_call_header_with_parameters> ")" ; 27 <function_call_generic> ::= <function_call_header_no_parameters> ")" ; 28 <function_call_header_no_parameters> ::= <function_call_header> "void" ; 29 <function_call_header_no_parameters> ::= <function_call_header> ; 30 <function_call_header_with_parameters> ::= <function_call_header> <assignment_expression> ; 31 <function_call_header_with_parameters> ::= <function_call_header_with_parameters> "," <assignment_expression> ; 32 <function_call_header> ::= <function_identifier> "(" ; 33 <function_identifier> ::= <type_specifier> ; 34 <function_identifier> ::= <postfix_expression> ; 35 <unary_expression> ::= <postfix_expression> ; 36 <unary_expression> ::= "++" <unary_expression> ; 37 <unary_expression> ::= "--" <unary_expression> ; 38 <unary_expression> ::= <unary_operator> <unary_expression> ; 39 <unary_operator> ::= "+" ; 40 <unary_operator> ::= "-" ; 41 <unary_operator> ::= "!" ; 42 <unary_operator> ::= "~" ; 43 <multiplicative_expression> ::= <unary_expression> ; 44 <multiplicative_expression> ::= <multiplicative_expression> "*" <unary_expression> ; 45 <multiplicative_expression> ::= <multiplicative_expression> "/" <unary_expression> ; 46 <multiplicative_expression> ::= <multiplicative_expression> "%" <unary_expression> ; 47 <additive_expression> ::= <multiplicative_expression> ; 48 <additive_expression> ::= <additive_expression> "+" <multiplicative_expression> ; 49 <additive_expression> ::= <additive_expression> "-" <multiplicative_expression> ; 50 <shift_expression> ::= <additive_expression> ; 51 <shift_expression> ::= <shift_expression> "<<" <additive_expression> ; 52 <shift_expression> ::= <shift_expression> ">>" <additive_expression> ; 53 <relational_expression> ::= <shift_expression> ; 54 <relational_expression> ::= <relational_expression> "<" <shift_expression> ; 55 <relational_expression> ::= <relational_expression> ">" <shift_expression> ; 56 <relational_expression> ::= <relational_expression> "<=" <shift_expression> ; 57 <relational_expression> ::= <relational_expression> ">=" <shift_expression> ; 58 <equality_expression> ::= <relational_expression> ; 59 <equality_expression> ::= <equality_expression> "==" <relational_expression> ; 60 <equality_expression> ::= <equality_expression> "!=" <relational_expression> ; 61 <and_expression> ::= <equality_expression> ; 62 <and_expression> ::= <and_expression> "&" <equality_expression> ; 63 <exclusive_or_expression> ::= <and_expression> ; 64 <exclusive_or_expression> ::= <exclusive_or_expression> "^" <and_expression> ; 65 <inclusive_or_expression> ::= <exclusive_or_expression> ; 66 <inclusive_or_expression> ::= <inclusive_or_expression> "|" <exclusive_or_expression> ; 67 <logical_and_expression> ::= <inclusive_or_expression> ; 68 <logical_and_expression> ::= <logical_and_expression> "&&" <inclusive_or_expression> ; 69 <logical_xor_expression> ::= <logical_and_expression> ; 70 <logical_xor_expression> ::= <logical_xor_expression> "^^" <logical_and_expression> ; 71 <logical_or_expression> ::= <logical_xor_expression> ; 72 <logical_or_expression> ::= <logical_or_expression> "||" <logical_xor_expression> ; 73 <conditional_expression> ::= <logical_or_expression> ; 74 <conditional_expression> ::= <logical_or_expression> "?" <expression> ":" <assignment_expression> ; 75 <assignment_expression> ::= <conditional_expression> ; 76 <assignment_expression> ::= <unary_expression> <assignment_operator> <assignment_expression> ; 77 <assignment_operator> ::= "=" ; 78 <assignment_operator> ::= "*=" ; 79 <assignment_operator> ::= "/=" ; 80 <assignment_operator> ::= "%=" ; 81 <assignment_operator> ::= "+=" ; 82 <assignment_operator> ::= "-=" ; 83 <assignment_operator> ::= "<<=" ; 84 <assignment_operator> ::= ">>=" ; 85 <assignment_operator> ::= "&=" ; 86 <assignment_operator> ::= "^=" ; 87 <assignment_operator> ::= "|=" ; 88 <expression> ::= <assignment_expression> ; 89 <expression> ::= <expression> "," <assignment_expression> ; 90 <constant_expression> ::= <conditional_expression> ; 91 <declaration> ::= <function_prototype> ";" ; 92 <declaration> ::= <init_declarator_list> ";" ; 93 <declaration> ::= "precision" <precision_qualifier> <type_specifier> ";" ; 94 <declaration> ::= <type_qualifier> identifier "{" <struct_declaration_list> "}" ";" ; 95 <declaration> ::= <type_qualifier> identifier "{" <struct_declaration_list> "}" identifier ";" ; 96 <declaration> ::= <type_qualifier> identifier "{" <struct_declaration_list> "}" identifier <array_specifier> ";" ; 97 <declaration> ::= <type_qualifier> ";" ; 98 <declaration> ::= <type_qualifier> identifier ";" ; 99 <declaration> ::= <type_qualifier> identifier <identifier_list> ";" ; 100 <identifier_list> ::= "," identifier ; 101 <identifier_list> ::= <identifier_list> "," identifier ; 102 <function_prototype> ::= <function_declarator> ")" ; 103 <function_declarator> ::= <function_header> ; 104 <function_declarator> ::= <function_header_with_parameters> ; 105 <function_header_with_parameters> ::= <function_header> <parameter_declaration> ; 106 <function_header_with_parameters> ::= <function_header_with_parameters> "," <parameter_declaration> ; 107 <function_header> ::= <fully_specified_type> identifier "(" ; 108 <parameter_declarator> ::= <type_specifier> identifier ; 109 <parameter_declarator> ::= <type_specifier> identifier <array_specifier> ; 110 <parameter_declaration> ::= <type_qualifier> <parameter_declarator> ; 111 <parameter_declaration> ::= <parameter_declarator> ; 112 <parameter_declaration> ::= <type_qualifier> <parameter_type_specifier> ; 113 <parameter_declaration> ::= <parameter_type_specifier> ; 114 <parameter_type_specifier> ::= <type_specifier> ; 115 <init_declarator_list> ::= <single_declaration> ; 116 <init_declarator_list> ::= <init_declarator_list> "," identifier ; 117 <init_declarator_list> ::= <init_declarator_list> "," identifier <array_specifier> ; 118 <init_declarator_list> ::= <init_declarator_list> "," identifier <array_specifier> "=" <initializer> ; 119 <init_declarator_list> ::= <init_declarator_list> "," identifier "=" <initializer> ; 120 <single_declaration> ::= <fully_specified_type> ; 121 <single_declaration> ::= <fully_specified_type> identifier ; 122 <single_declaration> ::= <fully_specified_type> identifier <array_specifier> ; 123 <single_declaration> ::= <fully_specified_type> identifier <array_specifier> "=" <initializer> ; 124 <single_declaration> ::= <fully_specified_type> identifier "=" <initializer> ; 125 <fully_specified_type> ::= <type_specifier> ; 126 <fully_specified_type> ::= <type_qualifier> <type_specifier> ; 127 <invariant_qualifier> ::= "invariant" ; 128 <interpolation_qualifier> ::= "smooth" ; 129 <interpolation_qualifier> ::= "flat" ; 130 <interpolation_qualifier> ::= "noperspective" ; 131 <layout_qualifier> ::= "layout" "(" <layout_qualifier_id_list> ")" ; 132 <layout_qualifier_id_list> ::= <layout_qualifier_id> ; 133 <layout_qualifier_id_list> ::= <layout_qualifier_id_list> "," <layout_qualifier_id> ; 134 <layout_qualifier_id> ::= identifier ; 135 <layout_qualifier_id> ::= identifier "=" number ; 136 <precise_qualifier> ::= "precise" ; 137 <type_qualifier> ::= <single_type_qualifier> ; 138 <type_qualifier> ::= <type_qualifier> <single_type_qualifier> ; 139 <single_type_qualifier> ::= <storage_qualifier> ; 140 <single_type_qualifier> ::= <layout_qualifier> ; 141 <single_type_qualifier> ::= <precision_qualifier> ; 142 <single_type_qualifier> ::= <interpolation_qualifier> ; 143 <single_type_qualifier> ::= <invariant_qualifier> ; 144 <single_type_qualifier> ::= <precise_qualifier> ; 145 <storage_qualifier> ::= "const" ; 146 <storage_qualifier> ::= "inout" ; 147 <storage_qualifier> ::= "in" ; 148 <storage_qualifier> ::= "out" ; 149 <storage_qualifier> ::= "centroid" ; 150 <storage_qualifier> ::= "patch" ; 151 <storage_qualifier> ::= "sample" ; 152 <storage_qualifier> ::= "uniform" ; 153 <storage_qualifier> ::= "buffer" ; 154 <storage_qualifier> ::= "shared" ; 155 <storage_qualifier> ::= "coherent" ; 156 <storage_qualifier> ::= "volatile" ; 157 <storage_qualifier> ::= "restrict" ; 158 <storage_qualifier> ::= "readonly" ; 159 <storage_qualifier> ::= "writeonly" ; 160 <storage_qualifier> ::= "subroutine" ; 161 <storage_qualifier> ::= "subroutine" "(" <type_name_list> ")" ; 162 <type_name_list> ::= userDefinedType ; 163 <type_name_list> ::= <type_name_list> "," userDefinedType ; 164 <type_specifier> ::= <type_specifier_nonarray> ; 165 <type_specifier> ::= <type_specifier_nonarray> <array_specifier> ; 166 <array_specifier> ::= "[" "]" ; 167 <array_specifier> ::= "[" <constant_expression> "]" ; 168 <array_specifier> ::= <array_specifier> "[" "]" ; 169 <array_specifier> ::= <array_specifier> "[" <constant_expression> "]" ; 170 <type_specifier_nonarray> ::= "void" ; 171 <type_specifier_nonarray> ::= "float" ; 172 <type_specifier_nonarray> ::= "double" ; 173 <type_specifier_nonarray> ::= "int" ; 174 <type_specifier_nonarray> ::= "uint" ; 175 <type_specifier_nonarray> ::= "bool" ; 176 <type_specifier_nonarray> ::= "vec2" ; 177 <type_specifier_nonarray> ::= "vec3" ; 178 <type_specifier_nonarray> ::= "vec4" ; 179 <type_specifier_nonarray> ::= "dvec2" ; 180 <type_specifier_nonarray> ::= "dvec3" ; 181 <type_specifier_nonarray> ::= "dvec4" ; 182 <type_specifier_nonarray> ::= "bvec2" ; 183 <type_specifier_nonarray> ::= "bvec3" ; 184 <type_specifier_nonarray> ::= "bvec4" ; 185 <type_specifier_nonarray> ::= "ivec2" ; 186 <type_specifier_nonarray> ::= "ivec3" ; 187 <type_specifier_nonarray> ::= "ivec4" ; 188 <type_specifier_nonarray> ::= "uvec2" ; 189 <type_specifier_nonarray> ::= "uvec3" ; 190 <type_specifier_nonarray> ::= "uvec4" ; 191 <type_specifier_nonarray> ::= "mat2" ; 192 <type_specifier_nonarray> ::= "mat3" ; 193 <type_specifier_nonarray> ::= "mat4" ; 194 <type_specifier_nonarray> ::= "mat2x2" ; 195 <type_specifier_nonarray> ::= "mat2x3" ; 196 <type_specifier_nonarray> ::= "mat2x4" ; 197 <type_specifier_nonarray> ::= "mat3x2" ; 198 <type_specifier_nonarray> ::= "mat3x3" ; 199 <type_specifier_nonarray> ::= "mat3x4" ; 200 <type_specifier_nonarray> ::= "mat4x2" ; 201 <type_specifier_nonarray> ::= "mat4x3" ; 202 <type_specifier_nonarray> ::= "mat4x4" ; 203 <type_specifier_nonarray> ::= "dmat2" ; 204 <type_specifier_nonarray> ::= "dmat3" ; 205 <type_specifier_nonarray> ::= "dmat4" ; 206 <type_specifier_nonarray> ::= "dmat2x2" ; 207 <type_specifier_nonarray> ::= "dmat2x3" ; 208 <type_specifier_nonarray> ::= "dmat2x4" ; 209 <type_specifier_nonarray> ::= "dmat3x2" ; 210 <type_specifier_nonarray> ::= "dmat3x3" ; 211 <type_specifier_nonarray> ::= "dmat3x4" ; 212 <type_specifier_nonarray> ::= "dmat4x2" ; 213 <type_specifier_nonarray> ::= "dmat4x3" ; 214 <type_specifier_nonarray> ::= "dmat4x4" ; 215 <type_specifier_nonarray> ::= "atomic_uint" ; 216 <type_specifier_nonarray> ::= "sampler1D" ; 217 <type_specifier_nonarray> ::= "sampler2D" ; 218 <type_specifier_nonarray> ::= "sampler3D" ; 219 <type_specifier_nonarray> ::= "samplerCube" ; 220 <type_specifier_nonarray> ::= "sampler1DShadow" ; 221 <type_specifier_nonarray> ::= "sampler2DShadow" ; 222 <type_specifier_nonarray> ::= "samplerCubeShadow" ; 223 <type_specifier_nonarray> ::= "sampler1DArray" ; 224 <type_specifier_nonarray> ::= "sampler2DArray" ; 225 <type_specifier_nonarray> ::= "sampler1DArrayShadow" ; 226 <type_specifier_nonarray> ::= "sampler2DArrayShadow" ; 227 <type_specifier_nonarray> ::= "samplerCubeArray" ; 228 <type_specifier_nonarray> ::= "samplerCubeArrayShadow" ; 229 <type_specifier_nonarray> ::= "isampler1D" ; 230 <type_specifier_nonarray> ::= "isampler2D" ; 231 <type_specifier_nonarray> ::= "isampler3D" ; 232 <type_specifier_nonarray> ::= "isamplerCube" ; 233 <type_specifier_nonarray> ::= "isampler1DArray" ; 234 <type_specifier_nonarray> ::= "isampler2DArray" ; 235 <type_specifier_nonarray> ::= "isamplerCubeArray" ; 236 <type_specifier_nonarray> ::= "usampler1D" ; 237 <type_specifier_nonarray> ::= "usampler2D" ; 238 <type_specifier_nonarray> ::= "usampler3D" ; 239 <type_specifier_nonarray> ::= "usamplerCube" ; 240 <type_specifier_nonarray> ::= "usampler1DArray" ; 241 <type_specifier_nonarray> ::= "usampler2DArray" ; 242 <type_specifier_nonarray> ::= "usamplerCubeArray" ; 243 <type_specifier_nonarray> ::= "sampler2DRect" ; 244 <type_specifier_nonarray> ::= "sampler2DRectShadow" ; 245 <type_specifier_nonarray> ::= "isampler2DRect" ; 246 <type_specifier_nonarray> ::= "usampler2DRect" ; 247 <type_specifier_nonarray> ::= "samplerBuffer" ; 248 <type_specifier_nonarray> ::= "isamplerBuffer" ; 249 <type_specifier_nonarray> ::= "usamplerBuffer" ; 250 <type_specifier_nonarray> ::= "sampler2DMS" ; 251 <type_specifier_nonarray> ::= "isampler2DMS" ; 252 <type_specifier_nonarray> ::= "usampler2DMS" ; 253 <type_specifier_nonarray> ::= "sampler2DMSArray" ; 254 <type_specifier_nonarray> ::= "isampler2DMSArray" ; 255 <type_specifier_nonarray> ::= "usampler2DMSArray" ; 256 <type_specifier_nonarray> ::= "image1D" ; 257 <type_specifier_nonarray> ::= "iimage1D" ; 258 <type_specifier_nonarray> ::= "uimage1D" ; 259 <type_specifier_nonarray> ::= "image2D" ; 260 <type_specifier_nonarray> ::= "iimage2D" ; 261 <type_specifier_nonarray> ::= "uimage2D" ; 262 <type_specifier_nonarray> ::= "image3D" ; 263 <type_specifier_nonarray> ::= "iimage3D" ; 264 <type_specifier_nonarray> ::= "uimage3D" ; 265 <type_specifier_nonarray> ::= "image2DRect" ; 266 <type_specifier_nonarray> ::= "iimage2DRect" ; 267 <type_specifier_nonarray> ::= "uimage2DRect" ; 268 <type_specifier_nonarray> ::= "imageCube" ; 269 <type_specifier_nonarray> ::= "iimageCube" ; 270 <type_specifier_nonarray> ::= "uimageCube" ; 271 <type_specifier_nonarray> ::= "imageBuffer" ; 272 <type_specifier_nonarray> ::= "iimageBuffer" ; 273 <type_specifier_nonarray> ::= "uimageBuffer" ; 274 <type_specifier_nonarray> ::= "image1DArray" ; 275 <type_specifier_nonarray> ::= "iimage1DArray" ; 276 <type_specifier_nonarray> ::= "uimage1DArray" ; 277 <type_specifier_nonarray> ::= "image2DArray" ; 278 <type_specifier_nonarray> ::= "iimage2DArray" ; 279 <type_specifier_nonarray> ::= "uimage2DArray" ; 280 <type_specifier_nonarray> ::= "imageCubeArray" ; 281 <type_specifier_nonarray> ::= "iimageCubeArray" ; 282 <type_specifier_nonarray> ::= "uimageCubeArray" ; 283 <type_specifier_nonarray> ::= "image2DMS" ; 284 <type_specifier_nonarray> ::= "iimage2DMS" ; 285 <type_specifier_nonarray> ::= "uimage2DMS" ; 286 <type_specifier_nonarray> ::= "image2DMSArray" ; 287 <type_specifier_nonarray> ::= "iimage2DMSArray" ; 288 <type_specifier_nonarray> ::= "uimage2DMSArray" ; 289 <type_specifier_nonarray> ::= <struct_specifier> ; 290 <type_specifier_nonarray> ::= userDefinedType ; 291 <precision_qualifier> ::= "high_precision" ; 292 <precision_qualifier> ::= "medium_precision" ; 293 <precision_qualifier> ::= "low_precision" ; 294 // semantic parsing needed 295 <struct_specifier> ::= "struct" identifier "{" <struct_declaration_list> "}" ; 296 <struct_specifier> ::= "struct" "{" <struct_declaration_list> "}" ; 297 <struct_declaration_list> ::= <struct_declaration> ; 298 <struct_declaration_list> ::= <struct_declaration_list> <struct_declaration> ; 299 <struct_declaration> ::= <type_specifier> <struct_declarator_list> ";" ; 300 <struct_declaration> ::= <type_qualifier> <type_specifier> <struct_declarator_list> ";" ; 301 <struct_declarator_list> ::= <struct_declarator> ; 302 <struct_declarator_list> ::= <struct_declarator_list> "," <struct_declarator> ; 303 <struct_declarator> ::= identifier ; 304 <struct_declarator> ::= identifier <array_specifier> ; 305 <initializer> ::= <assignment_expression> ; 306 <initializer> ::= "{" <initializer_list> "}" ; 307 <initializer> ::= "{" <initializer_list> "," "}" ; 308 <initializer_list> ::= <initializer> ; 309 <initializer_list> ::= <initializer_list> "," <initializer> ; 310 <declaration_statement> ::= <declaration> ; 311 <statement> ::= <compound_statement> ; 312 <statement> ::= <simple_statement> ; 313 <simple_statement> ::= <declaration_statement> ; 314 <simple_statement> ::= <expression_statement> ; 315 <simple_statement> ::= <selection_statement> ; 316 <simple_statement> ::= <switch_statement> ; 317 <simple_statement> ::= <case_label> ; 318 <simple_statement> ::= <iteration_statement> ; 319 <simple_statement> ::= <jump_statement> ; 320 <compound_statement> ::= "{" "}" ; 321 <compound_statement> ::= "{" <statement_list> "}" ; 322 <statement_no_new_scope> ::= <compound_statement_no_new_scope> ; 323 <statement_no_new_scope> ::= <simple_statement> ; 324 <compound_statement_no_new_scope> ::= "{" "}" ; 325 <compound_statement_no_new_scope> ::= "{" <statement_list> "}" ; 326 <statement_list> ::= <statement> ; 327 <statement_list> ::= <statement_list> <statement> ; 328 <expression_statement> ::= ";" ; 329 <expression_statement> ::= <expression> ";" ; 330 <selection_statement> ::= "if" "(" <expression> ")" <selection_rest_statement> ; 331 <selection_rest_statement> ::= <statement> "else" <statement> ; 332 <selection_rest_statement> ::= <statement> ; 333 <condition> ::= <expression> ; 334 <condition> ::= <fully_specified_type> identifier "=" <initializer> ; 335 <switch_statement> ::= "switch" "(" <expression> ")" "{" <switch_statement_list> "}" ; 336 <switch_statement_list> ::= <statement_list> ; 337 <case_label> ::= "case" <expression> ":" ; 338 <case_label> ::= "default" ":" ; 339 <iteration_statement> ::= "while" "(" <condition> ")" <statement_no_new_scope> ; 340 <iteration_statement> ::= "do" <statement> "while" "(" <expression> ")" ";" ; 341 <iteration_statement> ::= "for" "(" <for_init_statement> <for_rest_statement> ")" <statement_no_new_scope> ; 342 <for_init_statement> ::= <expression_statement> ; 343 <for_init_statement> ::= <declaration_statement> ; 344 <conditionopt> ::= <condition> ; 345 <for_rest_statement> ::= <conditionopt> ";" ; 346 <for_rest_statement> ::= <conditionopt> ";" <expression> ; 347 <jump_statement> ::= "continue" ";" ; 348 <jump_statement> ::= "break" ";" ; 349 <jump_statement> ::= "return" ";" ; 350 <jump_statement> ::= "return" <expression> ";" ; 351 <jump_statement> ::= "discard" ";" ; GLSL.Grammar

補充語義分析片段

語義分析是不能自動生成的。此時需要的語義分析,只有找到自定義類型這一個目的。

在GLSL文法里,是下面這個state需要進行語義分析。此時,分析器剛剛讀到用戶自定義的類型名字(identifier)。

1 State [172]: 2 <struct_specifier> ::= "struct" identifier . "{" <struct_declaration_list> "}" ;, identifier "," ")" "(" ";" "["

語義分析動作內容則十分簡單,將identifier的內容作為自定義類型名加入UserDefinedTypeTable即可。

1 // State [172]: 2 // <struct_specifier> ::= "struct" identifier . "{" <struct_declaration_list> "}" ;, identifier "," ")" "(" ";" "[" 3 static void state172_struct_specifier(ParsingStepContext context) 4 { 5 SyntaxTree tree = context.TreeStack.Peek(); 6 string name = tree.NodeType.Content; 7 context.UserDefinedTypeTable.TryInsert(new UserDefinedType(name)); 8 }

當然,別忘了在初始化時將此動作綁定到對應的state上。

1 static GLSLSyntaxParser() 2 { 3 // 將語義動作綁定的到state上。 4 dict.Add(new LR1ShiftInAction(172), state172_struct_specifier); 5 } 6 static Dictionary<LRParsingAction, Action<ParsingStepContext>> dict = 7 new Dictionary<LRParsingAction, Action<ParsingStepContext>>(); 8 9 protected override Action<ParsingStepContext> GetSemanticAction(LRParsingAction parsingAction) 10 { 11 Action<ParsingStepContext> semanticAction = null; 12 if (dict.TryGetValue(parsingAction, out semanticAction)) 13 { 14 return semanticAction; 15 } 16 else 17 { 18 return null; 19 } 20 }

userDefinedType

下面是上文的LightInfo代碼片段的詞法分析結果。請注意在定義LightInfo時,他是個identifier,定義之后,就是一個userDefinedType類型的單詞了。

1 TokenList[Count: 21] 2 [[struct](__struct)[struct]]$[Ln:1, Col:1] 3 [[LightInfo](identifier)[LightInfo]]$[Ln:1, Col:8] 4 [[{](__left_brace)["{"]]$[Ln:1, Col:18] 5 [[vec4](__vec4)[vec4]]$[Ln:2, Col:5] 6 [[Position](identifier)[Position]]$[Ln:2, Col:10] 7 [[;](__semicolon)[";"]]$[Ln:2, Col:18] 8 [[vec3](__vec3)[vec3]]$[Ln:3, Col:5] 9 [[La](identifier)[La]]$[Ln:3, Col:10] 10 [[;](__semicolon)[";"]]$[Ln:3, Col:12] 11 [[vec3](__vec3)[vec3]]$[Ln:4, Col:5] 12 [[Ld](identifier)[Ld]]$[Ln:4, Col:10] 13 [[;](__semicolon)[";"]]$[Ln:4, Col:12] 14 [[vec3](__vec3)[vec3]]$[Ln:5, Col:5] 15 [[Ls](identifier)[Ls]]$[Ln:5, Col:10] 16 [[;](__semicolon)[";"]]$[Ln:5, Col:12] 17 [[}](__right_brace)["}"]]$[Ln:6, Col:1] 18 [[;](__semicolon)[";"]]$[Ln:6, Col:2] 19 [[uniform](__uniform)[uniform]]$[Ln:7, Col:1] 20 [[LightInfo](__userDefinedType)[LightInfo]]$[Ln:7, Col:9] 21 [[Light](identifier)[Light]]$[Ln:7, Col:19] 22 [[;](__semicolon)[";"]]$[Ln:7, Col:24]

下面是LightInfo片段的語法樹。你可以看到單詞的類型對照著葉結點的類型。

1 (__translation_unit)[<translation_unit>][translation_unit] 2 ├─(__translation_unit)[<translation_unit>][translation_unit] 3 │ └─(__external_declaration)[<external_declaration>][external_declaration] 4 │ └─(__declaration)[<declaration>][declaration] 5 │ ├─(__init_declarator_list)[<init_declarator_list>][init_declarator_list] 6 │ │ └─(__single_declaration)[<single_declaration>][single_declaration] 7 │ │ └─(__fully_specified_type)[<fully_specified_type>][fully_specified_type] 8 │ │ └─(__type_specifier)[<type_specifier>][type_specifier] 9 │ │ └─(__type_specifier_nonarray)[<type_specifier_nonarray>][type_specifier_nonarray] 10 │ │ └─(__struct_specifier)[<struct_specifier>][struct_specifier] 11 │ │ ├─(__structLeave__)[struct][struct] 12 │ │ ├─(identifierLeave__)[LightInfo][LightInfo] 13 │ │ ├─(__left_braceLeave__)["{"][{] 14 │ │ ├─(__struct_declaration_list)[<struct_declaration_list>][struct_declaration_list] 15 │ │ │ ├─(__struct_declaration_list)[<struct_declaration_list>][struct_declaration_list] 16 │ │ │ │ ├─(__struct_declaration_list)[<struct_declaration_list>][struct_declaration_list] 17 │ │ │ │ │ ├─(__struct_declaration_list)[<struct_declaration_list>][struct_declaration_list] 18 │ │ │ │ │ │ └─(__struct_declaration)[<struct_declaration>][struct_declaration] 19 │ │ │ │ │ │ ├─(__type_specifier)[<type_specifier>][type_specifier] 20 │ │ │ │ │ │ │ └─(__type_specifier_nonarray)[<type_specifier_nonarray>][type_specifier_nonarray] 21 │ │ │ │ │ │ │ └─(__vec4Leave__)[vec4][vec4] 22 │ │ │ │ │ │ ├─(__struct_declarator_list)[<struct_declarator_list>][struct_declarator_list] 23 │ │ │ │ │ │ │ └─(__struct_declarator)[<struct_declarator>][struct_declarator] 24 │ │ │ │ │ │ │ └─(identifierLeave__)[Position][Position] 25 │ │ │ │ │ │ └─(__semicolonLeave__)[";"][;] 26 │ │ │ │ │ └─(__struct_declaration)[<struct_declaration>][struct_declaration] 27 │ │ │ │ │ ├─(__type_specifier)[<type_specifier>][type_specifier] 28 │ │ │ │ │ │ └─(__type_specifier_nonarray)[<type_specifier_nonarray>][type_specifier_nonarray] 29 │ │ │ │ │ │ └─(__vec3Leave__)[vec3][vec3] 30 │ │ │ │ │ ├─(__struct_declarator_list)[<struct_declarator_list>][struct_declarator_list] 31 │ │ │ │ │ │ └─(__struct_declarator)[<struct_declarator>][struct_declarator] 32 │ │ │ │ │ │ └─(identifierLeave__)[La][La] 33 │ │ │ │ │ └─(__semicolonLeave__)[";"][;] 34 │ │ │ │ └─(__struct_declaration)[<struct_declaration>][struct_declaration] 35 │ │ │ │ ├─(__type_specifier)[<type_specifier>][type_specifier] 36 │ │ │ │ │ └─(__type_specifier_nonarray)[<type_specifier_nonarray>][type_specifier_nonarray] 37 │ │ │ │ │ └─(__vec3Leave__)[vec3][vec3] 38 │ │ │ │ ├─(__struct_declarator_list)[<struct_declarator_list>][struct_declarator_list] 39 │ │ │ │ │ └─(__struct_declarator)[<struct_declarator>][struct_declarator] 40 │ │ │ │ │ └─(identifierLeave__)[Ld][Ld] 41 │ │ │ │ └─(__semicolonLeave__)[";"][;] 42 │ │ │ └─(__struct_declaration)[<struct_declaration>][struct_declaration] 43 │ │ │ ├─(__type_specifier)[<type_specifier>][type_specifier] 44 │ │ │ │ └─(__type_specifier_nonarray)[<type_specifier_nonarray>][type_specifier_nonarray] 45 │ │ │ │ └─(__vec3Leave__)[vec3][vec3] 46 │ │ │ ├─(__struct_declarator_list)[<struct_declarator_list>][struct_declarator_list] 47 │ │ │ │ └─(__struct_declarator)[<struct_declarator>][struct_declarator] 48 │ │ │ │ └─(identifierLeave__)[Ls][Ls] 49 │ │ │ └─(__semicolonLeave__)[";"][;] 50 │ │ └─(__right_braceLeave__)["}"][}] 51 │ └─(__semicolonLeave__)[";"][;] 52 └─(__external_declaration)[<external_declaration>][external_declaration] 53 └─(__declaration)[<declaration>][declaration] 54 ├─(__init_declarator_list)[<init_declarator_list>][init_declarator_list] 55 │ └─(__single_declaration)[<single_declaration>][single_declaration] 56 │ ├─(__fully_specified_type)[<fully_specified_type>][fully_specified_type] 57 │ │ ├─(__type_qualifier)[<type_qualifier>][type_qualifier] 58 │ │ │ └─(__single_type_qualifier)[<single_type_qualifier>][single_type_qualifier] 59 │ │ │ └─(__storage_qualifier)[<storage_qualifier>][storage_qualifier] 60 │ │ │ └─(__uniformLeave__)[uniform][uniform] 61 │ │ └─(__type_specifier)[<type_specifier>][type_specifier] 62 │ │ └─(__type_specifier_nonarray)[<type_specifier_nonarray>][type_specifier_nonarray] 63 │ │ └─(__userDefinedTypeLeave__)[LightInfo][LightInfo] 64 │ └─(identifierLeave__)[Light][Light] 65 └─(__semicolonLeave__)[";"][;] SyntaxTree

再加上其他的測試用例,這個GLSL解析器終于實現了。

最終目的

解析GLSL源代碼,是為了獲取其中的信息(都有哪些in/out/uniform等)。現在語法樹已經有了,剩下的就是遍歷此樹的事了。不再詳述。

故事

故事,其實是事故。由于心急,此項目第一次實現時出現了幾乎無法fix的bug。于是重寫了一遍,這次一步一步走,終于成功了。

LALR(1)State

LALR(1)State集合在嘗試插入一個新的State時,如果已有在LALR(1)意義上"相等"的狀態,仍舊要嘗試將新state的LookAhead列表插入已有狀態。

否則,下面的例子就顯示了文法3-8在忽視了這一點時的state集合與正確的state集合的差別(少了一些LookAhead項)。

1 State [1]: 2 <S> ::= . "(" <L> ")" ;, "$" 3 <S'> ::= . <S> "$" ;, "$" 4 <S> ::= . "x" ;, "$" 5 State [8]: 6 <S> ::= "(" <L> ")" . ;, "$" 7 State [4]: 8 <S> ::= "x" . ;, "$" 9 State [6]: 10 <L> ::= <S> . ;, ","")" 11 State [9]: 12 <L> ::= <L> "," <S> . ;, ","")" 13 State [5]: 14 <L> ::= <L> . "," <S> ;, ","")" 15 <S> ::= "(" <L> . ")" ;, "$" 16 State [7]: 17 <S> ::= . "(" <L> ")" ;, ","")" 18 <S> ::= . "x" ;, ","")" 19 <L> ::= <L> "," . <S> ;, ","")" 20 State [2]: 21 <S> ::= . "(" <L> ")" ;, ","")" 22 <S> ::= . "x" ;, ","")" 23 <S> ::= "(" . <L> ")" ;, "$" 24 <L> ::= . <L> "," <S> ;, ","")" 25 <L> ::= . <S> ;, ","")" 26 State [3]: 27 <S'> ::= <S> . "$" ;, "$" 少LookAhead項的 1 State [1]: 2 <S> ::= . "(" <L> ")" ;, "$" 3 <S'> ::= . <S> "$" ;, "$" 4 <S> ::= . "x" ;, "$" 5 State [8]: 6 <S> ::= "(" <L> ")" . ;, "$"","")" 7 State [4]: 8 <S> ::= "x" . ;, "$"","")" 9 State [6]: 10 <L> ::= <S> . ;, ","")" 11 State [9]: 12 <L> ::= <L> "," <S> . ;, ","")" 13 State [5]: 14 <L> ::= <L> . "," <S> ;, ","")" 15 <S> ::= "(" <L> . ")" ;, "$"","")" 16 State [7]: 17 <S> ::= . "(" <L> ")" ;, ","")" 18 <S> ::= . "x" ;, ","")" 19 <L> ::= <L> "," . <S> ;, ","")" 20 State [2]: 21 <S> ::= . "(" <L> ")" ;, ","")" 22 <S> ::= . "x" ;, ","")" 23 <S> ::= "(" . <L> ")" ;, "$"","")" 24 <L> ::= . <L> "," <S> ;, ","")" 25 <L> ::= . <S> ;, ","")" 26 State [3]: 27 <S'> ::= <S> . "$" ;, "$" 正確的

CodeDom

CodeDom不支持readonly屬性,實在是遺憾。CodeDom還會對以"__"開頭的變量自動添加個@前綴,真是無語。

1 // private static TreeNodeType NODE__Grammar = new TreeNodeType(ContextfreeGrammarSLRTreeNodeType.NODE__Grammar, "Grammar", "<Grammar>"); 2 CodeMemberField field = new CodeMemberField(typeof(TreeNodeType), GetNodeNameInParser(node)); 3 // field.Attributes 不支持readonly,遺憾了。 4 field.Attributes = MemberAttributes.Private | MemberAttributes.Static; 5 var ctor = new CodeObjectCreateExpression(typeof(TreeNodeType), 6 new CodeFieldReferenceExpression( 7 new CodeTypeReferenceExpression(GetTreeNodeConstTypeName(grammarId, algorithm)), 8 GetNodeNameInParser(node)), 9 new CodePrimitiveExpression(node.Content), 10 new CodePrimitiveExpression(node.Nickname)); 11 field.InitExpression = ctor;

復雜的詞法分析器

從算法上說,理解語法分析器要比較理解詞法分析器困難的多。但是LR語法分析器的結構卻比詞法分析器的結構和LL語法分析器的結果簡單得多。目前實現dump詞法分析器代碼的代碼是最繞的。要處理注釋(//和/**/)是其中最復雜的問題。這段代碼寫好了我再也不想動了。

LL和LR

LR分析法確實比LL強太多。其適用各種現今的程序語言,對文法的限制極少,分析器結構還十分簡單。奇妙的是,稍微改動下文法,就可以減少LR分析的state,精簡代碼。

例如ContextfreeGrammarCompiler的文法,稍微改改會有不同的state數目。

1 ==================================================================== 2 135 set action items 3 <Grammar> ::= <ProductionList> <Production> ; 4 <ProductionList> ::= <ProductionList> <Production> | null ; 5 <Production> ::= <Vn> "::=" <Canditate> <RightPartList> ";" ; 6 <Canditate> ::= <V> <VList> ; 7 <VList> ::= <V> <VList> | null ; 8 <RightPartList> ::= "|" <Canditate> <RightPartList> | null ; 9 <V> ::= <Vn> | <Vt> ; 10 <Vn> ::= "<" identifier ">" ; 11 <Vt> ::= "null" | "identifier" | "number" | "constString" | constString ; 12 ==================================================================== 13 143 set action items 14 <Grammar> ::= <Production> <ProductionList> ; 15 <ProductionList> ::= <Production> <ProductionList> | null ; 16 <Production> ::= <Vn> "::=" <Canditate> <RightPartList> ";" ; 17 <Canditate> ::= <V> <VList> ; 18 <VList> ::= <V> <VList> | null ; 19 <RightPartList> ::= "|" <Canditate> <RightPartList> | null ; 20 <V> ::= <Vn> | <Vt> ; 21 <Vn> ::= "<" identifier ">" ; 22 <Vt> ::= "null" | "identifier" | "number" | "constString" | constString ; 23 ==================================================================== 24 139 set action items 25 <Grammar> ::= <ProductionList> <Production> ; 26 <ProductionList> ::= <ProductionList> <Production> | null ; 27 <Production> ::= <Vn> "::=" <LeftPartList> <Canditate> ";" ; 28 <LeftPartList> ::= <LeftPartList> <LeftPart> | null ; 29 <LeftPart> ::= <Canditate> "|" ; 30 <Canditate> ::= <V> <VList> ; 31 <VList> ::= <V> <VList> | null ; 32 <V> ::= <Vn> | <Vt> ; 33 <Vn> ::= "<" identifier ">" ; 34 <Vt> ::= "null" | "identifier" | "number" | "constString" | constString ; 35 ==================================================================== 36 120 set action items 37 <Grammar> ::= <ProductionList> <Production> ; 38 <ProductionList> ::= <ProductionList> <Production> | null ; 39 <Production> ::= <Vn> "::=" <Canditate> <RightPartList> ";" ; 40 <Canditate> ::= <VList> <V> ; 41 <VList> ::= <VList> <V> | null ; 42 <RightPartList> ::= "|" <Canditate> <RightPartList> | null ; 43 <V> ::= <Vn> | <Vt> ; 44 <Vn> ::= "<" identifier ">" ; 45 <Vt> ::= "null" | "identifier" | "number" | "constString" | constString ; ContextfreeGrammars

總結

實現了LALR(1)分析和GLSL解析器。

今后做任何語言、格式的解析都不用愁了。

總結

以上是生活随笔為你收集整理的基于虎书实现LALR(1)分析并生成GLSL编译器前端代码(C#)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

亚洲欧美日韩国产精品一区二区 | 久久久国产一区二区三区 | 中文字幕+乱码+中文字幕一区 | 欧洲精品码一区二区三区免费看 | 亚洲色无码一区二区三区 | 亚洲 高清 成人 动漫 | 久久99久久99精品中文字幕 | 免费无码的av片在线观看 | 欧美成人免费全部网站 | 国产三级精品三级男人的天堂 | 精品少妇爆乳无码av无码专区 | 最近中文2019字幕第二页 | 精品无码国产一区二区三区av | 性色欲网站人妻丰满中文久久不卡 | 无码人妻丰满熟妇区五十路百度 | 成熟女人特级毛片www免费 | 欧美性生交活xxxxxdddd | 四虎影视成人永久免费观看视频 | 日日鲁鲁鲁夜夜爽爽狠狠 | 久久综合色之久久综合 | 亚洲a无码综合a国产av中文 | www成人国产高清内射 | 人人澡人摸人人添 | 成 人 免费观看网站 | 野外少妇愉情中文字幕 | 波多野结衣av一区二区全免费观看 | www国产亚洲精品久久久日本 | 一区二区三区乱码在线 | 欧洲 | 欧美国产日韩亚洲中文 | 少妇性荡欲午夜性开放视频剧场 | 日韩精品无码免费一区二区三区 | 亚洲自偷自拍另类第1页 | 亚洲乱码国产乱码精品精 | 久久精品人人做人人综合试看 | 国产综合久久久久鬼色 | 人人妻人人藻人人爽欧美一区 | 熟女俱乐部五十路六十路av | 欧美自拍另类欧美综合图片区 | 伊在人天堂亚洲香蕉精品区 | aⅴ亚洲 日韩 色 图网站 播放 | 亚洲国产精品无码一区二区三区 | 激情国产av做激情国产爱 | 内射巨臀欧美在线视频 | 撕开奶罩揉吮奶头视频 | 国产午夜手机精彩视频 | 亚洲一区二区三区香蕉 | 亚洲国产欧美国产综合一区 | 牲欲强的熟妇农村老妇女视频 | 亚洲精品综合五月久久小说 | 国产人妻人伦精品1国产丝袜 | 强辱丰满人妻hd中文字幕 | 久久97精品久久久久久久不卡 | 偷窥村妇洗澡毛毛多 | 人人爽人人澡人人高潮 | 国产欧美精品一区二区三区 | 中文字幕中文有码在线 | 亚洲国产精华液网站w | 女人被爽到呻吟gif动态图视看 | 无码人妻精品一区二区三区不卡 | 国产超碰人人爽人人做人人添 | 久久人人97超碰a片精品 | 亚洲欧美日韩成人高清在线一区 | 一本久久a久久精品vr综合 | 少妇性l交大片欧洲热妇乱xxx | 在线 国产 欧美 亚洲 天堂 | 少妇无码一区二区二三区 | 国产免费无码一区二区视频 | 99麻豆久久久国产精品免费 | 1000部夫妻午夜免费 | 熟女俱乐部五十路六十路av | 十八禁真人啪啪免费网站 | 狂野欧美性猛交免费视频 | 一区二区三区乱码在线 | 欧洲 | 乱人伦中文视频在线观看 | 欧美人与禽猛交狂配 | 国产精品亚洲五月天高清 | 精品偷自拍另类在线观看 | 欧美freesex黑人又粗又大 | 欧美色就是色 | 蜜臀av无码人妻精品 | 亚洲精品成a人在线观看 | 国产卡一卡二卡三 | 99久久无码一区人妻 | 精品无人区无码乱码毛片国产 | 免费看少妇作爱视频 | 国产va免费精品观看 | 亚洲国产精品无码一区二区三区 | 人妻体内射精一区二区三四 | 亚洲欧洲日本无在线码 | 国产片av国语在线观看 | 日本一本二本三区免费 | 日日鲁鲁鲁夜夜爽爽狠狠 | 久久精品人妻少妇一区二区三区 | 一本久道久久综合婷婷五月 | 粉嫩少妇内射浓精videos | 精品国产一区二区三区四区在线看 | 夜先锋av资源网站 | 国产午夜无码精品免费看 | 久久久国产精品无码免费专区 | 俺去俺来也在线www色官网 | 午夜无码区在线观看 | 日产精品99久久久久久 | 免费无码av一区二区 | 国语自产偷拍精品视频偷 | 小sao货水好多真紧h无码视频 | 鲁大师影院在线观看 | 任你躁国产自任一区二区三区 | 秋霞成人午夜鲁丝一区二区三区 | 思思久久99热只有频精品66 | 欧美xxxx黑人又粗又长 | 国产一区二区三区影院 | 国产精品久久久一区二区三区 | 97夜夜澡人人爽人人喊中国片 | 最近免费中文字幕中文高清百度 | 国产情侣作爱视频免费观看 | 亚洲国产精品毛片av不卡在线 | 性做久久久久久久久 | 国产综合在线观看 | 国产精品无码一区二区三区不卡 | 亚洲国产成人a精品不卡在线 | 曰韩无码二三区中文字幕 | 无遮挡国产高潮视频免费观看 | 无码一区二区三区在线观看 | 中文字幕色婷婷在线视频 | 妺妺窝人体色www在线小说 | 国产国产精品人在线视 | 国产精品久久久av久久久 | 日本爽爽爽爽爽爽在线观看免 | 欧美 丝袜 自拍 制服 另类 | 久久精品国产99精品亚洲 | 一本色道婷婷久久欧美 | 亚洲国产成人av在线观看 | 国产一区二区不卡老阿姨 | 成人免费视频视频在线观看 免费 | 亚洲色偷偷偷综合网 | 亚洲乱亚洲乱妇50p | 九九综合va免费看 | 色欲综合久久中文字幕网 | 无码免费一区二区三区 | 久久精品女人天堂av免费观看 | 99久久人妻精品免费二区 | 国产精品久久久久久亚洲毛片 | 好男人社区资源 | 日韩人妻系列无码专区 | 亚洲日韩中文字幕在线播放 | 久久综合给合久久狠狠狠97色 | 久久久久久亚洲精品a片成人 | 无码免费一区二区三区 | 久久国语露脸国产精品电影 | 日日摸夜夜摸狠狠摸婷婷 | 国产麻豆精品精东影业av网站 | 日韩精品无码一区二区中文字幕 | 亚洲精品国偷拍自产在线麻豆 | 国产一区二区三区日韩精品 | 男人的天堂av网站 | 欧美人与牲动交xxxx | 国产亚洲人成a在线v网站 | 少妇高潮一区二区三区99 | 国产成人精品无码播放 | 无码精品国产va在线观看dvd | www国产亚洲精品久久久日本 | 亚洲一区二区三区香蕉 | 中文字幕无码乱人伦 | 午夜丰满少妇性开放视频 | av香港经典三级级 在线 | 色婷婷欧美在线播放内射 | 国精产品一品二品国精品69xx | 成人亚洲精品久久久久软件 | 欧美丰满熟妇xxxx | 理论片87福利理论电影 | 国产精品久久精品三级 | 小泽玛莉亚一区二区视频在线 | 久久国产精品萌白酱免费 | 亚洲综合无码一区二区三区 | 欧美xxxx黑人又粗又长 | 国产高清av在线播放 | 少妇无码一区二区二三区 | 国产内射爽爽大片视频社区在线 | 粉嫩少妇内射浓精videos | 97色伦图片97综合影院 | 国产午夜视频在线观看 | 偷窥村妇洗澡毛毛多 | 亚洲热妇无码av在线播放 | 性欧美熟妇videofreesex | 狠狠躁日日躁夜夜躁2020 | 国产熟妇高潮叫床视频播放 | 久久国内精品自在自线 | 精品久久久中文字幕人妻 | 熟妇人妻激情偷爽文 | 精品aⅴ一区二区三区 | av香港经典三级级 在线 | 成熟女人特级毛片www免费 | 日韩 欧美 动漫 国产 制服 | 男女下面进入的视频免费午夜 | 人人超人人超碰超国产 | 精品国产av色一区二区深夜久久 | 青青青爽视频在线观看 | 亚洲中文字幕成人无码 | 人人妻在人人 | 国产亚洲精品久久久久久大师 | 性做久久久久久久免费看 | 日韩少妇内射免费播放 | 东京无码熟妇人妻av在线网址 | 精品偷拍一区二区三区在线看 | 成 人 网 站国产免费观看 | 久久久久99精品成人片 | 国产精品18久久久久久麻辣 | 99国产精品白浆在线观看免费 | 内射巨臀欧美在线视频 | 国产成人精品久久亚洲高清不卡 | 亚洲日韩一区二区三区 | 亚洲高清偷拍一区二区三区 | 人妻少妇精品视频专区 | 妺妺窝人体色www婷婷 | 精品无码国产一区二区三区av | 午夜精品一区二区三区的区别 | 精品一二三区久久aaa片 | а天堂中文在线官网 | 午夜福利一区二区三区在线观看 | 欧美freesex黑人又粗又大 | 亚洲爆乳精品无码一区二区三区 | 乱人伦人妻中文字幕无码久久网 | 天天爽夜夜爽夜夜爽 | 日本成熟视频免费视频 | 国产精品内射视频免费 | 中文字幕无码日韩专区 | 男女下面进入的视频免费午夜 | 无码av免费一区二区三区试看 | 成人无码精品1区2区3区免费看 | 无码乱肉视频免费大全合集 | 少妇无码av无码专区在线观看 | www国产精品内射老师 | 国产在线精品一区二区高清不卡 | 超碰97人人射妻 | 国产美女精品一区二区三区 | 成人女人看片免费视频放人 | 俺去俺来也www色官网 | 欧美 日韩 亚洲 在线 | 性色欲网站人妻丰满中文久久不卡 | 1000部夫妻午夜免费 | 日日碰狠狠丁香久燥 | 99久久99久久免费精品蜜桃 | 国产精品第一区揄拍无码 | av在线亚洲欧洲日产一区二区 | 色一情一乱一伦 | 国产小呦泬泬99精品 | 国产激情精品一区二区三区 | 国产综合在线观看 | 精品国产成人一区二区三区 | 中文字幕无码热在线视频 | 爆乳一区二区三区无码 | 国产香蕉尹人综合在线观看 | 欧美亚洲日韩国产人成在线播放 | 老熟女重囗味hdxx69 | 四虎国产精品一区二区 | 亚洲精品国偷拍自产在线观看蜜桃 | 一本大道久久东京热无码av | 国产精品99久久精品爆乳 | 激情人妻另类人妻伦 | 好屌草这里只有精品 | 国产乱人偷精品人妻a片 | 国色天香社区在线视频 | 狠狠色噜噜狠狠狠7777奇米 | 蜜桃无码一区二区三区 | 国产av人人夜夜澡人人爽麻豆 | 国产成人无码一二三区视频 | 亚洲自偷自偷在线制服 | 亚洲精品一区三区三区在线观看 | 少妇无码吹潮 | 成人片黄网站色大片免费观看 | 日本熟妇乱子伦xxxx | 国产偷自视频区视频 | 少妇一晚三次一区二区三区 | 欧美亚洲国产一区二区三区 | 永久免费观看美女裸体的网站 | 中文字幕无码av激情不卡 | 国模大胆一区二区三区 | 日韩少妇白浆无码系列 | 少妇邻居内射在线 | 中文字幕乱妇无码av在线 | 乌克兰少妇xxxx做受 | 免费乱码人妻系列无码专区 | 青青久在线视频免费观看 | 性欧美牲交在线视频 | 日本一卡2卡3卡四卡精品网站 | 成人精品天堂一区二区三区 | аⅴ资源天堂资源库在线 | 中文字幕av无码一区二区三区电影 | 久激情内射婷内射蜜桃人妖 | 亚洲国产欧美在线成人 | 日日摸日日碰夜夜爽av | 久久精品中文字幕大胸 | 亚洲国产av美女网站 | 久久久久se色偷偷亚洲精品av | 亚洲gv猛男gv无码男同 | 午夜成人1000部免费视频 | 少妇激情av一区二区 | 学生妹亚洲一区二区 | 日韩亚洲欧美中文高清在线 | 亚洲色www成人永久网址 | 中文亚洲成a人片在线观看 | 欧美高清在线精品一区 | 亚洲自偷自拍另类第1页 | 亚洲色www成人永久网址 | 国产97色在线 | 免 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 国产偷国产偷精品高清尤物 | 夜夜高潮次次欢爽av女 | 天天综合网天天综合色 | 亚洲精品成人福利网站 | 亚洲熟妇自偷自拍另类 | 日本成熟视频免费视频 | 久久人人97超碰a片精品 | 亚洲无人区午夜福利码高清完整版 | 性生交片免费无码看人 | 人妻少妇精品无码专区二区 | 天天综合网天天综合色 | 国产黑色丝袜在线播放 | 欧洲欧美人成视频在线 | 少女韩国电视剧在线观看完整 | 久久 国产 尿 小便 嘘嘘 | 99精品无人区乱码1区2区3区 | 亚洲成av人在线观看网址 | 亚洲欧美中文字幕5发布 | 国产一精品一av一免费 | 国产精品久久久av久久久 | 综合网日日天干夜夜久久 | 久久久久99精品成人片 | 男女爱爱好爽视频免费看 | 国产在线精品一区二区高清不卡 | 欧美亚洲日韩国产人成在线播放 | 中文久久乱码一区二区 | 东京热一精品无码av | 国产亚洲精品久久久久久 | 成人免费视频一区二区 | 国产欧美精品一区二区三区 | 久久国内精品自在自线 | 久久综合激激的五月天 | 欧美日韩一区二区三区自拍 | 色综合久久久久综合一本到桃花网 | 国产精品亚洲专区无码不卡 | 无码av中文字幕免费放 | 久久精品女人的天堂av | 亚洲精品一区二区三区婷婷月 | 精品国产麻豆免费人成网站 | 成人免费无码大片a毛片 | 中文字幕人成乱码熟女app | 国产成人无码午夜视频在线观看 | 又大又黄又粗又爽的免费视频 | 久久久久亚洲精品中文字幕 | 日韩亚洲欧美中文高清在线 | 无码精品国产va在线观看dvd | 欧美丰满老熟妇xxxxx性 | 久久午夜无码鲁丝片 | 中文字幕日产无线码一区 | 性欧美熟妇videofreesex | 少妇人妻av毛片在线看 | 一本大道伊人av久久综合 | 午夜福利一区二区三区在线观看 | 亚洲一区二区三区国产精华液 | 欧美人与物videos另类 | 国产午夜亚洲精品不卡 | 麻豆精品国产精华精华液好用吗 | 荫蒂添的好舒服视频囗交 | 亚洲精品一区二区三区婷婷月 | 人妻aⅴ无码一区二区三区 | 一本久久伊人热热精品中文字幕 | 精品久久8x国产免费观看 | 国产舌乚八伦偷品w中 | 亚洲大尺度无码无码专区 | 熟女少妇人妻中文字幕 | √8天堂资源地址中文在线 | 爽爽影院免费观看 | 国产黑色丝袜在线播放 | 日本欧美一区二区三区乱码 | 熟女俱乐部五十路六十路av | 欧美一区二区三区 | 老子影院午夜伦不卡 | 欧美人与禽猛交狂配 | 在线观看免费人成视频 | 久久久精品456亚洲影院 | 亚洲精品一区二区三区在线观看 | 日日干夜夜干 | 日韩人妻系列无码专区 | 亚洲大尺度无码无码专区 | 精品午夜福利在线观看 | 亚洲中文字幕乱码av波多ji | 亚洲一区二区三区无码久久 | 亚洲中文字幕在线无码一区二区 | aⅴ在线视频男人的天堂 | 国语精品一区二区三区 | 国产成人午夜福利在线播放 | 久久97精品久久久久久久不卡 | 亚洲高清偷拍一区二区三区 | 在线观看欧美一区二区三区 | 色窝窝无码一区二区三区色欲 | 日本熟妇人妻xxxxx人hd | 日本大乳高潮视频在线观看 | 欧美兽交xxxx×视频 | 成人性做爰aaa片免费看 | 台湾无码一区二区 | 九九在线中文字幕无码 | 日本一区二区三区免费播放 | 国产精品美女久久久 | 天堂а√在线地址中文在线 | 亚洲精品无码国产 | 嫩b人妻精品一区二区三区 | 中文字幕av伊人av无码av | 秋霞成人午夜鲁丝一区二区三区 | 亚洲综合精品香蕉久久网 | 成人影院yy111111在线观看 | 国产片av国语在线观看 | 色一情一乱一伦一区二区三欧美 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 色一情一乱一伦一视频免费看 | 大肉大捧一进一出视频出来呀 | 在线视频网站www色 | 欧美精品在线观看 | 伊人久久婷婷五月综合97色 | 狂野欧美性猛xxxx乱大交 | 免费无码一区二区三区蜜桃大 | 免费看少妇作爱视频 | 亚洲成色www久久网站 | 免费无码av一区二区 | 清纯唯美经典一区二区 | 国内揄拍国内精品少妇国语 | 国产sm调教视频在线观看 | 乱人伦人妻中文字幕无码久久网 | 亚洲欧洲无卡二区视頻 | 无码乱肉视频免费大全合集 | 成人片黄网站色大片免费观看 | 天堂一区人妻无码 | 99国产精品白浆在线观看免费 | 97久久超碰中文字幕 | 伦伦影院午夜理论片 | 亚洲成av人片在线观看无码不卡 | 人人澡人摸人人添 | 午夜理论片yy44880影院 | 欧美国产日韩久久mv | 国产精品久久精品三级 | 纯爱无遮挡h肉动漫在线播放 | 免费无码肉片在线观看 | 无码人妻出轨黑人中文字幕 | 国产亚av手机在线观看 | 国产精品内射视频免费 | 精品无人国产偷自产在线 | 亚洲综合色区中文字幕 | 强开小婷嫩苞又嫩又紧视频 | 国产疯狂伦交大片 | 桃花色综合影院 | 荫蒂添的好舒服视频囗交 | 国产口爆吞精在线视频 | 国产精品久久久一区二区三区 | 国产suv精品一区二区五 | 欧美性黑人极品hd | 亚洲日韩乱码中文无码蜜桃臀网站 | 免费人成在线视频无码 | 国产精品无码成人午夜电影 | 性做久久久久久久免费看 | 97无码免费人妻超级碰碰夜夜 | 国产小呦泬泬99精品 | 97se亚洲精品一区 | 久久国产精品_国产精品 | 日本乱偷人妻中文字幕 | 大肉大捧一进一出视频出来呀 | 国产亚洲精品久久久久久大师 | 曰韩无码二三区中文字幕 | 丰满诱人的人妻3 | 久久综合狠狠综合久久综合88 | yw尤物av无码国产在线观看 | 国产一区二区不卡老阿姨 | 午夜肉伦伦影院 | 国产精品人人妻人人爽 | 伦伦影院午夜理论片 | 日韩精品久久久肉伦网站 | 国产精品久久久久久亚洲毛片 | 青草青草久热国产精品 | 中文字幕av无码一区二区三区电影 | 欧美丰满熟妇xxxx性ppx人交 | 色窝窝无码一区二区三区色欲 | 麻豆国产人妻欲求不满谁演的 | 黑森林福利视频导航 | 激情内射亚州一区二区三区爱妻 | 午夜免费福利小电影 | 欧美国产亚洲日韩在线二区 | 日本熟妇乱子伦xxxx | 内射欧美老妇wbb | 网友自拍区视频精品 | 色诱久久久久综合网ywww | 熟女少妇在线视频播放 | 日本免费一区二区三区最新 | 亚洲人成影院在线观看 | 东京热一精品无码av | 永久免费观看美女裸体的网站 | 精品国精品国产自在久国产87 | 国产熟妇高潮叫床视频播放 | 国产特级毛片aaaaaa高潮流水 | 国产热a欧美热a在线视频 | 国产精品va在线观看无码 | 国产午夜手机精彩视频 | 精品国产福利一区二区 | 成人无码视频在线观看网站 | 久久精品丝袜高跟鞋 | 亚洲中文字幕乱码av波多ji | 久久综合九色综合97网 | 大乳丰满人妻中文字幕日本 | 午夜精品一区二区三区在线观看 | 狠狠色欧美亚洲狠狠色www | 中文精品久久久久人妻不卡 | 小泽玛莉亚一区二区视频在线 | 亚洲国产一区二区三区在线观看 | 亚洲精品中文字幕乱码 | 日本成熟视频免费视频 | 欧美高清在线精品一区 | 天天躁夜夜躁狠狠是什么心态 | 中文字幕无线码免费人妻 | 欧洲极品少妇 | 成人无码精品一区二区三区 | 丁香啪啪综合成人亚洲 | 亚洲啪av永久无码精品放毛片 | 色诱久久久久综合网ywww | 一二三四社区在线中文视频 | 亚洲欧美综合区丁香五月小说 | 高清无码午夜福利视频 | 日本熟妇大屁股人妻 | 午夜福利不卡在线视频 | 中文字幕日韩精品一区二区三区 | 日本精品少妇一区二区三区 | 免费无码午夜福利片69 | 久久无码人妻影院 | 婷婷五月综合激情中文字幕 | 又粗又大又硬又长又爽 | 精品久久久无码人妻字幂 | 日韩人妻无码一区二区三区久久99 | 亚拍精品一区二区三区探花 | 伊在人天堂亚洲香蕉精品区 | 亚洲色在线无码国产精品不卡 | 亚洲欧美国产精品专区久久 | 亚洲人交乣女bbw | 色一情一乱一伦一视频免费看 | 久久国语露脸国产精品电影 | 九九久久精品国产免费看小说 | 久久人人97超碰a片精品 | 国产真人无遮挡作爱免费视频 | 夜夜高潮次次欢爽av女 | 在线观看欧美一区二区三区 | 综合激情五月综合激情五月激情1 | 成人一区二区免费视频 | 日日噜噜噜噜夜夜爽亚洲精品 | 午夜男女很黄的视频 | 免费国产黄网站在线观看 | 色综合视频一区二区三区 | 国产精品久久久久久无码 | 亚洲成熟女人毛毛耸耸多 | 亚洲欧美日韩国产精品一区二区 | 国产无套粉嫩白浆在线 | 狠狠色欧美亚洲狠狠色www | 精品国产精品久久一区免费式 | 亚洲国产精品成人久久蜜臀 | 国内精品人妻无码久久久影院 | 亚洲欧美精品伊人久久 | 人妻体内射精一区二区三四 | 纯爱无遮挡h肉动漫在线播放 | 欧美xxxx黑人又粗又长 | 国产综合在线观看 | 亚洲色www成人永久网址 | 亚洲日本一区二区三区在线 | 东京热无码av男人的天堂 | 亚洲欧洲中文日韩av乱码 | 亚洲精品久久久久久一区二区 | 宝宝好涨水快流出来免费视频 | 亚洲理论电影在线观看 | 强伦人妻一区二区三区视频18 | 天下第一社区视频www日本 | 国产精品怡红院永久免费 | 黑人玩弄人妻中文在线 | 成人欧美一区二区三区黑人 | 在线 国产 欧美 亚洲 天堂 | 久久97精品久久久久久久不卡 | 亚洲人交乣女bbw | 人妻插b视频一区二区三区 | 亚洲精品午夜无码电影网 | 国产精品久久久午夜夜伦鲁鲁 | 67194成是人免费无码 | 中文字幕无码av激情不卡 | 激情国产av做激情国产爱 | 亚洲啪av永久无码精品放毛片 | 欧美刺激性大交 | 在线观看国产午夜福利片 | 国产午夜无码精品免费看 | 男女超爽视频免费播放 | 欧美日韩亚洲国产精品 | 婷婷丁香五月天综合东京热 | 无码国内精品人妻少妇 | a片在线免费观看 | 色婷婷av一区二区三区之红樱桃 | 国产精品办公室沙发 | 东京热无码av男人的天堂 | 强开小婷嫩苞又嫩又紧视频 | 中国女人内谢69xxxx | 久久久亚洲欧洲日产国码αv | 强奷人妻日本中文字幕 | 国产成人精品无码播放 | 亚洲色大成网站www国产 | 中文字幕无码日韩欧毛 | 图片区 小说区 区 亚洲五月 | 妺妺窝人体色www婷婷 | 麻豆人妻少妇精品无码专区 | 99国产精品白浆在线观看免费 | 国产麻豆精品精东影业av网站 | 免费网站看v片在线18禁无码 | 野狼第一精品社区 | 亚洲成a人片在线观看无码 | 亚洲欧美精品aaaaaa片 | 色综合久久久无码网中文 | 午夜福利试看120秒体验区 | 在线精品亚洲一区二区 | 极品尤物被啪到呻吟喷水 | 日日干夜夜干 | 国产九九九九九九九a片 | 影音先锋中文字幕无码 | 欧美熟妇另类久久久久久不卡 | 无遮挡国产高潮视频免费观看 | 99久久婷婷国产综合精品青草免费 | 国产亚洲美女精品久久久2020 | 天天躁夜夜躁狠狠是什么心态 | 国产艳妇av在线观看果冻传媒 | 久久精品人妻少妇一区二区三区 | 国产精品久久久久7777 | 中文字幕乱码人妻无码久久 | 精品aⅴ一区二区三区 | 国产精品久久久久久久影院 | 日产精品99久久久久久 | 久久人妻内射无码一区三区 | 日韩亚洲欧美精品综合 | 九九综合va免费看 | 乌克兰少妇xxxx做受 | 国产手机在线αⅴ片无码观看 | 熟妇女人妻丰满少妇中文字幕 | 中文精品无码中文字幕无码专区 | 在线天堂新版最新版在线8 | 妺妺窝人体色www在线小说 | 国产精品美女久久久久av爽李琼 | 青春草在线视频免费观看 | 亚洲爆乳精品无码一区二区三区 | 国产情侣作爱视频免费观看 | 国产成人精品久久亚洲高清不卡 | 中文字幕无码人妻少妇免费 | 中文字幕av日韩精品一区二区 | 人妻少妇精品无码专区二区 | 一本大道久久东京热无码av | 国产成人无码专区 | 一区二区三区高清视频一 | 国产人妻精品一区二区三区不卡 | 亚洲中文字幕在线无码一区二区 | 亚洲熟妇色xxxxx亚洲 | 少妇一晚三次一区二区三区 | 国产va免费精品观看 | 精品午夜福利在线观看 | 人人超人人超碰超国产 | 免费网站看v片在线18禁无码 | 国产精品99爱免费视频 | 色欲av亚洲一区无码少妇 | 国产精品怡红院永久免费 | 对白脏话肉麻粗话av | 欧美性生交xxxxx久久久 | 亚洲欧美综合区丁香五月小说 | 国产精品嫩草久久久久 | 欧美人与禽zoz0性伦交 | 中文无码成人免费视频在线观看 | 男人扒开女人内裤强吻桶进去 | 亚洲日本va午夜在线电影 | 中文字幕人妻无码一夲道 | 国产精品丝袜黑色高跟鞋 | 玩弄中年熟妇正在播放 | 国产激情艳情在线看视频 | 一本久久a久久精品vr综合 | 日本高清一区免费中文视频 | 人妻无码αv中文字幕久久琪琪布 | 性欧美熟妇videofreesex | 欧美日韩人成综合在线播放 | 野狼第一精品社区 | 婷婷五月综合激情中文字幕 | 亚洲国产精品久久久久久 | 久久99精品久久久久久动态图 | 成人av无码一区二区三区 | 国产成人精品久久亚洲高清不卡 | 亚洲va欧美va天堂v国产综合 | 亚洲色大成网站www国产 | 99久久精品无码一区二区毛片 | 中文字幕乱妇无码av在线 | 蜜臀av在线播放 久久综合激激的五月天 | 久久精品无码一区二区三区 | 国产av无码专区亚洲a∨毛片 | 欧美老人巨大xxxx做受 | 啦啦啦www在线观看免费视频 | 波多野结衣高清一区二区三区 | 国产午夜精品一区二区三区嫩草 | 女人被男人躁得好爽免费视频 | 国产欧美亚洲精品a | 午夜精品久久久久久久 | 亚洲区小说区激情区图片区 | 一本久道久久综合狠狠爱 | 久久久久久a亚洲欧洲av冫 | 国产亚洲精品久久久久久 | 久久久久se色偷偷亚洲精品av | 亚洲中文字幕在线无码一区二区 | 少妇的肉体aa片免费 | 亚洲欧洲日本综合aⅴ在线 | 国产成人av免费观看 | 俄罗斯老熟妇色xxxx | 无码帝国www无码专区色综合 | 日韩精品无码免费一区二区三区 | 男女作爱免费网站 | 国产内射爽爽大片视频社区在线 | av无码电影一区二区三区 | 国产精品对白交换视频 | 兔费看少妇性l交大片免费 | 久久亚洲日韩精品一区二区三区 | 国产在线无码精品电影网 | 精品久久久久久人妻无码中文字幕 | 夜夜夜高潮夜夜爽夜夜爰爰 | 亚洲熟妇色xxxxx欧美老妇y | 国内精品久久毛片一区二区 | 丰满少妇女裸体bbw | 成熟女人特级毛片www免费 | 亚洲精品鲁一鲁一区二区三区 | 亚洲国产精品一区二区美利坚 | www国产亚洲精品久久久日本 | 久久zyz资源站无码中文动漫 | 亚洲日本一区二区三区在线 | 少妇无码av无码专区在线观看 | 东京无码熟妇人妻av在线网址 | 无码国产乱人伦偷精品视频 | 欧美成人高清在线播放 | 无码av中文字幕免费放 | 色偷偷人人澡人人爽人人模 | 无码纯肉视频在线观看 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国内精品一区二区三区不卡 | 天天拍夜夜添久久精品大 | 波多野结衣一区二区三区av免费 | 国产绳艺sm调教室论坛 | 久久国语露脸国产精品电影 | 性啪啪chinese东北女人 | 成人性做爰aaa片免费看 | 国产一区二区三区四区五区加勒比 | 欧美日韩一区二区三区自拍 | 红桃av一区二区三区在线无码av | 亚洲成av人综合在线观看 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 亚洲 a v无 码免 费 成 人 a v | 日本大香伊一区二区三区 | 乌克兰少妇xxxx做受 | 亚洲中文字幕无码中字 | 精品乱码久久久久久久 | 无码一区二区三区在线 | 在线 国产 欧美 亚洲 天堂 | 成人片黄网站色大片免费观看 | 99国产精品白浆在线观看免费 | 欧美人与禽zoz0性伦交 | 亚洲国产欧美在线成人 | 国产在热线精品视频 | 久久国内精品自在自线 | 亚洲色www成人永久网址 | 国产精品毛片一区二区 | 国产成人无码一二三区视频 | 欧美日韩久久久精品a片 | 岛国片人妻三上悠亚 | 2020久久香蕉国产线看观看 | 婷婷丁香六月激情综合啪 | 青青草原综合久久大伊人精品 | 亚洲の无码国产の无码影院 | 亚洲天堂2017无码中文 | 精品无码一区二区三区的天堂 | 中文字幕无码免费久久9一区9 | 中文字幕 人妻熟女 | 激情亚洲一区国产精品 | 大地资源中文第3页 | 欧美自拍另类欧美综合图片区 | 国产高清av在线播放 | 男女超爽视频免费播放 | 网友自拍区视频精品 | 少妇无码av无码专区在线观看 | 奇米影视7777久久精品 | a片免费视频在线观看 | 久久国产自偷自偷免费一区调 | 欧美日韩一区二区综合 | 牲欲强的熟妇农村老妇女视频 | 日韩成人一区二区三区在线观看 | 亚洲中文字幕在线观看 | 美女毛片一区二区三区四区 | 大色综合色综合网站 | 男女爱爱好爽视频免费看 | 亚洲中文字幕无码一久久区 | 国产高清av在线播放 | 欧洲美熟女乱又伦 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产av无码专区亚洲awww | 麻豆国产97在线 | 欧洲 | 国产免费无码一区二区视频 | 国内精品一区二区三区不卡 | 久久久久99精品成人片 | 久久午夜无码鲁丝片秋霞 | 国产特级毛片aaaaaaa高清 | 色欲综合久久中文字幕网 | 中文久久乱码一区二区 | 强伦人妻一区二区三区视频18 | 综合网日日天干夜夜久久 | 无码帝国www无码专区色综合 | 精品亚洲韩国一区二区三区 | 中文无码伦av中文字幕 | 国产成人无码午夜视频在线观看 | 欧美老妇与禽交 | 国产农村乱对白刺激视频 | 日本丰满护士爆乳xxxx | 丰满护士巨好爽好大乳 | 久久久精品欧美一区二区免费 | 亚洲乱码中文字幕在线 | 曰本女人与公拘交酡免费视频 | 国产av无码专区亚洲awww | 99久久精品日本一区二区免费 | 无码国产乱人伦偷精品视频 | 午夜成人1000部免费视频 | 99久久人妻精品免费二区 | 国产成人久久精品流白浆 | 国产精品怡红院永久免费 | 久久久无码中文字幕久... | 无码av中文字幕免费放 | 久久人人爽人人人人片 | √天堂中文官网8在线 | 激情亚洲一区国产精品 | 丰满人妻一区二区三区免费视频 | 亚洲爆乳无码专区 | 婷婷综合久久中文字幕蜜桃三电影 | 亚洲精品国偷拍自产在线观看蜜桃 | 免费国产成人高清在线观看网站 | 丝袜足控一区二区三区 | 国产 浪潮av性色四虎 | 中文字幕 人妻熟女 | 久久精品人人做人人综合 | 青青草原综合久久大伊人精品 | 国产亚洲人成在线播放 | 亚洲色在线无码国产精品不卡 | 亚洲综合另类小说色区 | 国产精品亚洲一区二区三区喷水 | 日本肉体xxxx裸交 | 无码国产色欲xxxxx视频 | 成人一在线视频日韩国产 | 色婷婷久久一区二区三区麻豆 | 国产av一区二区三区最新精品 | 国内揄拍国内精品人妻 | 亚洲午夜久久久影院 | 国产精品国产三级国产专播 | 日日躁夜夜躁狠狠躁 | 人妻少妇精品无码专区二区 | 日本精品少妇一区二区三区 | 狠狠噜狠狠狠狠丁香五月 | 伊人久久婷婷五月综合97色 | 国产免费久久久久久无码 | 67194成是人免费无码 | 午夜肉伦伦影院 | 在线天堂新版最新版在线8 | 亚洲熟妇色xxxxx欧美老妇y | 久久熟妇人妻午夜寂寞影院 | 伊在人天堂亚洲香蕉精品区 | 国产亚洲精品久久久久久 | 国产性生交xxxxx无码 | 极品尤物被啪到呻吟喷水 | 亚洲中文字幕无码中文字在线 | 成人试看120秒体验区 | 99er热精品视频 | 欧美日韩久久久精品a片 | 无码av中文字幕免费放 | 午夜福利试看120秒体验区 | 国产麻豆精品一区二区三区v视界 | 亚洲一区二区三区四区 | 国产国产精品人在线视 | 国产特级毛片aaaaaaa高清 | 亚洲 a v无 码免 费 成 人 a v | 中文字幕+乱码+中文字幕一区 | 国产精品欧美成人 | 国产在线aaa片一区二区99 | 亚洲经典千人经典日产 | 精品乱子伦一区二区三区 | 欧美一区二区三区视频在线观看 | 丰满少妇女裸体bbw | 久久99精品久久久久久 | 免费人成在线观看网站 | 国产在线一区二区三区四区五区 | 亚洲一区二区三区香蕉 | 午夜丰满少妇性开放视频 | 亚洲精品中文字幕 | 牲欲强的熟妇农村老妇女 | 在线看片无码永久免费视频 | 女人高潮内射99精品 | 无码免费一区二区三区 | 欧美肥老太牲交大战 | 亚洲国产精华液网站w | 国产精品久久国产精品99 | 免费看男女做好爽好硬视频 | 国产又爽又猛又粗的视频a片 | 久久www免费人成人片 | 亚洲一区二区三区国产精华液 | 成人无码视频在线观看网站 | 狠狠色噜噜狠狠狠狠7777米奇 | 国内综合精品午夜久久资源 | 无遮挡啪啪摇乳动态图 | 亚洲熟妇色xxxxx欧美老妇y | 樱花草在线社区www | 国产一区二区三区日韩精品 | 俺去俺来也在线www色官网 | 欧美怡红院免费全部视频 | 欧美老熟妇乱xxxxx | 激情五月综合色婷婷一区二区 | 国产乱码精品一品二品 | 骚片av蜜桃精品一区 | 欧美老人巨大xxxx做受 | 国产乱人无码伦av在线a | 国产激情艳情在线看视频 | 亚洲а∨天堂久久精品2021 | 人妻少妇被猛烈进入中文字幕 | 帮老师解开蕾丝奶罩吸乳网站 | 久久国产精品精品国产色婷婷 | 国产情侣作爱视频免费观看 | 亚洲中文字幕无码中文字在线 | 又大又紧又粉嫩18p少妇 | 国产又爽又黄又刺激的视频 | 娇妻被黑人粗大高潮白浆 | 少妇无码av无码专区在线观看 | 久久综合给合久久狠狠狠97色 | 国产在线aaa片一区二区99 | 国产成人无码av片在线观看不卡 | 国产区女主播在线观看 | 国产精品人人妻人人爽 | 国产精品久久久午夜夜伦鲁鲁 | 久久99热只有频精品8 | 国产熟妇另类久久久久 | 色综合久久中文娱乐网 | 99精品无人区乱码1区2区3区 | 国产内射老熟女aaaa | 无码人妻黑人中文字幕 | 学生妹亚洲一区二区 | 亚洲综合无码久久精品综合 | 日韩人妻系列无码专区 | 欧美日韩色另类综合 | 亚洲高清偷拍一区二区三区 | 中文字幕色婷婷在线视频 | 亚洲精品一区二区三区四区五区 | 国产精品第一国产精品 | 呦交小u女精品视频 | 色窝窝无码一区二区三区色欲 | 人妻互换免费中文字幕 | 大胆欧美熟妇xx | 欧美人与善在线com | 久久午夜夜伦鲁鲁片无码免费 | 久久熟妇人妻午夜寂寞影院 | 国产午夜视频在线观看 | 亚洲 欧美 激情 小说 另类 | 国产亚洲日韩欧美另类第八页 | 久久精品人人做人人综合试看 | 欧美人与善在线com | 内射巨臀欧美在线视频 | 熟女俱乐部五十路六十路av | 亚洲a无码综合a国产av中文 | 亚洲a无码综合a国产av中文 | 性色av无码免费一区二区三区 | 欧美xxxxx精品 | 啦啦啦www在线观看免费视频 | 在线播放免费人成毛片乱码 | a在线亚洲男人的天堂 | 成人欧美一区二区三区 | 国产免费观看黄av片 | 色婷婷综合中文久久一本 | 欧美freesex黑人又粗又大 | 国产成人av免费观看 | 色综合视频一区二区三区 | 日韩在线不卡免费视频一区 | 久久视频在线观看精品 | 精品久久久久香蕉网 | 亚洲欧美日韩综合久久久 | 夜夜影院未满十八勿进 | 亚洲中文无码av永久不收费 | 精品无码成人片一区二区98 | 人妻无码久久精品人妻 | 欧美国产日产一区二区 | 澳门永久av免费网站 | 2020久久香蕉国产线看观看 | 一本久道高清无码视频 | 国产精品亚洲专区无码不卡 | 丰满少妇女裸体bbw | 精品国产成人一区二区三区 | 欧美熟妇另类久久久久久多毛 | 日韩视频 中文字幕 视频一区 | 国产精品欧美成人 | 久久久久久久久蜜桃 | 国产成人精品视频ⅴa片软件竹菊 | 日产精品高潮呻吟av久久 | 国产人妖乱国产精品人妖 | 色综合天天综合狠狠爱 | 无码吃奶揉捏奶头高潮视频 | 精品国产一区av天美传媒 | 国产精品美女久久久网av | 亚洲а∨天堂久久精品2021 | 日本在线高清不卡免费播放 | 午夜精品久久久久久久 | 久久久久国色av免费观看性色 | 中文字幕无码免费久久9一区9 | 亚洲啪av永久无码精品放毛片 | 人妻有码中文字幕在线 | 免费乱码人妻系列无码专区 | 欧美阿v高清资源不卡在线播放 | 日韩人妻无码中文字幕视频 | 老头边吃奶边弄进去呻吟 | a片在线免费观看 | 久久久www成人免费毛片 | 在线看片无码永久免费视频 | 亚洲色无码一区二区三区 | 国産精品久久久久久久 | 精品国产精品久久一区免费式 | 亚洲日韩av一区二区三区四区 | 东京热一精品无码av | 一个人看的视频www在线 | 377p欧洲日本亚洲大胆 | 久久精品视频在线看15 | 一本久道久久综合狠狠爱 | 国内精品一区二区三区不卡 | 一本无码人妻在中文字幕免费 | 国产精品永久免费视频 | 国产无遮挡吃胸膜奶免费看 | 一本久道久久综合婷婷五月 | 久久久久久久久888 | 国产高潮视频在线观看 | 亚洲一区二区三区在线观看网站 | 国产无遮挡又黄又爽免费视频 | 动漫av一区二区在线观看 | 2019午夜福利不卡片在线 | 99re在线播放 | 黄网在线观看免费网站 | 人人妻人人澡人人爽欧美一区 | 日本xxxx色视频在线观看免费 | 樱花草在线社区www | 国内老熟妇对白xxxxhd | 中文字幕无线码免费人妻 | 性欧美熟妇videofreesex | 成人动漫在线观看 | 精品一区二区三区波多野结衣 | 国产无遮挡又黄又爽免费视频 | 丰腴饱满的极品熟妇 | 美女扒开屁股让男人桶 | 给我免费的视频在线观看 | 日日干夜夜干 | 亚洲а∨天堂久久精品2021 | 麻花豆传媒剧国产免费mv在线 | 国语自产偷拍精品视频偷 | 国语自产偷拍精品视频偷 | 国产精品久久久久影院嫩草 | 成人aaa片一区国产精品 | 色综合天天综合狠狠爱 | 亚洲狠狠色丁香婷婷综合 | 未满小14洗澡无码视频网站 | 精品国产精品久久一区免费式 | 国精品人妻无码一区二区三区蜜柚 | 久久国产精品二国产精品 | 国产精品久久久久影院嫩草 | 蜜臀av在线播放 久久综合激激的五月天 | 亚洲熟妇色xxxxx亚洲 | 理论片87福利理论电影 | 国产精品igao视频网 | 亚洲中文字幕无码中文字在线 | 亚洲色欲久久久综合网东京热 | 男女爱爱好爽视频免费看 | 强辱丰满人妻hd中文字幕 | 日本又色又爽又黄的a片18禁 | 亚洲s码欧洲m码国产av | 午夜性刺激在线视频免费 | 丰满少妇高潮惨叫视频 | 国产精品无码一区二区三区不卡 | 综合激情五月综合激情五月激情1 | 亚洲精品欧美二区三区中文字幕 | 波多野结衣aⅴ在线 | 亚洲aⅴ无码成人网站国产app | 夜夜影院未满十八勿进 | 麻豆果冻传媒2021精品传媒一区下载 | 国产亚洲精品久久久久久大师 | 男女猛烈xx00免费视频试看 | 俺去俺来也在线www色官网 | 国内综合精品午夜久久资源 | 国产精品香蕉在线观看 | 日本va欧美va欧美va精品 | 日韩av无码一区二区三区不卡 | 大地资源网第二页免费观看 | 成人无码精品一区二区三区 | 国产亲子乱弄免费视频 | 熟妇人妻无码xxx视频 | 亚洲精品久久久久avwww潮水 | 欧美一区二区三区 | 亚洲日本va午夜在线电影 | 装睡被陌生人摸出水好爽 | 蜜桃臀无码内射一区二区三区 | 国产亚洲美女精品久久久2020 | 亚洲日韩乱码中文无码蜜桃臀网站 | 亚洲中文字幕乱码av波多ji | 国模大胆一区二区三区 | 国产无遮挡又黄又爽又色 | 牛和人交xxxx欧美 | 国产精品18久久久久久麻辣 | 波多野结衣av在线观看 | 国内精品人妻无码久久久影院 | 亚洲一区二区三区国产精华液 | 九九热爱视频精品 | 少妇高潮一区二区三区99 | 国产乱人偷精品人妻a片 | 精品无码一区二区三区爱欲 | 国产精品久久国产精品99 | 欧美亚洲国产一区二区三区 | 强辱丰满人妻hd中文字幕 | 夫妻免费无码v看片 | 麻豆国产人妻欲求不满谁演的 | 久久无码人妻影院 | 青青草原综合久久大伊人精品 | 激情亚洲一区国产精品 | 欧美日本免费一区二区三区 | 色婷婷综合激情综在线播放 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 中文字幕无码视频专区 | 国产一区二区三区日韩精品 | 亚洲中文字幕无码中文字在线 | 在线观看国产一区二区三区 | 青草视频在线播放 | 国产熟妇另类久久久久 | 国产亚洲精品久久久久久久 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲一区二区三区偷拍女厕 | 国产97色在线 | 免 | 妺妺窝人体色www在线小说 | 内射巨臀欧美在线视频 | 色老头在线一区二区三区 | 无遮挡啪啪摇乳动态图 | 无码人妻丰满熟妇区毛片18 | 青草青草久热国产精品 | 丰腴饱满的极品熟妇 | 成年美女黄网站色大免费视频 | 欧美人与禽猛交狂配 | 国产特级毛片aaaaaa高潮流水 | 宝宝好涨水快流出来免费视频 | 乱码av麻豆丝袜熟女系列 | 少妇无套内谢久久久久 | 亚洲啪av永久无码精品放毛片 | 成人免费视频一区二区 | 97se亚洲精品一区 | 麻豆国产丝袜白领秘书在线观看 | 久久国语露脸国产精品电影 | 中文字幕精品av一区二区五区 | 成人精品视频一区二区三区尤物 | 欧美变态另类xxxx | 中国大陆精品视频xxxx | 欧美日本精品一区二区三区 | 99麻豆久久久国产精品免费 | 国产极品视觉盛宴 | 中文字幕人成乱码熟女app | 人人妻在人人 | 亚洲乱码中文字幕在线 | 亚洲狠狠婷婷综合久久 | 国产精品怡红院永久免费 | aⅴ在线视频男人的天堂 | 我要看www免费看插插视频 | 77777熟女视频在线观看 а天堂中文在线官网 | 奇米影视7777久久精品人人爽 | 国内精品久久毛片一区二区 | 在线 国产 欧美 亚洲 天堂 | 小sao货水好多真紧h无码视频 | 亚洲日韩av一区二区三区中文 | 日日天干夜夜狠狠爱 | 日韩精品一区二区av在线 | 久久综合久久自在自线精品自 | 中文字幕无码免费久久99 | 精品国产成人一区二区三区 | 牲欲强的熟妇农村老妇女 | 久久综合久久自在自线精品自 | 丰满妇女强制高潮18xxxx | 日日夜夜撸啊撸 | 97色伦图片97综合影院 | 欧美成人家庭影院 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产精品久久久久久久9999 | 秋霞成人午夜鲁丝一区二区三区 | 男女猛烈xx00免费视频试看 | 三级4级全黄60分钟 | 日韩欧美中文字幕公布 | 76少妇精品导航 | 在线 国产 欧美 亚洲 天堂 | 美女极度色诱视频国产 | 亚洲天堂2017无码中文 | 搡女人真爽免费视频大全 | 精品久久综合1区2区3区激情 | 中文字幕av日韩精品一区二区 | 伊在人天堂亚洲香蕉精品区 | 亚洲中文字幕在线观看 | 色综合天天综合狠狠爱 | 亚洲国产精品久久人人爱 | 亚洲国产一区二区三区在线观看 | 88国产精品欧美一区二区三区 | 国产97人人超碰caoprom | 日韩无套无码精品 | 亚洲小说春色综合另类 | 国产午夜手机精彩视频 | 老司机亚洲精品影院无码 | 乱中年女人伦av三区 | 日韩人妻无码中文字幕视频 | 国产人成高清在线视频99最全资源 | 亚洲欧洲无卡二区视頻 | 国产精品a成v人在线播放 | 97se亚洲精品一区 | 国产精品无码成人午夜电影 | 免费人成在线视频无码 | 激情内射日本一区二区三区 | 综合人妻久久一区二区精品 | 无码国内精品人妻少妇 | 亚洲无人区午夜福利码高清完整版 | 亚洲人成人无码网www国产 | 亚洲成av人影院在线观看 | 人人妻人人澡人人爽人人精品浪潮 | 澳门永久av免费网站 | 四虎国产精品一区二区 | 色综合久久中文娱乐网 | 亚洲一区二区三区偷拍女厕 | 日韩欧美成人免费观看 | 东京一本一道一二三区 | 国产精品18久久久久久麻辣 | 久久精品女人天堂av免费观看 | 国产精品第一国产精品 | 精品人妻av区 | 荫蒂添的好舒服视频囗交 | 亚洲一区二区三区在线观看网站 | 国产精品亚洲一区二区三区喷水 | 久久无码人妻影院 | 欧洲欧美人成视频在线 | 红桃av一区二区三区在线无码av | 中文字幕无码av波多野吉衣 | 国产乱人偷精品人妻a片 | 久久久久人妻一区精品色欧美 | 夜精品a片一区二区三区无码白浆 | 香港三级日本三级妇三级 | 大胆欧美熟妇xx | 最新版天堂资源中文官网 | 精品aⅴ一区二区三区 | 亚洲 欧美 激情 小说 另类 | 亚洲自偷自偷在线制服 | 98国产精品综合一区二区三区 | 亚洲阿v天堂在线 | 国产九九九九九九九a片 | 亚洲一区二区三区在线观看网站 | 中文字幕无码人妻少妇免费 | 国产香蕉尹人综合在线观看 | 人人妻人人澡人人爽精品欧美 | 色综合久久久久综合一本到桃花网 | 国产亚洲人成a在线v网站 | 激情内射日本一区二区三区 | 天海翼激烈高潮到腰振不止 | 欧美老人巨大xxxx做受 | 人妻无码αv中文字幕久久琪琪布 | 欧美日本精品一区二区三区 | 亚洲人成无码网www | 图片小说视频一区二区 | 成人欧美一区二区三区 | 日韩人妻少妇一区二区三区 | 久久久久久久人妻无码中文字幕爆 | 久久久精品国产sm最大网站 | 精品久久久久香蕉网 | 欧美日韩一区二区免费视频 | 亚洲欧洲无卡二区视頻 | 欧美丰满少妇xxxx性 | yw尤物av无码国产在线观看 | 福利一区二区三区视频在线观看 | 欧美国产亚洲日韩在线二区 | 熟妇人妻无码xxx视频 | 激情人妻另类人妻伦 | 人妻少妇精品无码专区动漫 | 国语自产偷拍精品视频偷 | 亚洲中文字幕在线无码一区二区 | 乱人伦中文视频在线观看 | 国产精品理论片在线观看 | 成年美女黄网站色大免费全看 | 亚洲自偷自拍另类第1页 | 欧美阿v高清资源不卡在线播放 | 伊人久久大香线蕉av一区二区 | 国产午夜视频在线观看 | 人妻少妇精品久久 | 精品厕所偷拍各类美女tp嘘嘘 | 人妻少妇精品无码专区二区 | 51国偷自产一区二区三区 | 久久人人爽人人爽人人片av高清 | 欧洲美熟女乱又伦 | 国产欧美精品一区二区三区 | 综合人妻久久一区二区精品 | 真人与拘做受免费视频一 | 精品少妇爆乳无码av无码专区 | 天堂а√在线地址中文在线 | 人人澡人摸人人添 | 日韩精品无码一区二区中文字幕 | 亚洲中文字幕无码中文字在线 | 国产亚洲欧美日韩亚洲中文色 | 国产精品美女久久久网av | 一个人免费观看的www视频 | 欧美人妻一区二区三区 | 一本大道久久东京热无码av | 久久亚洲中文字幕无码 | 国产亚洲精品久久久久久久久动漫 | 人人妻人人澡人人爽人人精品 | 又黄又爽又色的视频 | 在线 国产 欧美 亚洲 天堂 | 国产午夜福利100集发布 | 毛片内射-百度 | 日本精品人妻无码77777 天堂一区人妻无码 | 无码乱肉视频免费大全合集 | 久久99精品久久久久久 | 一个人免费观看的www视频 | 大乳丰满人妻中文字幕日本 | 最新国产乱人伦偷精品免费网站 | 国产精品-区区久久久狼 | 好男人社区资源 | 极品尤物被啪到呻吟喷水 | 美女扒开屁股让男人桶 | 红桃av一区二区三区在线无码av | 国产精品国产三级国产专播 | 日日躁夜夜躁狠狠躁 | 日本爽爽爽爽爽爽在线观看免 | 精品无人国产偷自产在线 | 亚洲啪av永久无码精品放毛片 | 亚洲高清偷拍一区二区三区 | 欧美 亚洲 国产 另类 | 娇妻被黑人粗大高潮白浆 | 亚洲精品国产a久久久久久 | 久久精品国产精品国产精品污 | 成人欧美一区二区三区黑人免费 | 天天燥日日燥 | 日韩av无码一区二区三区不卡 | 夜先锋av资源网站 | 久久99热只有频精品8 | 日本又色又爽又黄的a片18禁 | 久久99精品久久久久久动态图 | 蜜臀av无码人妻精品 | 久久99精品久久久久久动态图 | 男人和女人高潮免费网站 | 国内精品一区二区三区不卡 | 成人欧美一区二区三区黑人 | 国产xxx69麻豆国语对白 | 理论片87福利理论电影 | 欧美三级不卡在线观看 | 国精产品一品二品国精品69xx | 国产精品久久久久7777 | 亲嘴扒胸摸屁股激烈网站 | 内射后入在线观看一区 | 精品无人国产偷自产在线 | 久久久www成人免费毛片 | 日日碰狠狠躁久久躁蜜桃 | 98国产精品综合一区二区三区 | 无码纯肉视频在线观看 | 十八禁真人啪啪免费网站 | 亚洲欧美精品伊人久久 | 亚洲精品www久久久 | 久久人妻内射无码一区三区 | 人妻天天爽夜夜爽一区二区 | 四虎影视成人永久免费观看视频 | 久久久久久国产精品无码下载 | 国内揄拍国内精品少妇国语 | 久久久久亚洲精品男人的天堂 | 久久国产36精品色熟妇 | 欧美日韩色另类综合 | 六十路熟妇乱子伦 | 国产精品福利视频导航 | 中文字幕无码日韩欧毛 | 欧美一区二区三区视频在线观看 | 亚洲国产欧美日韩精品一区二区三区 | 国产午夜亚洲精品不卡 | 午夜成人1000部免费视频 | 99久久婷婷国产综合精品青草免费 | 免费看男女做好爽好硬视频 | 久久久中文久久久无码 | 中文字幕av伊人av无码av | 国产绳艺sm调教室论坛 | 动漫av一区二区在线观看 | 人人爽人人澡人人人妻 | 国产精品久久久一区二区三区 | 久久亚洲中文字幕精品一区 | 爱做久久久久久 | 熟妇人妻激情偷爽文 | 色欲久久久天天天综合网精品 | 无码乱肉视频免费大全合集 | 日本饥渴人妻欲求不满 | 亚洲国产精品美女久久久久 | 中文亚洲成a人片在线观看 | 无码毛片视频一区二区本码 | 亚洲 另类 在线 欧美 制服 | 国产激情无码一区二区app | 一本加勒比波多野结衣 | 国产乱人伦偷精品视频 | 女人被爽到呻吟gif动态图视看 | 疯狂三人交性欧美 | 国产熟妇另类久久久久 | 亚洲日韩乱码中文无码蜜桃臀网站 | 亚洲精品国偷拍自产在线麻豆 | 成人毛片一区二区 | 在线欧美精品一区二区三区 | 欧美人与动性行为视频 | 蜜臀aⅴ国产精品久久久国产老师 | 欧洲熟妇精品视频 | 女人被男人躁得好爽免费视频 | 青青青爽视频在线观看 | 欧美三级不卡在线观看 | 免费观看激色视频网站 | 少妇人妻av毛片在线看 | 欧美野外疯狂做受xxxx高潮 | 欧美一区二区三区视频在线观看 | 人妻无码αv中文字幕久久琪琪布 | 国模大胆一区二区三区 | 国产欧美熟妇另类久久久 | 国产手机在线αⅴ片无码观看 | 亚洲日韩乱码中文无码蜜桃臀网站 | www国产亚洲精品久久久日本 | 夜夜高潮次次欢爽av女 | 亚洲精品国偷拍自产在线观看蜜桃 | 中文字幕无码av波多野吉衣 | 午夜精品一区二区三区在线观看 | 亚洲成av人片天堂网无码】 | 99精品视频在线观看免费 | 日韩视频 中文字幕 视频一区 | 国产精品美女久久久网av | 人人妻人人澡人人爽人人精品浪潮 | 国产精品无码永久免费888 | 未满小14洗澡无码视频网站 | 少妇被粗大的猛进出69影院 | 国产精品国产自线拍免费软件 | 中文字幕人妻无码一区二区三区 | 四虎永久在线精品免费网址 | 国产色视频一区二区三区 | 亚洲日韩av一区二区三区中文 | 少妇无码av无码专区在线观看 | 国产成人精品一区二区在线小狼 | 真人与拘做受免费视频 | 少妇高潮一区二区三区99 | 国产亚洲精品久久久闺蜜 | 国产精品内射视频免费 | 奇米影视888欧美在线观看 | 亚洲综合另类小说色区 | 理论片87福利理论电影 | 纯爱无遮挡h肉动漫在线播放 | 97久久超碰中文字幕 | 一区二区三区乱码在线 | 欧洲 | 好屌草这里只有精品 | 纯爱无遮挡h肉动漫在线播放 | 婷婷丁香五月天综合东京热 | 国产综合色产在线精品 | 激情内射日本一区二区三区 | 无码乱肉视频免费大全合集 | 国产免费久久精品国产传媒 | 狠狠cao日日穞夜夜穞av | 免费无码的av片在线观看 | 少妇太爽了在线观看 | 国产成人精品无码播放 | 精品亚洲韩国一区二区三区 | 无码精品人妻一区二区三区av | 亚洲欧洲日本无在线码 | 国产av久久久久精东av | 国产9 9在线 | 中文 | 亚洲男人av香蕉爽爽爽爽 | 妺妺窝人体色www在线小说 | 亚洲娇小与黑人巨大交 | 中文字幕中文有码在线 | 夜精品a片一区二区三区无码白浆 | 日本va欧美va欧美va精品 | 久久午夜夜伦鲁鲁片无码免费 | 久久天天躁狠狠躁夜夜免费观看 | 精品无码国产自产拍在线观看蜜 | 午夜精品久久久内射近拍高清 | 国内丰满熟女出轨videos | 亚洲欧美国产精品久久 | 大地资源网第二页免费观看 | 精品偷拍一区二区三区在线看 | 久9re热视频这里只有精品 | 国产精品亚洲一区二区三区喷水 | 熟女体下毛毛黑森林 | 2019午夜福利不卡片在线 | 欧美成人午夜精品久久久 | 狂野欧美性猛xxxx乱大交 | 任你躁在线精品免费 | 国产成人无码区免费内射一片色欲 | 亚洲综合伊人久久大杳蕉 | 欧美激情综合亚洲一二区 | 一本大道久久东京热无码av | 色五月丁香五月综合五月 | 四虎国产精品免费久久 | 国产精品久久久久久无码 | 国产成人亚洲综合无码 | 亚洲va欧美va天堂v国产综合 | 综合网日日天干夜夜久久 | 国产高潮视频在线观看 | 丰满人妻被黑人猛烈进入 | 青青草原综合久久大伊人精品 | 色一情一乱一伦一区二区三欧美 | 老熟妇乱子伦牲交视频 | 天天综合网天天综合色 | 亚洲s色大片在线观看 | 久久久久成人片免费观看蜜芽 | 97夜夜澡人人双人人人喊 | 国产午夜亚洲精品不卡下载 | 国产精品人妻一区二区三区四 | 国产乱人伦av在线无码 | 激情爆乳一区二区三区 | 无码人妻黑人中文字幕 | 亚拍精品一区二区三区探花 | 久久久精品人妻久久影视 | 日韩av无码一区二区三区 | 欧美熟妇另类久久久久久不卡 | 国产色精品久久人妻 | 成人免费视频视频在线观看 免费 | 任你躁国产自任一区二区三区 | av无码久久久久不卡免费网站 | 精品乱子伦一区二区三区 | 国产人妻精品一区二区三区不卡 | 亚洲欧洲日本综合aⅴ在线 | 无码人妻出轨黑人中文字幕 | 成人欧美一区二区三区黑人 | 久久精品中文字幕一区 | 乌克兰少妇性做爰 | 中文字幕无码av波多野吉衣 | 欧洲精品码一区二区三区免费看 | 老子影院午夜精品无码 | 亚洲成在人网站无码天堂 | 久久综合激激的五月天 | 精品偷拍一区二区三区在线看 | 亚洲狠狠色丁香婷婷综合 | 亚洲自偷自偷在线制服 | 中文字幕乱码人妻无码久久 | 国色天香社区在线视频 | 亚洲精品一区二区三区在线 | 我要看www免费看插插视频 | 福利一区二区三区视频在线观看 | 97久久精品无码一区二区 | 亚洲国产精华液网站w | 国产免费观看黄av片 | 小泽玛莉亚一区二区视频在线 | 女高中生第一次破苞av | 性史性农村dvd毛片 | 国产又爽又猛又粗的视频a片 | 日韩亚洲欧美中文高清在线 | 国产无套内射久久久国产 | 黑人粗大猛烈进出高潮视频 | 永久免费观看美女裸体的网站 | 久久精品视频在线看15 | 小sao货水好多真紧h无码视频 | 欧美激情内射喷水高潮 | 久久99精品久久久久久动态图 | 亲嘴扒胸摸屁股激烈网站 | 强辱丰满人妻hd中文字幕 | 中文字幕无码人妻少妇免费 | 亚洲一区二区三区含羞草 | 中文字幕+乱码+中文字幕一区 | 丰满人妻精品国产99aⅴ | 日日摸天天摸爽爽狠狠97 | 在教室伦流澡到高潮hnp视频 | 精品国产青草久久久久福利 | 亚洲国产精品久久人人爱 | 97人妻精品一区二区三区 | 欧美国产日韩亚洲中文 | 免费无码肉片在线观看 | 国产精品久久国产精品99 | 亚洲国产精品久久久天堂 | 国产精品久久久久9999小说 | 亚洲毛片av日韩av无码 | 亚洲中文字幕久久无码 | 中文字幕日韩精品一区二区三区 | 中文字幕人妻无码一区二区三区 | 亚洲中文字幕久久无码 | 婷婷五月综合激情中文字幕 | 国产激情无码一区二区 | 国产农村妇女高潮大叫 | 国产精品久久久一区二区三区 | 男人和女人高潮免费网站 | 无码纯肉视频在线观看 | 国产sm调教视频在线观看 | 成人免费视频在线观看 | 婷婷五月综合缴情在线视频 | 99久久人妻精品免费二区 | 日日躁夜夜躁狠狠躁 | 色综合久久88色综合天天 | 亚洲欧美国产精品久久 | 久久亚洲精品中文字幕无男同 | 国产色精品久久人妻 | www国产亚洲精品久久网站 | 婷婷色婷婷开心五月四房播播 | 亚洲日韩av一区二区三区四区 | 亚洲成色在线综合网站 | 久久久久久久女国产乱让韩 | 国产精华av午夜在线观看 | 国产精品美女久久久网av | 日欧一片内射va在线影院 | 亚洲精品午夜国产va久久成人 | av人摸人人人澡人人超碰下载 | 日韩精品乱码av一区二区 | 久久精品国产99久久6动漫 | 97色伦图片97综合影院 | 国产精品.xx视频.xxtv | 欧美成人高清在线播放 | 牲欲强的熟妇农村老妇女 | 亚洲国产一区二区三区在线观看 | 丰满护士巨好爽好大乳 | 成人影院yy111111在线观看 | 国产午夜视频在线观看 | 人人妻人人澡人人爽人人精品浪潮 | 日本饥渴人妻欲求不满 | 国内综合精品午夜久久资源 | 欧美日本免费一区二区三区 | 欧洲精品码一区二区三区免费看 | 无码国产激情在线观看 | 少妇无码吹潮 | 99久久99久久免费精品蜜桃 | 亚洲 a v无 码免 费 成 人 a v | 99久久精品日本一区二区免费 | 欧美黑人巨大xxxxx | 俄罗斯老熟妇色xxxx | 中文字幕久久久久人妻 | 欧美精品在线观看 | 亚洲国产精品久久人人爱 | 中文字幕亚洲情99在线 | 国产凸凹视频一区二区 | 亚洲成av人在线观看网址 | 国产猛烈高潮尖叫视频免费 | 亚洲 a v无 码免 费 成 人 a v | 亚洲精品午夜国产va久久成人 | 男人扒开女人内裤强吻桶进去 | av在线亚洲欧洲日产一区二区 | 无码av中文字幕免费放 | 亚洲色欲色欲天天天www | 综合激情五月综合激情五月激情1 | 美女黄网站人色视频免费国产 | 波多野结衣高清一区二区三区 | 永久免费观看国产裸体美女 | 亚洲娇小与黑人巨大交 | 男人扒开女人内裤强吻桶进去 | 精品国产福利一区二区 | 亚洲色大成网站www国产 | 亚洲中文字幕在线无码一区二区 | 国产精品久久久久久久影院 | 在线欧美精品一区二区三区 | 亚洲一区av无码专区在线观看 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | yw尤物av无码国产在线观看 | 暴力强奷在线播放无码 | 亚洲精品久久久久久一区二区 | 亚洲人成无码网www | 成人精品一区二区三区中文字幕 | 激情亚洲一区国产精品 | 骚片av蜜桃精品一区 | 欧洲熟妇精品视频 | 丁香啪啪综合成人亚洲 | 亚洲色在线无码国产精品不卡 | 久久无码专区国产精品s | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 国产精品办公室沙发 | 国产xxx69麻豆国语对白 | 国产精品久久久 | 中文字幕 亚洲精品 第1页 | 精品欧美一区二区三区久久久 | 男女下面进入的视频免费午夜 | 国产欧美亚洲精品a | 成人毛片一区二区 | 未满成年国产在线观看 | 国产超级va在线观看视频 | 精品成人av一区二区三区 | 国产成人无码专区 | 亚洲精品久久久久avwww潮水 | 免费国产黄网站在线观看 | 1000部啪啪未满十八勿入下载 | 成人一在线视频日韩国产 |