久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

編譯器前端實(shí)戰(zhàn):遞歸下降、AST構(gòu)建與錯(cuò)誤恢復(fù)指南

編譯器前端實(shí)戰(zhàn):遞歸下降、AST構(gòu)建與錯(cuò)誤恢復(fù)指南 簡(jiǎn)介一份面向編譯原理課程設(shè)計(jì)的實(shí)現(xiàn)報(bào)告適合計(jì)算機(jī)專(zhuān)業(yè)本科生或需要在課設(shè)中完成編譯器前端模塊的讀者參考。內(nèi)容圍繞簡(jiǎn)單文法編譯器前端展開(kāi)涵蓋詞法分析、遞歸下降語(yǔ)法分析、語(yǔ)義分析、四元式中間代碼生成并擴(kuò)展了常量、數(shù)組、if-else 與 while 語(yǔ)句等文法同時(shí)簡(jiǎn)述后端目標(biāo)代碼生成流程可幫助理解從源碼到中間代碼的完整構(gòu)造思路。文中包含設(shè)計(jì)任務(wù)、總體流程、數(shù)據(jù)結(jié)構(gòu)與算法、程序流程圖、實(shí)驗(yàn)結(jié)果及結(jié)論等模塊并給出遞歸子程序調(diào)用??煺张c四元式生成實(shí)例能直觀看到編譯過(guò)程的關(guān)鍵處理。資源為 1 個(gè) docx 文檔壓縮包約 381KB便于直接查閱或?qū)φ照n程設(shè)計(jì)要求修改復(fù)用該報(bào)告已有 693 人學(xué)習(xí)適合作為課程設(shè)計(jì)選題、報(bào)告結(jié)構(gòu)或代碼實(shí)現(xiàn)方面的參考樣例。1. 一個(gè)“簡(jiǎn)單”文法編譯器前端難點(diǎn)到底在哪很早之前A同學(xué)給我看他自己寫(xiě)的編譯器前端詞法分析器用正則硬掃語(yǔ)法分析器選了經(jīng)典的遞歸下降。代碼寫(xiě)得很規(guī)矩一跑卻出了怪事解析“12*3”這種三行表達(dá)式結(jié)果永遠(yuǎn)是把加法放在根節(jié)點(diǎn)乘法縮在右子樹(shù)里優(yōu)先級(jí)整個(gè)是反的。再試?yán)ㄌ?hào)程序直接棧溢出評(píng)論區(qū)一句“這是傳統(tǒng)的左遞歸問(wèn)題”把他晾在原地。這類(lèi)問(wèn)題在所謂“簡(jiǎn)單”的文法編譯器前端里特別常見(jiàn)。它看起來(lái)只有詞法、語(yǔ)法、抽象語(yǔ)法樹(shù)三段真動(dòng)手時(shí)坑全在“文法”與代碼的縫里左遞歸、公共前綴、優(yōu)先級(jí)分層、回溯、錯(cuò)誤定位哪一件不處理都跑不順。這篇筆記就按我實(shí)際搭一個(gè)最小前端時(shí)的順序來(lái)寫(xiě)先講模塊怎么切、文法怎么設(shè)計(jì)再給一個(gè)能運(yùn)行的遞歸下降實(shí)現(xiàn)最后盤(pán)點(diǎn)那些不看會(huì)翻車(chē)的邊角問(wèn)題。它不打算做完整語(yǔ)言的編譯器目標(biāo)是把“簡(jiǎn)單文法”的前端從能跑變成扛得住用適合正在學(xué)編譯原理的同學(xué)也適合要給自己的小語(yǔ)言快速搭前端的從業(yè)者。2. 先把前端流水線畫(huà)清楚詞法、語(yǔ)法與AST的職責(zé)與選型很多人一上來(lái)就寫(xiě)代碼結(jié)果詞法和語(yǔ)法的邊界反復(fù)改今天覺(jué)得數(shù)字識(shí)別該歸語(yǔ)法管明天又覺(jué)得括號(hào)匹配該在詞法里做。其實(shí)前端順序很固定源碼先進(jìn)詞法分析器產(chǎn)出 token 流token 流進(jìn)語(yǔ)法分析器按文法產(chǎn)生抽象語(yǔ)法樹(shù)AST。中間不需要第二個(gè)接口AST 就是前端交付給后端的唯一產(chǎn)品。把這條線畫(huà)清后面的大部分選擇都是順理成章的。2.1 詞法分析器手寫(xiě)掃描、正則庫(kù)還是自動(dòng)生成器詞法分析器的任務(wù)不是“看懂代碼”而是把字符串切成有類(lèi)型的 token。它一般只做四件事跳過(guò)空白和注釋、識(shí)別一個(gè)字面量數(shù)字、標(biāo)識(shí)符、識(shí)別一個(gè)符號(hào)、-、*、/、括號(hào)、分號(hào)以及記錄這個(gè) token 在源碼中的行號(hào)和列號(hào)。對(duì)于一個(gè) token 類(lèi)型保持在 20 個(gè)以?xún)?nèi)、不帶復(fù)雜字符串轉(zhuǎn)義的文法我通常直接手寫(xiě)一個(gè)掃描循環(huán)。理由有三第一線性掃描一個(gè)字符一個(gè)字符地推進(jìn)邏輯透明出錯(cuò)時(shí)用 debugger 跟一遍就能看出問(wèn)題第二報(bào)錯(cuò)信息可以精確到“第幾行第幾列的某個(gè)字符無(wú)法識(shí)別”這對(duì)后面的語(yǔ)法報(bào)錯(cuò)非常關(guān)鍵第三不需要維護(hù)任何生成配置改一個(gè) token 就是改幾行代碼的事。反過(guò)來(lái)如果哪天要支持多行字符串、嵌套注釋、模板字符串這類(lèi)狀態(tài)敏感的語(yǔ)法手寫(xiě)掃描會(huì)迅速變成狀態(tài)機(jī)地獄那時(shí)候用 flex 這類(lèi)自動(dòng)生成器或者成熟的詞法庫(kù)更劃算它們?cè)陂L(zhǎng)輸入和復(fù)雜狀態(tài)切換上已經(jīng)被大量驗(yàn)證過(guò)。也有一種中間做法在 Python、JS 這類(lèi)語(yǔ)言里用正則庫(kù)一條一條地匹配。它適合快速驗(yàn)證但有個(gè)硬傷——大部分正則庫(kù)默認(rèn)從當(dāng)前位置開(kāi)始匹配并返回第一個(gè)成功項(xiàng)順序?qū)懙蒙杂衅頸f和ifx就會(huì)被切錯(cuò)而且正則引擎的內(nèi)部回溯在遇到超長(zhǎng)輸入時(shí)很難控制。所以我自己的規(guī)則很簡(jiǎn)單演示可以工程上不推薦。2.2 語(yǔ)法分析器遞歸下降、LL(1) 表驅(qū)動(dòng)還是 LR 生成器語(yǔ)法分析器的選擇比詞法更影響開(kāi)發(fā)節(jié)奏。常見(jiàn)路線四條手寫(xiě)遞歸下降、LL(1) 表驅(qū)動(dòng)、LR(1)/LALR 生成器yacc/bison 這類(lèi)、以及 ANTLR 這種基于自適應(yīng) LL(*) 的生成器。我手頭這個(gè)“簡(jiǎn)單文法”項(xiàng)目默認(rèn)選手寫(xiě)遞歸下降因?yàn)樗臀姆ńY(jié)構(gòu)是一一對(duì)應(yīng)的文法里的一條產(chǎn)生式在代碼里就是一個(gè)函數(shù)產(chǎn)生式右側(cè)的每個(gè)符號(hào)就是函數(shù)里的一個(gè)調(diào)用或匹配動(dòng)作。這種對(duì)應(yīng)關(guān)系讓排查非常舒服——文法第 3 行有問(wèn)題直接去第 3 個(gè)函數(shù)里找狀態(tài)。表驅(qū)動(dòng)雖然也適合 LL(1)但那張預(yù)測(cè)分析表是二維的每次想加一條產(chǎn)生式得先重新算 FIRST 和 FOLLOW再翻表格心智負(fù)擔(dān)比遞歸下降大得多。LR 生成器能處理更大的文法集合可一旦出現(xiàn)沖突報(bào)錯(cuò)信息像天書(shū)對(duì)“簡(jiǎn)單”項(xiàng)目來(lái)說(shuō)屬于殺雞用牛刀還磨刀。那什么時(shí)候該換工具我的判斷標(biāo)準(zhǔn)是文法迭代速度。如果一周要改十幾次文法手寫(xiě)函數(shù)跟著改十幾次太累這時(shí)用 ANTLR 這類(lèi)生成器改完文法重新生成代碼反而效率最高。簡(jiǎn)單項(xiàng)目里更常見(jiàn)的情形是文法基本穩(wěn)定只需要在函數(shù)里不斷調(diào)整構(gòu)建 AST 的動(dòng)作遞歸下降依然是最舒服的姿勢(shì)。2.3 token 與 AST 的數(shù)據(jù)契約先定死再動(dòng)手前后端之間必須有一份穩(wěn)定的數(shù)據(jù)契約否則今天給 parser 一個(gè)字符串?dāng)?shù)組明天改成帶位置的字典接口每動(dòng)一次兩側(cè)的代碼全要跟著改。我一般把契約固定成兩個(gè)結(jié)構(gòu)。token 最小結(jié)構(gòu)是四元組kindtoken 類(lèi)型如NUM/PLUS/IDENT、value字面量原文或解析后的值、line、col。其中col我習(xí)慣記“該 token 起始字符的列號(hào)”而不是結(jié)束位置因?yàn)閳?bào)錯(cuò)要指出的是“從哪里開(kāi)始出錯(cuò)”。AST 節(jié)點(diǎn)最小結(jié)構(gòu)是三元組type節(jié)點(diǎn)類(lèi)型如binop/number/name、value可選保存運(yùn)算符或字面量值、children有序子節(jié)點(diǎn)列表。注意區(qū)分語(yǔ)法樹(shù)和 AST語(yǔ)法樹(shù)會(huì)保留每一個(gè)產(chǎn)生式的展開(kāi)痕跡包括很多冗余節(jié)點(diǎn)AST 則把括號(hào)、分隔符這類(lèi)純語(yǔ)法信息丟到結(jié)構(gòu)里比如(12)*3的括號(hào)在 AST 中根本沒(méi)有節(jié)點(diǎn)它的層級(jí)關(guān)系直接把“括號(hào)內(nèi)先算”表達(dá)掉了。后端的語(yǔ)義分析和代碼生成拿到的應(yīng)當(dāng)只是 AST而不是 token 流或語(yǔ)法樹(shù)這個(gè)約定越早定下來(lái)越好。3. 文法設(shè)計(jì)先行分層、消左遞歸與提左因子決定天花板我寫(xiě)前端的順序和大部分人相反先寫(xiě)文法再寫(xiě)代碼。文法不是寫(xiě)代碼之前的文檔它是前端的地基分層分不好后面代碼怎么寫(xiě)都別扭。上機(jī)驗(yàn)證過(guò)太多次文法設(shè)計(jì)階段省下的半小時(shí)會(huì)在調(diào)試階段用兩小時(shí)還回去。3.1 按運(yùn)算優(yōu)先級(jí)把文法分成三層以最常用的四則運(yùn)算表達(dá)式為例最簡(jiǎn)單的做法是把優(yōu)先級(jí)直接分層嵌入文法。標(biāo)準(zhǔn) EBNF 寫(xiě)法如下expr :: term (( | -) term)* ; term :: factor ((* | /) factor)* ; factor :: NUMBER | IDENT | ( expr ) ;這里的關(guān)鍵是“層”的順序優(yōu)先級(jí)最低的運(yùn)算符放在最外層優(yōu)先級(jí)最高的放在最底層解析factor作為原子單元要么是數(shù)字、變量要么是用括號(hào)包裹的整個(gè)表達(dá)式。expr處理加減時(shí)它的運(yùn)算對(duì)象是term而term已經(jīng)先把乘除算完了所以12*3解析出來(lái)一定是1 (2*3)的結(jié)構(gòu)。這個(gè)分層還被另一個(gè)事實(shí)反推著文法中每多一層遞歸下降代碼里就多一個(gè)函數(shù)。所以“簡(jiǎn)單”不是指層數(shù)少而是指每層只解決一件事。等你要往語(yǔ)言里加比較運(yùn)算、邏輯運(yùn)算時(shí)照這個(gè)模式繼續(xù)往上疊層or_expr包and_exprand_expr包equality_expr一層一個(gè)職責(zé)優(yōu)先級(jí)天然成立。3.2 左遞歸和公共前綴文法的兩處必改點(diǎn)教科書(shū)上寫(xiě)表達(dá)式文法常寫(xiě)成expr :: expr term這叫做直接左遞歸因?yàn)楫a(chǎn)生式左側(cè)的非終結(jié)符一開(kāi)頭又出現(xiàn)了自己。遞歸下降函數(shù)一旦照這個(gè)文法寫(xiě)解析第一個(gè) token 就會(huì)無(wú)限調(diào)用自身直到棧溢出。所以實(shí)現(xiàn)前必須把它改成右遞歸或 EBNF 循環(huán)式expr :: term expr_tail ; expr_tail :: ( term) expr_tail | ε ;這個(gè)改法保持了“加減是左結(jié)合”的語(yǔ)義同時(shí)讓遞歸下降在每一層只消耗一個(gè)運(yùn)算符再遞歸下降到尾部不會(huì)死循環(huán)。實(shí)際寫(xiě)代碼時(shí)expr_tail很少單獨(dú)做成函數(shù)而是直接用 while 循環(huán)代替這點(diǎn)下一章會(huì)看到。另一個(gè)必改點(diǎn)是公共前綴。比如文法里同時(shí)有if ( expr ) stmt和if ( expr ) stmt else stmt兩條產(chǎn)生式它們都以if ( expr ) stmt開(kāi)頭。如果照抄遞歸下降解析到if之后必須做出選擇但當(dāng)下根本沒(méi)有足夠信息判斷后面有沒(méi)有else只能往兩條路都試——這是回溯的根源。解決辦法是提取左因子stmt :: if ( expr ) stmt else_part ; else_part :: else stmt | ε ;把公共前綴提出來(lái)把“有沒(méi)有 else”這個(gè)決策推遲到else_part處處理。這樣解析器始終是單路徑的不用試錯(cuò)也不會(huì)有指數(shù)級(jí)回溯的隱患。3.3 優(yōu)先級(jí)靠文法分層結(jié)合性靠遞歸方向兩者別混這是新手最容易混的地方。優(yōu)先級(jí)解決的是“先算誰(shuí)”結(jié)合性解決的是“同優(yōu)先級(jí)時(shí)從左還是從右算”。expr :: term ((|-) term)*寫(xiě)成循環(huán)默認(rèn)是左結(jié)合因?yàn)槊孔x到一個(gè)運(yùn)算符就把左邊的結(jié)果和右邊的term合成新節(jié)點(diǎn)天然形成左深樹(shù)。如果需要一個(gè)右結(jié)合運(yùn)算符比如賦值或乘方^做法不是在這個(gè)循環(huán)里做特殊判斷而是單寫(xiě)一層右遞歸文法assign :: IDENT assign | expr ;這里assign右側(cè)又出現(xiàn)assign遞歸下降解析時(shí)會(huì)一直向右展開(kāi)形成右深樹(shù)。把“結(jié)合性”放到文法層代碼層就只管照著遞歸方向建節(jié)點(diǎn)兩者一一對(duì)應(yīng)調(diào)試時(shí)不至于為了一個(gè)運(yùn)算符寫(xiě)一堆 if 特例。我見(jiàn)過(guò)有人為了省錢(qián)在平鋪文法上用代碼手動(dòng)調(diào)整左右子樹(shù)結(jié)果打印 AST 一看有的節(jié)點(diǎn)前序?qū)τ械暮笮驅(qū)Ω?jié)點(diǎn)位置還隨輸入長(zhǎng)度變化最后整層返工。4. 手寫(xiě)遞歸下降落地可跑通的最小前端與關(guān)鍵參數(shù)到這一步文法已經(jīng)定了表達(dá)式語(yǔ)言支持?jǐn)?shù)字、變量、四則運(yùn)算、括號(hào)。下面給一個(gè)能直接運(yùn)行的最小實(shí)現(xiàn)按照上一章的文法分層來(lái)寫(xiě)。語(yǔ)言用 Python原因是結(jié)構(gòu)表達(dá)清晰、跑起來(lái)零依賴(lài)核心邏輯可以照搬到任何語(yǔ)言。4.1 詞法部分Token 定義與線性掃描器先定義 token 結(jié)構(gòu)和詞法分析器把行號(hào)、列號(hào)在掃描時(shí)記準(zhǔn)。class Token: def __init__(self, kind, value, line, col): self.kind kind # token 類(lèi)型NUM / IDENT / PLUS / MINUS / STAR / SLASH / LPAREN / RPAREN / EOF self.value value # 字面量原文例如 123、 self.line line # 起始行號(hào)從 1 開(kāi)始 self.col col # 起始列號(hào)從 1 開(kāi)始 class Lexer: def __init__(self, text): self.text text self.pos 0 # 當(dāng)前掃描位置指向下一個(gè)待處理字符 self.line 1 self.col 1 def _advance(self): ch self.text[self.pos] self.pos 1 if ch \n: self.line 1 self.col 1 else: self.col 1 return ch def peek(self, offset0): idx self.pos offset if idx len(self.text): return return self.text[idx] def next_token(self): while self.peek() and self.peek().isspace(): self._advance() if self.pos len(self.text): return Token(EOF, , self.line, self.col) line, col self.line, self.col ch self.peek() if ch.isdigit(): raw while self.peek().isdigit(): raw self._advance() return Token(NUM, raw, line, col) if ch.isalpha() or ch _: raw while self.peek().isalnum() or self.peek() _: raw self._advance() return Token(IDENT, raw, line, col) if ch in -*/(): op self._advance() kind_map {: PLUS, -: MINUS, *: STAR, /: SLASH, (: LPAREN, ): RPAREN} return Token(kind_map[op], op, line, col) raise SyntaxError(f第 {line} 行第 {col} 列出現(xiàn)無(wú)法識(shí)別的字符 {ch!r})這個(gè)掃描器的核心參數(shù)有兩個(gè)pos標(biāo)記字符消費(fèi)進(jìn)度line/col隨_advance維護(hù)。關(guān)鍵技巧是next_token里先把line, col存到局部變量再開(kāi)始消費(fèi)字符——因?yàn)開(kāi)advance會(huì)改掉這兩個(gè)值不提前保存所有 token 的位置都會(huì)變成結(jié)束位置。數(shù)字和標(biāo)識(shí)符都采用“讀到不再屬于本類(lèi)的字符為止”這就是最長(zhǎng)匹配的樸素實(shí)現(xiàn)。注意peek只做預(yù)讀不消費(fèi)所以數(shù)字掃描時(shí)不會(huì)把下一個(gè)字符吞掉。4.2 語(yǔ)法部分遞歸下降與 match 模式parser 層只維護(hù)一個(gè)前瞻 tokencurrent指向當(dāng)前正在處理的 tokenadvance消費(fèi)它并更新。match是統(tǒng)一入口類(lèi)型對(duì)得上就推進(jìn)對(duì)不上就拋出帶位置的語(yǔ)法錯(cuò)誤。class Parser: def __init__(self, lexer): self.lexer lexer self.current None self.advance() def advance(self): self.current self.lexer.next_token() return self.current def match(self, kind): if self.current.kind ! kind: raise SyntaxError( f第 {self.current.line} 行第 {self.current.col} 列 f期望 {kind}實(shí)際 {self.current.kind} ) return self.advance() def parse_expr(self): node self.parse_term() while self.current.kind in (PLUS, MINUS): op self.advance() right self.parse_term() node Node(binop, op.value, [node, right]) return node def parse_term(self): node self.parse_factor() while self.current.kind in (STAR, SLASH): op self.advance() right self.parse_factor() node Node(binop, op.value, [node, right]) return node def parse_factor(self): if self.current.kind NUM: tok self.advance() return Node(number, tok.value, []) if self.current.kind IDENT: tok self.advance() return Node(name, tok.value, []) if self.current.kind LPAREN: self.advance() node self.parse_expr() self.match(RPAREN) return node raise SyntaxError( f第 {self.current.line} 行第 {self.current.col} 列 f意外的 token {self.current.kind} )注意parse_expr里 while 循環(huán)是如何實(shí)現(xiàn)舊文法expr_tail的每遇到一個(gè)加減號(hào)就把已經(jīng)解析出的左節(jié)點(diǎn)和新的右節(jié)點(diǎn)合成binop。因?yàn)樾鹿?jié)點(diǎn)總把舊節(jié)點(diǎn)放在children[0]所以左結(jié)合語(yǔ)義被完整保留。parse_term同理只是把優(yōu)先級(jí)更低的運(yùn)算對(duì)象換成factor。這樣12*3解析時(shí)parse_expr第一次調(diào)parse_term后者先吃掉整個(gè)2*3加法節(jié)點(diǎn)自然掛在更外層。4.3 AST 節(jié)點(diǎn)與驗(yàn)證入口AST 節(jié)點(diǎn)僅需要type/value/children三個(gè)字段再加一個(gè)遞歸打印方法就夠了。驗(yàn)證入口建議直接打印樹(shù)形結(jié)構(gòu)而不是只輸出一個(gè)對(duì)象地址。class Node: def __init__(self, type, valueNone, childrenNone): self.type type self.value value self.children children if children is not None else [] def dump(self, indent0): line * indent f{self.type} if self.value is not None: line f {self.value} print(line) for child in self.children: child.dump(indent 1) def parse_source(text): lexer Lexer(text) parser Parser(lexer) ast parser.parse_expr() if parser.current.kind ! EOF: raise SyntaxError(f第 {parser.current.line} 行第 {parser.current.col} 列存在未消費(fèi)的 token) return ast代碼里最后一步檢查EOF經(jīng)常會(huì)被人漏掉。它的作用是保證整個(gè)輸入都被消費(fèi)完否則12 3這類(lèi)多個(gè)表達(dá)式連寫(xiě)的輸入會(huì)被靜默接受只解析出前半段。parse_source是外部唯一入口下游拿到的只應(yīng)是一個(gè)完整 AST。這套最小前端缺了語(yǔ)句層但如果要擴(kuò)展只需仿照expr加一個(gè)parse_stmt函數(shù)文法改三行代碼加三五行。5. 文法編譯器前端排查五個(gè)翻車(chē)場(chǎng)景與補(bǔ)救辦法前端跑不動(dòng)、結(jié)果不對(duì)絕大多數(shù)不是代碼寫(xiě)錯(cuò)而是文法與代碼的隱式約定被破壞。下面五條都是我在各種“簡(jiǎn)單”文法項(xiàng)目里真實(shí)踩過(guò)的坑每條按現(xiàn)象、原因、解決的順序拆開(kāi)方便對(duì)照排查。5.1 遞歸深入后棧溢出或卡死現(xiàn)象解析12時(shí)直接RecursionError或者程序看起來(lái)卡住不動(dòng)用調(diào)試器一看棧里全是同一個(gè)函數(shù)名。這個(gè)現(xiàn)象幾乎可以斷定是直接左遞歸漏網(wǎng)進(jìn)了代碼。原因文法寫(xiě)成expr :: expr term | term但遞歸下降的函數(shù)parse_expr第一行就調(diào)用了parse_exprtoken 還沒(méi)有被消費(fèi)每次調(diào)用都在原位置重進(jìn)。解決改文法把左遞歸改成循環(huán)式expr :: term ((|-) term)*代碼里用while而不是首行遞歸調(diào)用??焖倥挪榉椒z查每個(gè) parse 函數(shù)的函數(shù)體確認(rèn)第一個(gè)遞歸調(diào)用之前至少消費(fèi)了一個(gè) token如果一個(gè)函數(shù)在沒(méi)有任何 token 消費(fèi)的情況下調(diào)用自己基本就是左遞歸的代碼化身。5.2 優(yōu)先級(jí)錯(cuò)亂AST 結(jié)構(gòu)不對(duì)現(xiàn)象解析12*3打印 AST 根節(jié)點(diǎn)是binop 沒(méi)錯(cuò)但右子樹(shù)居然也是binop 或者只有2乘號(hào)被掛在更下層解析(12)*3括號(hào)居然不起作用。原因絕大多數(shù)情況是文法分層沒(méi)做term和expr共用同一個(gè)層級(jí)或者 parse 函數(shù)里把、*放在同一個(gè) while 循環(huán)內(nèi)處理。解決回到第 3.1 節(jié)的文法逐層確認(rèn)expr - term、term - factor的調(diào)用鏈。AST 驗(yàn)證我用一個(gè)土辦法把1*23、12*3、(12)*3三組輸入并排打印肉眼檢查根節(jié)點(diǎn)和左右子樹(shù)的運(yùn)算符任何一組的根節(jié)點(diǎn)運(yùn)算符與預(yù)期優(yōu)先級(jí)不符就沿著調(diào)用的層數(shù)往上查。5.3 語(yǔ)法報(bào)錯(cuò)的位置永遠(yuǎn)指向行首或文件末尾現(xiàn)象錯(cuò)誤信息寫(xiě)“第 1 行第 1 列”或者明明在表達(dá)式中間出錯(cuò)位置卻指向整個(gè)輸入的末尾。原因Token 不帶位置信息或者詞法分析器在消費(fèi)完字符后才記錄line/col導(dǎo)致每個(gè) token 的位置都是結(jié)束位置又或者 parser 報(bào)錯(cuò)時(shí)拿的是advance之后的current。解決詞法層在next_token開(kāi)頭先把當(dāng)前l(fā)ine/col存下來(lái)帶著它構(gòu)造 Tokenparser 層在做假設(shè)時(shí)用當(dāng)前 token 的位置。注意一個(gè)隱蔽細(xì)節(jié)如果報(bào)錯(cuò)邏輯里先advance再取錯(cuò)誤位置位置會(huì)順移到下一個(gè) token所以匹配失敗要先取current.line/col再?zèng)Q定是否推進(jìn)。5.4 輸入稍長(zhǎng)就慢得不像線性現(xiàn)象解析一個(gè)幾百行的程序還能忍受到幾千行時(shí)肉眼可見(jiàn)地越跑越慢甚至出現(xiàn)指數(shù)級(jí)膨脹。原因解析器不是單路徑的它在某些決策點(diǎn)走了一條錯(cuò)路發(fā)現(xiàn)失敗再回頭如果公共前綴沒(méi)有提干凈比如if語(yǔ)句的兩個(gè)變體共用了大量前綴每次遇到if都要把整棵子樹(shù)嘗試兩遍復(fù)雜度直接炸開(kāi)。解決先做第 3.2 節(jié)的提取左因子把所有“先試 A 再試 B”的分支改成“讀完公共前綴再?zèng)Q策”。還有一個(gè)常見(jiàn)誤用在factor里先試著按數(shù)字解析失敗再按變量解析這種局部回溯其實(shí)無(wú)害因?yàn)橄牡氖遣煌?token 序列真正危險(xiǎn)的是兩個(gè)分支共享同一段 token 消耗那才是指數(shù)級(jí)的來(lái)源。排查時(shí)看 parse 函數(shù)里有沒(méi)有“嘗試性調(diào)用”有的話重點(diǎn)檢查兩個(gè)分支是否在同一 token 位置開(kāi)始。5.5 標(biāo)識(shí)符與關(guān)鍵字互相吞噬數(shù)字邊界切錯(cuò)現(xiàn)象把ifx識(shí)別成關(guān)鍵字或者123abc沒(méi)有報(bào)錯(cuò)而是拆成123和abc兩個(gè) token1.2.3這種非法數(shù)字也可能被部分接受。原因詞法分析器按順序匹配規(guī)則如果關(guān)鍵字正則排在標(biāo)識(shí)符前面任何以關(guān)鍵字開(kāi)頭的變量都會(huì)被吞數(shù)字掃描循環(huán)沒(méi)有判斷終止字符是否為字母或小數(shù)點(diǎn)。解決一類(lèi)修復(fù)路徑是“先識(shí)別完整標(biāo)識(shí)符再查關(guān)鍵字表”因?yàn)閕fx是完整標(biāo)識(shí)符不在表里自然不會(huì)被誤傷數(shù)字掃描則要求循環(huán)只在連續(xù)數(shù)字內(nèi)推進(jìn)遇到字母或第二個(gè)小數(shù)點(diǎn)立即結(jié)束并報(bào)錯(cuò)。邊界處理還有個(gè)參數(shù)可調(diào)是否允許數(shù)字后緊跟字母報(bào)錯(cuò)。我的習(xí)慣是報(bào)錯(cuò)因?yàn)?23abc幾乎一定是用戶(hù)漏寫(xiě)了運(yùn)算符靜默拆成兩個(gè) token 會(huì)把錯(cuò)誤埋到語(yǔ)法層導(dǎo)致報(bào)錯(cuò)信息看不懂。6. 讓前端更扛錯(cuò)錯(cuò)誤恢復(fù)、同步 token 與 AST 驗(yàn)證前端的價(jià)值不只體現(xiàn)在能解析合法代碼還體現(xiàn)在遇到非法代碼時(shí)能繼續(xù)報(bào)出更多錯(cuò)誤。一個(gè)錯(cuò)誤就停的解析器在長(zhǎng)文件上體驗(yàn)極差用戶(hù)修完第一個(gè)錯(cuò)還要再次編譯才知道第二個(gè)錯(cuò)在哪。所以我會(huì)在 parser 里加上最小限度的錯(cuò)誤恢復(fù)做法是經(jīng)典的 panic mode。所謂 panic mode就是在語(yǔ)法錯(cuò)誤發(fā)生后不停留在原地糾結(jié)而是跳過(guò)一批 token直到遇到一個(gè)“同步 token”再繼續(xù)解析。同步 token 的選擇要配合文法邊界語(yǔ)句結(jié)束的分號(hào)、右括號(hào)、EOF都適合。下面這段是expect的恢復(fù)版本可以替換基礎(chǔ)版match在語(yǔ)句層使用。SYNC_KINDS {SEMI, RPAREN, EOF} def expect(self, kind): if self.current.kind kind: return self.advance() self.errors.append( f第 {self.current.line} 行第 {self.current.col} 列 f期望 {kind}實(shí)際 {self.current.kind} ) while self.current.kind not in SYNC_KINDS: self.advance() return None注意這個(gè)版本只適合語(yǔ)句層的匹配不能用在表達(dá)式內(nèi)部。表達(dá)式里誤吃一個(gè)右括號(hào)后面整段結(jié)構(gòu)都會(huì)亂而語(yǔ)句層用分號(hào)同步能保證錯(cuò)誤后至少能繼續(xù)識(shí)別下一條語(yǔ)句。錯(cuò)誤恢復(fù)后的 AST 是不完整的下游做語(yǔ)義分析前必須檢查errors列表非空就只報(bào)錯(cuò)不繼續(xù)。我把錯(cuò)誤收集和 AST 構(gòu)建解耦就是為了避免“AST 缺了一截還拿去分析”的情況。驗(yàn)證方面除了第 4 章的 AST 打印我還會(huì)維護(hù)一組“用例對(duì)照表”每個(gè)用例保存預(yù)期根節(jié)點(diǎn)類(lèi)型和錯(cuò)誤數(shù)。正常用例檢查優(yōu)先級(jí)和結(jié)合性異常用例檢查報(bào)錯(cuò)位置是否精確。比如12*3期待根節(jié)點(diǎn)binop 12 3期待錯(cuò)誤且錯(cuò)誤位置指向3這類(lèi)表跑一遍勝過(guò)手動(dòng)點(diǎn)十次。最值得留意的驗(yàn)證是“改動(dòng)文法后回歸全表”因?yàn)榍岸烁囊惶幬姆ㄍ鶢窟B parser 函數(shù)和錯(cuò)誤位置不回歸很難發(fā)現(xiàn)某個(gè)角落里優(yōu)先級(jí)悄悄變了。這段路我走得不算順。最早做前端時(shí)我也是先寫(xiě)代碼再補(bǔ)文法結(jié)果一半時(shí)間花在追優(yōu)先級(jí)錯(cuò)亂和棧溢出的玄學(xué)問(wèn)題上后來(lái)改成“文法先行、代碼對(duì)照文法”同樣的功能只用一半時(shí)間落地報(bào)錯(cuò)還更準(zhǔn)。每當(dāng)有人拿著調(diào)試到崩潰的前端來(lái)找我我第一句問(wèn)的永遠(yuǎn)是“你的文法文件在哪”。先讓文法立住代碼才有資格談踩坑。希望這些場(chǎng)景能幫你在自己的前端里少繞幾個(gè)彎路。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
Julia Annxxxxx| 亚洲美乱| 亚洲人妻在线精品| 久久天堂网| 性欧美天天| 欧美99热| 激情五月天社区| 国产激情视频一区区三区| 丝袜高跟澳门91视频| 亚洲情色91| 国产麻豆一级精品视频| 高清国产av无码| 国产精品欧美日韩久久| 熟妇xxxxx性春色| 精品九九九九九九| 91亚洲网站| 国产免费一区| 久久精品操| 色综和网| 欧美日韩婷婷中文| 欧美天天综| 91ise欧美| 操操AV电影| 成人午夜视频免费播放| www网站黄| 九九热精品| 国产激情av女片自拍| 午夜一级免费毛片| 成人情色一区二区| 啊嗯好大视频在线观看| 骚乳在线| 97超碰亚洲| 亚洲情色在线| 人妻素股| 欧美日韩妖精91com| 久久久久9999精品九九九| www老逼91| 欧美1727免费观看视频| 偷拍网站久久男女男| 9久精品| 欧亚性爱视频免费看| 久久毛卡| 欧美性爱另类综合| 啊啊啊啊啊在线观看网址| 厕所偷拍在线| 色超碰综合| 亚洲成人妻日韩在线| 久久超碰98| 色偷偷超碰亚洲| 九九人妻| 国产精品久久久久久久电影渣男| 乱伦av麻豆| 7777欧美成是人在线观看| 日本高清有码网址视频| 国产久久视频| 日韩欧美中文字| 日本 情色 1区2区3区| 97在线观看免费| 久久精品六区| 亚洲伊人a线观看视频| 日韩探花精品在线视频| 小草精彩毛片| 日韩不卡网操逼中文字幕日韩| 日韩专区久久久| 亚洲少妇视频| 成人麻豆av电影网站| 国产亚洲精品第一最新| 欧美黑人XXXⅩ高潮交| 亚洲少妇在线影音| 夜夜欢天天干| 操比国产| 97视频在线观看高清资源| 九九九九97| 国产精品噜噜噜日日日| 欧美激情视频在线一区| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 色激情综合网站| 免费一级特黄特色大片在线观看看 | 日韩欧美女优电影| 91爱欧美| 精品人妻1区| 婷婷五月综合在线| 免费超碰97久久| 啪啪啪综合网| 99操碰| 91欧美美女日韩国产婷婷| 人妻少妇无码| 亚洲精品啪视频| 18一区二区三区| 超碰偷拍| 精品人体无圣光凹凸| 人人喜人人妻| 人人做天天爱| 97av,com| 顶级丝袜熟女一区二区三区 | 无码精品啪啪啪一区二区三区三州| 91制服丝袜| 欧美日韩国产三级黄色| 亚洲人在线成线成人| 97在线视频观看免费| 91精品亚洲内射孕妇| 中文字幕国产精品1区| 欧美日韩人妻精品系列一区二区三区| 性开放中文AV高清无码免费看| 中文啪啪视频| 国产精品久久久久婷婷二区次| 国产日韩精品人妻久久久久色欲网站 | 日本不卡三级网在线播放| 99热这里只有精品1| 中国女人内射6XXXXX| 男人下部插入女人下部 | 日韩一级二级三级在线不卡观看完整| 精品国产乱码久久久影院| 999久久久免费精品国产牛牛| 日韩另类| 亚洲色人| 久久一二三四不卡 | 超碰是碰在线观看| 多乙久久久久久| 级品肉射| 精品国产丝袜一区二区三区乱码| 老熟妇一区二区三区啪啪| 人妻色偷色噜| 宅男91视频在线播放| 日韩色香| 色好看av| 欧美东京热精品A∨| 性欧美精| 91在线无码精品秘 软件| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 人人看人人插| 日日干男人的天堂| 国产中文字幕曰本毛片| 久热99999| 综合自拍| 999精品久久久久久久| 99色视频| 人人干人人操人人..com| 思思视频免费看网站| 四季AV综合网址| 一区不卡在线观看av| 啊啊啊不要好爽日韩无码一区| 无码 黑人一区二区三区| 青青草色情网站视频| 99精品欧美一区二区三区桃色| 青青草大香蕉在线视频| 日本 欧美 国产一区| 日日摸日日弄日日拍| 午夜精品久久久久久久男人的天堂| 黑人综合网| 伊人丝袜美腿高跟在线观看高清| 国产精品99久久久www| 欧美色视| 偷拍片久久| aaa一级黄片| 青草精品视频日本久久久久网站在线| 人妻一区二区三区| 一区二区日韩欧美久久| 国产视频一区二区三区在线免费观看| 欧美线天码中字| 久久久草成人网站久久久草成人久久久草久久久 | 9999亚洲电影| 中文字幕永久在线| 韩三级a视频在线观看| 中文字幕二区| 在线观看A啊啊啊| 开心五月深爱五月| 国产日韩在线播放av| 亚州色图欧美色图| 久久婷婷欧美| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 中文字幕AV片| 好湿好紧视频| 人妻天天爽夜夜爽2| 亚洲18禁| 久久99黄色卞西瓜| 日欧操屄视频| 国产一级内射无挡观看| 日韩激情电影中文字幕| 国产999精品久久久| 91久久18禁| 色色无码| 九九热视频在线观看| 99久久久久久亚洲精品不卡| 久久99九九九九6666免费观看软件| 亚洲日韩少妇一道本视频| 中文字幕在线播放2中文字幕在线观看2 | 久久久免费一级黄片| 搡老熟女免费视频| 久久久夜夜夜| 五月天久久人妻| 亚州色图片在线色| www.AV有限公司一区| 手机av天堂久久久久| 免費黃色視頻觀看一| 国产精品久久久久久久久久梁医生| 伊人欧美大香蕉视频| 国产第11页| 亭亭丁香激情| 欧美中文字幕男人天堂久久精品| 成人 日韩欧美一区| 热九九精品| 无码人妻丰满热妇又大又粗| 久久综合av| 丝袜狠狠草尤物人妻av91| 一道本久久棕合爱| 精彩国产视频播放1区2区| 美腿色图| 激情欧美日韩女同久久| 亚洲综合图文| 久久久久久久久久精| 色www精品视频在线观看| 亚洲 图片 欧美 色图| 婷婷三区| 9999亚洲电影| 九一国产精品| 日韩日韩日韩-国产乱码精品一区二区| 台湾佬中文娱乐网久久久久久久久久com| 东京热av男人的天堂| 日本精品性生活久久久| 少妇人妻在线| 91人人操| 草莓精品视频在线免费观看| 国产精品自拍xxxx| 久久男女激情视频网站| 亚洲色色色| 亚洲日产专区| 日日夜夜模| 无码九九九九| 中文字幕乱亚洲美女精品一区| 又大又大又大又粗爽高潮观看| 亚洲成人激情小说视频| 八人操人人摸人人看| 999国产精品999| 亚洲少妇喷视频看| 午夜啊啊啊| 成人久久久精品| 天天久久久久久| 亚洲国产精品久久AV| www.yeyecao| 自拍鲍鱼一区在线高清观看免费| 亚洲精品一二三四区| 18禁久极品美女久久哦哟呀!| 亚洲九九视频在线观看| 久久伊人最新网址视频| 性爱乱伦网址| 激情亚洲天堂| 综合夜夜| 人人色人人操在线| 99啪啪| 91亚洲网站| 国产激情视频一区区三区| 操逼天美3区| 99无码| 亚洲成人色情五月天丁香花| 欧美黄色手机在线观看| 91|九色|国产熟女| 亚洲熟久久| 亚洲欧洲自拍| 亚洲激情四射| 超碰97在线色男人??| 欧美日韩1234| 加勒比无码一区二区三区| 绑缚麻绳人妻寝取完整版| 啊啊啊啊,啊啊好多水| 日韩极品无码B| 五月丁香婷婷色| 福利一级版子| 大学生口爆吞精| 嗯嗯嗯好爽| 人妻激情视频| a天堂视频| 亚州乱码中文字幕综合久久久| 亚春色色| 色欧美天天| 久久久久96| 中国少妇XXXX做受| 国产污视频麻豆传媒一区二区| 99夜夜操| 九九九九九九九精品视频| 亚洲天堂一区二区| 色成人Www精品永久观看| 欧美狠狠操| 久久只有精品| 性欧美体内射精| 老鸭窝成人免费毛片视频| 天天色播亚洲综合网站| 91热色| 亚洲系列第一页| 诱惑人妻欧美一区在线播放| 在线岛| 九九拍拍精品视频在线播放| 午夜视频好爽啊| 黄网站黄视频网站进入口| 91国产操逼视频| 97色五月天完| 自拍偷拍第26| 美女毛片999| 性爱视频免费网址| 很很很很操| 性在久久久久久| 97丝袜亚洲在线播放| 色欲蜜臀AV| 精品人妻一二三四区视频| 人人妻人人狠人人| 美女十八禁| 开心激情站| 91精品国产91久久青草| 91五月天| 第一高清av中文字幕| 亚洲骚逼少妇| 亚洲s在线观看| 不卡av免费在线网址| av操操不卡| 欧美午夜视频精品久久| 天天射天天色成人| 亚洲欧美爆| 日韩亚洲中文字幕在线| 夜色综合| 97 九色| 女人双腿搬开让男人桶| 欧州一区二区三区四区| 欧美激色| 天天影视综合网欧美精品| 亚洲国产丝袜熟女av| 丁香婷婷激情五月天无毒不卡| 黄色片,com| 后入式999| 丰满人妻-区二区三区免费| 97综合网| 99精品无码| 亚洲色堂免费视频| AV无码久久久精品| 欧美一级黄色免费专区| 亚洲精品乱码久久久久久蜜桃麻豆| 久久,精品一二三| 丁香五六月啪啪| 操老熟女AV| 天天肏美女| 美女一区二区国产精品| 日本人妻伦在线中文字幕| 好看的久久不射无码影视影院| 99超级碰免费视频| 日韩精品永久在线观看| 日本成熟少妇A∨网站| 97精品97久久| 日本淫色网| 第一高清av中文字幕| 99久久精品欧美国产| 人妻蜜桃臀| 91高跟美女在线播放| 亚洲成av人片色午夜乱码| 国产女大学生AV| 怡红院网站在线视频| 国产极品999| 国内毛片免费h片在线| 欧美精品日韩久久久九| 蜜乳视频网站| PMv在线观看| 骚女天天综合网| 91精品人妻五十路| 亚洲欧美日韩国产丝袜自拍中文| 天天舔九色婷婷| 中文字幕老熟妇黄色视频| 影音先锋国产精品| 97国产成人精品免费视频| 欧美日韩午夜精品一区二区三区| 三男一女不戴套的A片| 久久精品久久久久久久| 亚洲少妇自拍中文字幕懂色| 97丝袜亚洲在线播放| 91麻豆天美传媒HD| 熟妇熟女一区二三区| 亚洲有薄码区日本系列中文字幕| 欧美久久九九| 好吊色在线观看| 免费观看有码高清视频| 亚洲天堂电影精品一区| 五月丁香综合网| 国产成人网站在线观看| 99精品久久| 国产精品国产拍高清AV| 好吊妞转入那个网| 国产农村妇女精品1区二区| 91n美女视频| 青青爽| 91亚洲精品青草| 日本一区二区电影网站| 热久久国产精品视频大陆精品| 欧美性区| 97欧美久久久久久久| 另类专区加勒比| 天天欧美97| 麻豆亚洲AV成人无码久久精品| 精品人妻一区二区三区不卡断 | 国产免费一区二区在线A片视频| 国产精品熟女乱伦| 欧美天天插| 亚洲AV免费在线观看| 中文字幕天天天天天| 黄网站黄视频网站进入口| 亚洲精品骚逼| 久久人妻一区二区三区高清| 97手机日韩| 99久久久无码国产精品性啊聊| 欧美性xxxxx狂欢| 日韩无码操逼片| 精品一区二区综合熟妇| 日本三级中国三级99人妇网站| 国产欧美伊人| 欧美日韩大陆黑人少妇99| 久久久久久久久久久久欧美日| 久久青娱乐| 99999精品| 91人妻最真实刺激绿帽| 大香蕉乱伦视频网| 熟妇视频一区二区三区在线观看| 夜夜嗨免费视频| 亚洲精品人体| 亚洲国产精品无码AV在线| 五月婷婷六月天| 麻豆九九九| 成人情色综合网| 精品无码欧美三级| 丁香六月婷| 嗯嗯啊啊视频一区二区三区| 东京太热男人的天堂久久久| 狼狼色丁香久久婷婷综合五月| 亚洲图片偷拍视频区| 日韩伦理视频| 婷婷人妻激情| 久久精品中文字幕观看| 人人妻人人操人人乐| 久久人人爽av亚洲精品天堂桃色| 欧美精品久久96人妻无码| AV免费在线播放一区| 真实高潮91| 伊人久日| 欧美大香蕉同搞| 欧美三级一级| 91亚洲色图| 国产精品亚洲一区二区三区四区| 超碰97男人| 欧美色涩| 亚洲第一综合| 久操免费电影| 中国国国产一级特黄毛片| 一个人在线看的黄色电影网站| 91性网| 黄色av一区二区在线| 99亚洲人人| 亚洲一区日韩精品中文字幕 | 精品国产乱码久久久久久免费| 白丝被操91| 天美麻豆精品视频99| 九九九国产精品| 国产51色综合久久免费| 国产精品熟女九九九| 84YTCOM性无码| 欧美一区91大爱| 久久久极品| 91free福利| 夜夜青青无码影院| 亚洲欧洲精品视频发布| 亚州高清色综合| 亚洲精品性爱片| 久久AV无码1区2区3区| 97啪啪| 熟女精品va中文字幕| 美女91在线观看| 国产久久免费精品视频| 青青草色情网站视频| 99e久久国产精品| 天天看特黄的免费网站 | 蜜桃狠狠色伊人亚洲综合| 国产女人与拘做受视频免费| 亚洲大色鬼| www.色婷婷色综合| 日韩精品一区二区人人人| 99色天堂| 免费成人自拍视频在线| 91色噜噜狠狠| AV不卡在线| 老色鬼成人精品视频下载大在线观看| 九九色逼| 亚洲欧美情色| 超碰天天操| 日本五十路熟女一区二区| 久久久天美| 亚洲天堂电影精品一区| 蜜乳成人AV| 99热日| 中字乱伦AV| 日少妇视频| 色婷婷综合久久中文字幕雪峰| 国产探花日韩援交| WWW美腿丝袜香蕉中文| 国产成人久久久精品免费AV| 久久久久久性爱免费视频| 久插综合| 曰韩无码777| 97色碰| 亚洲精品 欧美精品| 人人插人人搞人人操| 久久91| 91爱看| www.夜夜操| 91露脸熟女专区| 亚洲国产福利视频| 蜜桃臀一区二区三区久久| 亚洲欧综合另类无码一区| 亚洲情色 欧美| 美女熟妇色| 欧美,亚洲,日韩,v,天堂,手机在线观看 | 日本午夜操逼| 久 久无码人妻AV| 久久999久| 一本道综合色图| 都市久久精品激情亚洲| 91性网| 精品九九淫乱男| 久草久热| 久久九色| 国产三区免费在线观看| 人人妻人人爽 97人人看碰人免费公开视频| 亚洲天堂资源| 欧美猛交黑寡妇中文字幕| Julia在线播放亚洲久久| 国产精品无码av| 国产又黄又粗又猛大片| 密臀在线一区尤物| 蜜桃香蕉久草精品在线| 老熟女中文字幕高清| 国内精品不卡无毒99999| 久久亚洲婷婷| 牛牛aV| 日日噜噜夜夜狠狠视频无| 色汉综合| 亚州性色| 色色97爱| 色97欧美| 亚洲欧美激情小说| 成人草草视频| 99精品无码| 久久久久人| 欧美大片一区二区三区| 啊啊啊好舒服视频在线观看| 九九热五区| 老鸭窝亚洲毛片| 欧亚综合一卡二卡中文字幕| 久久XX| 久久艹逼视频| 丁香五月天视频| 色五月婷婷久久| 青草青草久热| 日本韩欧美在线播放a| 国产强上视频在线观看| 久操视频资源站公开| 18禁美女裸体无遮挡啪啪| 日本成人A片免费看| 一区操逼| 神马久久久久久伦理片| 欧美东京热精品A∨| 老司机深夜影院18未满| 爆操无码| 97人妻碰碰中文无码久热丝袜| 看一级黄色视频| 丁香五月婷婷啪啪| 天天操狠狠日夜夜干超碰撸com视频在线观看 | www.av在线视频| a天堂视频| 欧美另类综合久久| 亚洲熟女中文字幕在线| 婷色五月天| 国产四虎在线| 神马久久中文字幕| 日韩高清一二三| 就去色综合| 蜜桃av色偷偷av老熟女| 9丨亚洲一区二区在线| 成人乱人伦一区二区| 永久免费发布性爱网| 色综合久久久久| 综合色图亚洲欧美| 午夜后入| 色噜噜国产精品视频一区二区| 国产真实子伦对白| 强奸乱伦大香蕉网| 精品久久久久,69国产成人精| AV天堂男人的天堂| 色噜噜人妻av中文字幕| 女性喷水高潮在线观看| 国产高清MV操逼视频| 九热视频| WWW.加勒比人妻一区不卡.com| 亚洲AV不卡在线观看| 国产精品久久| 最新中文字幕精品在线| www.狠狠干.coom | 熟女AV一区| 天天操妹子| wwwxxx日本爽| 男人兔费天堂| 亚洲日韩XXX| 啊啊啊啊网站| 精品人妻美妇91job| 欧美天天综| 超碰97综合在线| 久草成人| 91久久婷婷| 亚洲视频二区 | 五月丁香大香蕉| 97bbn| 国产精品自拍视频| hd成人一区二区在线| 九九综合久久| 情侣开房子拍 日韩无码 女的很漂亮| 国产风韵犹存熟妇三区| 亚洲欧洲自拍图片专区满春格| 大香蕉五月天| 蜜桃精品一区二区三区久在线| 一二三区操逼国产91| 亚洲熟女av日韩熟女| 欧美色图成人网一区二区 | 日本在线一二| 日韩97超碰| 美中日韩无码| 精品国产乱码久久久兰草影视| 亚洲日韩精品一区二区| 日本一级性爱| 国产熟女自拍| 久久99午夜精品一区人妻| 熟女欧美日韩综合婷婷| 亚洲AV麻豆Aⅴ无码电影一| 天天插天天插| 男人天堂资源| 黑丝少妇在线观看| 中文字幕乱妇免费视频| 91人妻中文| 国内精品999| 亚洲欧美变态| 中国熟女网站| 一线黄色免费性爱片| 2000亚洲男人天堂| 欧美天天干| 91少妇香蕉久久精品| 性色av大全| 狠插 制服 自拍| 亚洲AV成人无码一二三久久| 青青草视频久久久久| 午夜精品久久一区二区| 国产性感骚丝袜在线| 绯色一区二区三区不卡少妇| 蜜伊人色综合97| 亚洲男人久久综合天堂| 中文字幕78| 日操粉逼逼| 色97欧美| 亚洲综合小说另类图欧美视频激情小说色五月天 | 成年人免费观看网站| 欧美性爱十八禁| 国产精品另类一区大香蕉| 久久婷婷六月综合| 久久精品| 麻豆国产成人精品| 日韩欧美经典在线观看| 久9九综合在线| 蜜臀亚洲中文| 亚洲天堂中文字| 无码精品啪啪啪一区二区三区三州| 国产精品午夜高潮呻吟久久av| 天天影视91看看| 无码欧美有限公司| 精品亚洲国产成人av网站| 中日韩久久久免费看| 蜜臀av在线播放一区二区三区| av网站免费看| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 日韩免费av片高清无码| 日韩淫色网| 国产精品一二三区福利| 翔田千里AⅤHD无码| 欧美日日人人天天| www.四虎在线| 香蕉人人操tv| 人人么人人操| 一区e区三| 第二页中文字幕| 亚洲第一成人影院色播| 人人性爱视频免费| 国产乱不卡| 怡红院怡春院| 亚洲AV无码国产成人| 中文字幕精品探花视频| 风月影院男女十八禁| 99啪| 色五月综合网| 91影库| 丰满人妻区一区二区三| 九9精品| 欧洲Au麻豆| www.丁香五月| 女人 A一级| 欧美组图日韩亚洲中文字幕| 淫纸中9区| 久久九精品| 麻豆AV一区二区| 99热最新| 福利色色| 性色av蜜臀av色欲aV| 日本久久女同性恋视频| 校园春色AV天堂| 99国内熟女露脸视频| 欧美最婬乱婬爆婬性视频 | 国产精品色片一区二区| 视频一区二区三区精品| 中文字幕三四五区| 91制服丝袜| 91欧美巨乳| 超碰中文字幕人妻草一区| 日韩人妻操B| 九九在线视频| 无码少妇精品一区二区60岁老人| 日韩A优精品在线观看| 国产精品嫩草影院午夜两性| 欧美日韩在线小说 | 人妻 中文 日韩| 亚洲色图尤物视频| 国产精品com| 白丝AV| 天堂性色| 2017天天操| 91色婷婷综合久久中文字幕二区| 好湿好紧视频| 97在线/亚洲| 老鸭窝成人| 精品无人区麻豆乱码1区2区图片| 999九九九九国产动| 精彩久久中文| 日夜尻逼网| 国产久9| 午夜视频久久久| 丝袜美腿操av| 精品人妻一区二区三区在线视频不卡| 亚洲欧美碰碰| 97视频免费在线观看| 亚洲色天| jizz啪啪| av天堂精品久久| 无码精品人妻一区二区三区妖精 | 亚州五月| 91精品人妻一区二区三区蜜臀| 丝袜AV一区二区三区| 丰满人妻一区二区三区| 岛国爱情动作片在国产AV无码专区亚洲AV漫画| 9Ⅰ老熟女| 成人午夜高潮av猛片| 一级做a爰片性色毛片久久| 亚洲春色欧美激情自拍| 国产成人精品无码久久| 无码 有码 国产18p| 色色色热| 少妇69中文| 在线小说视频一区| 日韩91网站| 久久午夜鲁丝片| 亚洲成人性爱在线观看| 日韩久久三区| 插老姨肥穴| 四虎免费视频| 欧美色图亚洲激情| 乱伦a片视频| 色情五月婷婷| 黑人天8A∨高清网站| 另类成人首页一区| 九九九九精品| 国产精品色片一区二区| 人妻啊啊人妻啊啊| 动漫av中文| 五月情色天| 超碰在线观看av不卡| 色婷婷基地| 国产熟妇一区二区| 色欲久久99国产精品久久久久久| 男女做爰猛烈动高潮A片免费应用| 國產尤物AV尤物在線觀看| 乱人伦 国语对白:视频直接看| 国产欧美日韩臀| 97精品熟女少妇一区| 精品久久久亚洲AV成人网站| 精品国产污一区二区三区| 天天干夜夜肏| 欧美传媒| 99热超碰| 91欧美综合在线| 97干97色| 黄色高清无码无码破解免费暗网| 欧美香蕉视xxx| 久操视频这里只有精品| 韩国黄片aaaa| 久艹伊人精品综合在线| AV天堂因数| 女人 A一级| av婷婷色网| www亚洲欧美| 久久性爱大全| 午夜毛片高清免费不卡| 久操精品| 性站 | 欧美嫩性色| 91操熟女视频| 久久精品亚洲成a人天堂| 在线观看A啊啊啊| 香蕉欧美| 亚洲日本韩国极品一区二区| 久久黄黄黄| 免费的黄片wwwwww| 国产第二页| 午夜激情成人在线观看| 蜜桃臀 后入 一区 二区 三区 在线| 日本一线产区和二线产区伦理片| 操逼操网| 本道在线| 五月丁香社区婷婷日韩欧美精品影院| 97天天弄| 国产亚洲精品美女久久久久久2021| 欧美第38页| 午夜视频黄| 打av高清| 你懂的在线观看区国产| 人妻在线中出视频| 欧美不卡五十路| 韩国女主播青草福利视频| 久久97精品久久久久久久不卡| 97色色婷婷| 国产精品农村妇女| 激情五月激情综合网| 干B网| 91蜜臀熟女| 2024年最新色情网站在线观看 | 免费AV中文网在线观看| 北京专精特新企业招聘信息| 大学生美女口爆| 蜜桃中文字日产乱幕4区| 欧美一级黄色免费专区| 麻豆天美传媒在线视频天堂| 影音先锋少妇| 综合激情一一91| 视频分类 国内精品| 久久久999国产| 裸体美女免费看网站青草| 久久97超碰| 麻豆久久久久久久久丝袜| 最新av中文字幕高清| 96国产污污污丝袜| 中国探花熟女| 日日爱99| 美女诱惑在线一区| 日本肏逼视频在线观看| 亚洲风情在线观看| 欧美激情欧美精品| 无色无码| 欧美色青| 日本最新免费韩国1区2区视频播放| 久久夜黄色无码A级大片| 97超碰影音| 国产视频三区四区| 啪啪AV导航| 天堂网亚洲区手机版| 尻女朋友一夜| 成人美女av| 91丝袜在线观看| 神马久久69| 五月婷婷六月激情| 日日噜噜夜夜狠狠视频无| 啊啊啊水好多| 亚洲永久永久永久永久一级一级一级精品 | 精品国产91av一区二区三区| 3级毛片一二| 91视频成人福利网站在线一区| 国产精品成人蜜臀AV在线| 综合色好色| 国产日韩欧美| 天堂九九九九九九九九九| 日本熟女中文字幕一区| www亚洲欧美| 久久精品国产精品| 99久久com免费视频′| 2021久久国产综合精品青草| 国产99热| 麻豆区久久久久亚| AV天堂电影网| 成人日韩欧美| 91人妻做a观看视频| 超碰78| 蜜臀Av一区二区三区| 伊人玖玖网| 艳美熟妇先锋一二三区| 欧美一区二区三区日韩| 美女视频尤物网在线看| 啊啊啊啊操死我| 国产外初女出血视频| 91偷拍欧美亚洲| 精品一区二区三区蜜桃臀赵总 | 少妇贴图| 精品二区三四区五电影 | 清纯唯美亚洲综合| 四虎免费在线播放| 亚洲图片 激情小说| 亚洲人在线| 亚州色交| 五月天婷婷久久| 国产女人91精品嗷嗷嗷嗷| 久久东京伊人一本到鬼色| 婷婷超| 熟女人妻精品一区二区视频| 欧洲色综合| 欧美亚洲韩国视频十五区| 久久久久久久久久久久久久久久9| www老逼91| 色妹子A V| 熟妇熟女视频一区二区三区| 亚洲成人免费电影| 岛国片在线观看视频亚洲| 国产高清在线观看欧美| 一类无码操逼视频| 高清无码在线播放网站| 国产亚洲深夜激情| 国产欧美日本亚洲精品| 日语五十路和六十路亚洲国产精品| 丰满人妻一区二区三区免费| 97在线观| 国产精品99999| 日本不卡二区| 欧美v日韩v亚洲v最新在线| 超碰九7| 91精品国产91久久青草| 粉嫩av在线| 性色AV蜜色av色欲av| 女人天堂av在线播放| 大香蕉欧美| 亚洲国产一级黄色视频| 欧美精品23| 欧美91视频| 午夜寂寞欧美| 五月丁香综合啪啪| 久久久久久亚洲精品不卡人乳| 精品少妇后入一区二区三区四区人妻巨乳 | 天堂av2019| 久久这里精品国产99丫e6| 91色综合激情| 新视频sss国产| 99re6在线视频精品免费完整版安卓版| 91激情综合| 欧美同性恋 的搜索结果 - 91n| 91热热色| 日韩熟女三十乱伦| 亚洲,日韩,欧美,成人播放| 国产精品视频麻豆入口| 男人的天堂一区三区| 国产成人网址| 狠狠激情综合狠狠操中文字幕| 大香蕉九九| 国产久久久9999| 日日骚 av| 日本不卡免费二区| 天天伊人| 搞中出久久| 日韩国产中文字幕| 久久久久无码| 亚洲伊人久久精品影院| 日韩一级二级三级| 无码操逼视频一下| 日韩欧美亚洲一区二区三区影院| 天天插天天干| 97精品第3页| 日日干日日摸| 亚洲成人在线高清| 强奸a片网| 嗯阿好爽好紧| 97国产中文| 久96热在线观看视频| 欧亚性爱啪啪| 英伦大奶子熟妇吊带| 国产精品国产| 中文字幕国产在线天堂| 成人性爱美曰韩| 美女啊啊啊啊pc| 天天干夜夜操一区二区| 精品欧美不卡在线播放| 日韩av在线播放不卡| 欧美日韩淫加| 久久精品国产亚洲粉嫩| 国产啊v在线免费播放| 亚州色图第三区| 亚洲日本天堂| 国产探花日韩援交| 蜜臀少妇一区二区| 91成人久久| 日本国产亚洲一区在线观看| 激情综合亚洲| 91国产丝袜美女| 69XX一中文字幕人妻91| 97福利视频| 99后入| 国产午夜在线观看视频| 国产欧美日韩女同性恋ww喷水精品 | 啊v在线观看视频| 俺去俺来也在线www| 伊蕉97蜜桃97狠狠综合干| 国产精品久久久| 激情五月激情综合网| 色综合1991| 亚洲第一狼人丝袜美女另类| 国产精品视频电影| 久久精品—区二区三区内射| 三级片网站在线播放| 超碰在97| 日韩欧美tv一区二区在线观看| 中文乱码99| 搡老女人老91妇女老熟女| 99精品在线观看| 后入综合久久| 成人性爱高清视频免费看| 新视频sss国产| 国产一区二区三区久久久精品| 人妻出轨一区二区三区| 亚洲欧美日韩偷拍色图| 屌逼传媒| 男女国产精品| 丁香六月婷婷久久综合| 97资源站国产精品| 91操人视频| 大香蕉性欧美| 韩国一级做A片免费的| 职场同事知名国产国产精品久久欧美日韩| 宅男影院久久久,99| 国产精品熟女九九九| 中文字幕精品一区欧美| 夜夜国产一区| 天天做日日做| 激情人妻另类| 午夜精品久久久久久久99蜜桃一| 激情婷婷丁香| 午夜精品探花| 97在线视频免费看| 日韩国语字幕| 99久久久无码国产精品性啊聊| 久都青青视频| av网站免费线看| 秋霞一区二区三区四区五区六区七区| 亚洲av无码国产精品字幕| 啊啊啊97视频| 最新日产中文在线麻豆| 高清孕妇孕交 交孕妇| 国产自偷自拍一区| 偷拍视频青青草在线视频| 中文字幕在线播放2中文字幕在线观看2 | 国产成人在线观看综合| 国产97av| 久久亚洲影院一区二区| 欧美片第一页| 久久99草| 久色网| 日韩av无码网站| 久久色一区二区| 妺妺跟我一起洗澡没忍住| AV天堂因数| 91jk色拍| 在线视频日韩欧美国产| 欧美色网络| 九X超碰| 在线观看日韩av不卡| 黄页av| 欧美日韩亚洲五月天婷婷| 蜜乳AV色欲AVAV无码| 大香蕉久久| 久久久久久久久久久久久久久久9| 岛国成人av在线播放网址| 淫荡网址| 手机av亚洲丝袜美腿日韩第一页二页| 亚洲精品成人| 国产JDAV无码视频在线观看| 蜜桃臀久久| 草b在线| 国产高清成人传媒影视| 秋霞Av理论一级在线| 精品无码产区一区二| 麻豆天美国美国产| 一本一道波多野毛片中文在线| 97se亚洲综合自| 欧美视频激情久久久久久| 人人爱操| 极品尤物自安慰| 国产成年女黄特黄| 日韩欧美中文字亚洲慕| 欧中日成人免费影视| 蜜乳av首页| 国产又黄又粗的视频| 欧美日韩久久精品爱爱| 美女黑人91神马| 黄页大片在线观看| 国产伦精品一区二区三区在线观 | 宗合情欲网| 先锋音影AV| 日本免费中文一区二区三区四区 | 麻豆天美久久91| 偷看洗澡一二三区美女| 肏逼福利网站| 欧美亚洲系列| 国偷自 一区二区| 色天使大香蕉| 97人妻色| 日本福利二区视频| 久久久久亚洲?V片无码V| 一中国女人毛片水真多| 日韩猛交| 91热热色| 在线电影亚洲色图| 久久久久久久久久久久九| 久久av网| 亚洲熟女乱色| 又黄又爽在线观看视频| www.色综合| 天天精品| 粉嫩不卡一区二区性爱 | 国产精品一区二区麻豆| 小骚逼被操的爽不爽| 91天天综合网,天天综合网| 丝袜熟女2P| 亚洲天堂,男人| 色噜噜婷婷| 色播五月丁香| 尹人大香蕉视频在线| 日本99久久| 毛片电影一区二区三区| 亚洲乱熟女一区二区三区大香蕉| 黄色欧美性爱视频| 欧美性巨大╳╳╳╳╳高跟鞋| 国产欧美精选激情视频| a一区二区三区乱码在线| 影音先锋少妇| www.黄色在线| 久久久无码av精| 午夜寂寞欧美| 中文字幕在线高清男人的天堂| 国产视频一区二区免费| 5278欧美一区二区三区| 久草免费在线一区二区| 熟女人妻一区二区三区| 日本午夜久久电影| 99热思思| 射 色综合| 97国伦国色| 蜜臀色乳| 欧美日韩97在线| 超碰97日韩| 久久一二三四| 精品日韩中文在线| 国产AV久久野战精品|