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

ARTICLE DETAIL

資訊詳情

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

PL0編譯器設(shè)計與實現(xiàn):從詞法分析到中間代碼生成的編譯原理實驗指南

PL0編譯器設(shè)計與實現(xiàn):從詞法分析到中間代碼生成的編譯原理實驗指南 簡介這是山東大學編譯原理課程PL/0編譯器實驗的完整實現(xiàn)面向計算機專業(yè)學生及編譯原理學習者覆蓋詞法分析、語法分析、語義分析與符號表建立等編譯器前端核心環(huán)節(jié)。壓縮包共94個文件、約513KB以C/C源碼、CMake構(gòu)建腳本、可執(zhí)行程序、實驗報告及多組測試輸入與運行截圖為主要內(nèi)容便于對照工程結(jié)構(gòu)重新編譯和驗證結(jié)果。目前已有104人學習下載。資源除完整可運行的PL/0編譯器外還包含模塊劃分清晰的工程組織、多組PL/0測試程序如素數(shù)、乘方、公約數(shù)計算及對應截圖可直接用于課程設(shè)計參考、實驗報告撰寫和編譯原理備考復習。1. PL0-Compiler是什么把編譯原理課程實驗壓成一臺能跑的小編譯器第一次打開“PL0-Compiler 山東大學SDU編譯原理課程實驗”這個項目標題時我差點把它當成又一個普通的課程設(shè)計。真正動手之后才發(fā)現(xiàn)它要求你為一種叫 PL/0 的教學語言寫一個完整的小型編譯器從詞法分析到語法分析再到符號表、語義檢查、中間代碼生成最后還要有一個解釋器把程序跑起來。PL/0 本質(zhì)上是 Pascal 的極小核心子集只有常量、變量、過程、賦值、if、while、call 這些最基礎(chǔ)的語法單位但恰好把編譯原理課程里最該掌握的主干線全部覆蓋了。所以這篇筆記的服務對象很明確你要么是剛拿到 PL0-Compiler 實驗、不知道從哪下手要么已經(jīng)寫完一版但總在某幾個邊界用例上翻車。很多學校的編譯原理實驗都在 PL/0 上做或大或小的剪裁SDU 的版本也跳不出“語言說明 編譯器框架 解釋器”這個套路。下文我會按順序拆開詞法、語法、語義和代碼生成每一步都給出能直接抄的代碼和參數(shù)最后再把我踩過的幾個坑完整復述一遍。用 Java 來寫編譯原理實驗是最常見的選型對象化改造也順手這篇就默認用 Java 落地。2. 詞法分析先從源文件榨出干凈的 Token 流PL0-Compiler 的地基詞法分析是整個 PL0-Compiler 里最先動手的部分也是很多初學者“看著簡單、寫起來全是暗坑”的地方。PL/0 的詞匯很少十幾個保留字、一個標識符、一個整數(shù)、幾個運算符和界符所以常見做法是只寫一個 getsym() 函數(shù)每次調(diào)用從源代碼里取出下一個 Token。這里有兩個決策會直接影響后面所有代碼Token 用什么結(jié)構(gòu)表達關(guān)鍵字怎么識別。2.1 Token 結(jié)構(gòu)設(shè)計枚舉、保留字表和行號定位我一般會用枚舉把單詞類型固定下來而不是用 int 常量手寫一堆 0/1/2。原因很簡單后面的遞歸下降解析器里到處要比較sym Kind.IF或者switch(sym)枚舉能讓錯誤消息和調(diào)試輸出自然可讀寫的時候還不會把 3 和 4 記混。public enum Kind { IDENT(標識符), NUMBER(整數(shù)), CONST(const), VAR(var), PROCEDURE(procedure), BEGIN(begin), END(end), IF(if), THEN(then), ELSE(else), WHILE(while), DO(do), CALL(call), ODD(odd), ASSIGN(:), PLUS(), MINUS(-), TIMES(*), DIV(/), EQ(), NEQ(#), LT(), LE(), GT(), GE(), LPAREN((), RPAREN()), COMMA(,), SEMICOLON(;), PERIOD(.); final String label; Kind(String label) { this.label label; } }這段枚舉基本就是 PL/0 詞法范圍的全集。注意末尾的PERIOD對應程序結(jié)束的“.”很多人會漏掉它結(jié)果語法分析在收尾時總是報“缺 .”。除了枚舉之外還需要一個 EOF表示文件讀完放在 Token 類型里比較合適。Token 本身我建議做成一個小類kind 表示詞性text 保留原始字符intVal 只對 NUMBER 有意義line 用來給后續(xù)報錯定位。public class Token { public Kind kind; public String text; public int intVal; public int line; }這樣一個 Token 對象從詞法階段傳到語法分析再傳進符號表字符串只在最開始保留一份后面全程都用對象引用查錯了也知道該把錯誤定位到第幾行。2.2 getsym 主循環(huán)先收標識符再查表收編關(guān)鍵字PL/0 的保留字不多但如果你寫成if word.equals(const) else if word.equals(var)這種長串一旦要加關(guān)鍵字或者調(diào)整大小寫策略函數(shù)會臭不可聞。編譯原理實驗里最穩(wěn)妥的做法是源程序里以字母開頭的連續(xù)串一律先當作“可能是標識符”來掃描然后查一個 Map查不到就是 IDENT查得到就改成對應保留字。先定義保留字表private static final MapString, Kind KEYWORDS new HashMap(); static { KEYWORDS.put(const, Kind.CONST); KEYWORDS.put(var, Kind.VAR); KEYWORDS.put(procedure, Kind.PROCEDURE); KEYWORDS.put(begin, Kind.BEGIN); KEYWORDS.put(end, Kind.END); KEYWORDS.put(if, Kind.IF); KEYWORDS.put(then, Kind.THEN); KEYWORDS.put(else, Kind.ELSE); KEYWORDS.put(while, Kind.WHILE); KEYWORDS.put(do, Kind.DO); KEYWORDS.put(call, Kind.CALL); KEYWORDS.put(odd, Kind.ODD); }掃描主流程private void getsym() { skipSpaceAndComment(); if (pos source.length()) { token new Token(Kind.EOF, EOF, line); return; } char c source.charAt(pos); if (Character.isLetter(c)) { int start pos; while (pos source.length() (Character.isLetterOrDigit(source.charAt(pos)) || source.charAt(pos) _)) { pos; } String word source.substring(start, pos); Kind kind KEYWORDS.get(word.toLowerCase()); token new Token(kind null ? Kind.IDENT : kind, word, line); } else if (Character.isDigit(c)) { scanNumber(); } else { scanOperatorOrPunctuation(c); } }這段邏輯里我允許了標識符中包含數(shù)字和下劃線這是很多課程實驗會給的小放寬。如果你拿到的文檔嚴格規(guī)定“標識符只能以字母開頭后續(xù)只能是字母或數(shù)字”把_的分支去掉就行。大小寫策略也值得提前定好我做了toLowerCase()所以Begin和BEGIN都會被識別成 begin如果你們的實驗區(qū)分大小寫刪掉 toLowerCase 并且保證保留字表全小寫也可以。注意關(guān)鍵字識別采用“先當標識符掃再查表改判”的順序比邊掃描邊逐字符匹配要穩(wěn)得多。這樣標識符和關(guān)鍵字共用同一套字符推進邏輯少一個分支就少一類 bug。2.3 三個容易埋雷的邊界多字符符號、整數(shù)溢出、非法字符多字符符號是詞法階段最容易留坑的地方。PL/0 的不等號是#而不是!小于等于和大于等于分別是、賦值號是:。每次 getsym 只推進一個字符所以遇到時必須看一眼下一個字符是不是是就合成一個 LE同時 pos 要推進兩位漏掉這次 peek 的錯誤非常難查癥狀是x 2被解析成和兩個符號語法分析直接懵掉。數(shù)字掃描我建議用 long 做累加再判溢出不能等 int 已經(jīng)溢出之后再補救private void scanNumber() { int start pos; long v 0; while (pos source.length() Character.isDigit(source.charAt(pos))) { v v * 10 (source.charAt(pos) - 0); if (v Integer.MAX_VALUE) { error(ERR_NUM_TOO_LARGE, 整數(shù)溢出: source.substring(start, pos)); while (pos source.length() Character.isDigit(source.charAt(pos))) { pos; } token new Token(Kind.NUMBER, source.substring(start, pos), line); token.intVal 0; return; } pos; } token new Token(Kind.NUMBER, source.substring(start, pos), line); token.intVal (int) v; }判溢出時必須把剩余數(shù)字全部消費掉否則一個大整數(shù)會被拆成兩段數(shù)字后面可能誤判成合法程序。非法字符的處理同理、^、$這類誰都不是的字符如果分支里只報錯不推進 pos下一輪 getsym 還會看到同一個字符輕則錯誤刷屏嚴重時直接死循環(huán)。正確做法是報錯之后pos繼續(xù)。注釋要不要支持一定要看實驗文檔。有的 PL/0 版本沿用 Wirth 原書的{ }注釋有的學校改成/* */有的是壓根不要求。如果要求支持我一般只做非嵌套的/* */private void skipSpaceAndComment() { while (pos source.length()) { if (Character.isWhitespace(source.charAt(pos))) { pos; } else if (source.charAt(pos) / pos 1 source.length() source.charAt(pos 1) *) { pos 2; while (pos 1 source.length() !(source.charAt(pos) * source.charAt(pos 1) /)) { pos; } pos 2; } else { break; } } }這段代碼的最大好處是空白和注釋可以交替出現(xiàn)中間不需要反復調(diào)用 getsym。缺點是注釋不閉合時 pos 會一路走到文件尾所以主流程里最好檢查一下pos是否已經(jīng)越界并報“注釋未閉合”。寫完詞法器我建議先跑一個臨時 main把源文件里的 Token 流打出來看一眼確認無誤再往下寫語法分析public static void main(String[] args) { Lexer lexer new Lexer(begin x : 1 2; end.); Token t; while ((t lexer.next()).kind ! Kind.EOF) { System.out.printf(%d\t%s\t%s\t%d%n, t.line, t.kind, t.text, t.intVal); } }這一步能幫你把問題隔離在詞法階段。別急著往后寫Token 流不對后面所有解析結(jié)果都是空中樓閣。3. 語法分析用遞歸下降扣住 PL/0 文法表達式優(yōu)先級不再翻車詞法分析把源程序切成 Token 流之后語法分析負責按文法把這些 Token 組織成語法結(jié)構(gòu)。PL/0 的文法是經(jīng)典的自上而下文法常見做法是手寫遞歸下降一個非終結(jié)符對應一個函數(shù)。它和 LL(1) 文法長得幾乎一樣手工實現(xiàn)也不需要額外的表驅(qū)動框架調(diào)試時還能直接看到調(diào)用鏈最適合作為編譯原理實驗的骨干。3.1 PL/0 的文法全貌先把 block 和 statement 遞歸關(guān)系畫清楚一份標準的 PL/0 文法可以縮寫成下面這套 BNFprogram block . block [constDecl] [varDecl] {procDecl} statement constDecl const ident number {, ident number} ; varDecl var ident {, ident} ; procDecl procedure ident ; block ; statement [ident : expression | call ident | begin statement {; statement} end | if condition then statement [else statement] | while condition do statement] condition odd expression | expression relop expression expression [|-] term {(|-) term} term factor {(*|/) factor} factor ident | number | ( expression ) relop | # | | | | 這套文法里有幾個地方值得先說破。block是絕對核心它同時處理常量聲明、變量聲明、過程聲明和一條語句而且過程聲明里又會遞歸調(diào)用block也就是說過程可以嵌套定義。statement的兩種寫法里if后面可以跟可選的elsebegin...end內(nèi)部是用分號分隔的語句序列最后一個分號可寫可不寫這里最容易產(chǎn)生多余的錯誤報錯。函數(shù)劃分不需要什么高深設(shè)計每個非終結(jié)符寫一個私有方法方法名直接叫block、statement、condition、expression、term、factor。程序結(jié)構(gòu)和文法一一對應答辯的時候別人問哪段對應哪條產(chǎn)生式你指一下方法名就行。private void block() { table.enterBlock(); int savedVarOffset currentVarOffset; if (sym Kind.CONST) { constDecl(); } if (sym Kind.VAR) { varDecl(); } while (sym Kind.PROCEDURE) { procDecl(); } statement(); currentVarOffset savedVarOffset; table.exitBlock(); }這里的currentVarOffset要格外小心。每個塊進入時都從某個固定偏移開始給局部變量分配槽位但這個偏移不能一直累加否則不同塊的變量地址會互相踩踏。所以進入 block 時保存舊值塊結(jié)束再恢復正是這段代碼里savedVarOffset的職責。3.2 expression/term/factor 的調(diào)用層級乘除為何排在加減下面表達式是語法分析里最好檢驗優(yōu)先級的地方。PL/0 的表達式定義成[加號|減號] term { (加號|減號) term }term 定義成factor { (乘號|除號) factor }factor 才是真正出現(xiàn)標識符、整數(shù)和括號的那一層。這種分層結(jié)構(gòu)保證了乘除先算、加減后算括號通過遞歸回到 expression 實現(xiàn)。private void expression() { if (sym Kind.PLUS || sym Kind.MINUS) { boolean minus sym Kind.MINUS; getsym(); term(); if (minus) { gen(OPR, 0, OPR_NEGATIVE); } } else { term(); } while (sym Kind.PLUS || sym Kind.MINUS) { Kind op sym; getsym(); term(); if (op Kind.PLUS) { gen(OPR, 0, OPR_ADD); } else { gen(OPR, 0, OPR_SUB); } } }這段代碼先處理一元正負號再通過 while 循環(huán)把同層級的加減法運算符全部消耗掉。如果沒有最前面的if (sym Kind.PLUS || sym Kind.MINUS)-x1就會被理解成“負號后面缺一個操作數(shù)”從而誤報語法錯誤。term 的結(jié)構(gòu)和 expression 幾乎一樣區(qū)別只是把因子換成低一層private void term() { factor(); while (sym Kind.TIMES || sym Kind.DIV) { Kind op sym; getsym(); factor(); if (op Kind.TIMES) { gen(OPR, 0, OPR_MUL); } else { gen(OPR, 0, OPR_DIV); } } }factor 是真正查符號表、生成 LIT 或 LOD 指令的地方private void factor() { if (sym Kind.IDENT) { Symbol s table.find(token.text); if (s null) { error(ERR_UNDEFINED, 未定義標識符 token.text); } else if (s.kind() Kind.CONST) { gen(LIT, 0, s.val()); } else if (s.kind() Kind.VAR) { gen(LOD, levelDiff(myLevel, s.level()), s.addr()); } else { error(ERR_INVALID_EXPR, 過程名不能出現(xiàn)在表達式中 token.text); } getsym(); } else if (sym Kind.NUMBER) { gen(LIT, 0, token.intVal); getsym(); } else if (sym Kind.LPAREN) { getsym(); expression(); if (sym ! Kind.RPAREN) { error(ERR_RPAREN_EXPECTED, 缺少右括號); } else { getsym(); } } else { error(ERR_FACTOR_EXPECTED, 因子開始符號非法); getsym(); } }factor 里的getsym()必須放在每個分支的公共出口否則解析到非法因子時會原地重復處理同一個 Token遞歸下降立刻被打成死循環(huán)。寫完這三層拿12*3和(12)*3兩個用例分別驗證一個結(jié)果應該對另一個應該不對如果輸出反了多半是 expression 和 term 的層級倒掛了。3.3 test() 錯誤同步語法分析如何從第一個錯里活下來遞歸下降解析器遇到一個不期望的符號時如果只是簡單報錯并 return后續(xù)語句大概率會被連環(huán)誤報。經(jīng)典 PL/0 教材里的做法是寫一個test()函數(shù)它接收一個期望符號集合如果當前符號不在集合里就報錯并向前同步直到找到集合中的某個符號為止。private void test(int[] expected, int errCode, String msg) { if (!inSet(expected)) { error(errCode, msg); do { getsym(); } while (!inSet(expected) sym ! Kind.EOF); } } private boolean inSet(int[] expected) { for (int s : expected) { if (s sym.ordinal()) { return true; } } return false; }這里的ordinal()是因為我用了枚舉類型如果你用 int 常量表示符號直接比較數(shù)字即可。調(diào)用方式就像這樣// 解析 statement 前先確認當前符號是語句合法的開頭 test(new int[]{Kind.IDENT.ordinal(), Kind.CALL.ordinal(), Kind.BEGIN.ordinal(), Kind.IF.ordinal(), Kind.WHILE.ordinal()}, ERR_STMT_EXPECTED, 語句開始符號非法);“同步”這個詞聽起來玄實際含義就是跳過那些既不屬于當前集合、也不像錯誤終結(jié)符的 Token直到找到一段可以繼續(xù)分析的結(jié)構(gòu)邊界。比如begin x : ; end里面賦值號后面缺表達式expression 會報錯但同步到end后statement 還能繼續(xù)往下走不會把“end 后面缺分號”這種假錯誤也報出來。錯誤同步是答辯論時老師大概率會問的點它不追求報錯數(shù)量追求報錯質(zhì)量。4. 符號表與語義動作PL0-Compiler 的判斷力藏在這里語法分析只回答“這串 Token 合不合文法”但x : 1里的 x 到底有沒有定義、能不能給常量賦值、過程名能不能當變量用這些必須靠符號表和語義檢查來回答。符號表就是編譯器的“業(yè)務現(xiàn)場”所有聲明信息、作用域關(guān)系、變量地址都要在這里落地。4.1 符號表設(shè)計按塊管理進入和退出 block 時自動清理PL/0 支持過程嵌套所以符號表必須按塊劃分。常見做法是給每個符號記錄一個 blockId進入塊時壓棧并遞增編號退出塊時把屬于當前塊的符號全部彈出。public record Symbol(String name, Kind kind, int val, int level, int addr, int blockId) { } public class SymbolTable { private final ListSymbol symbols new ArrayList(); private int currentBlock; private final DequeInteger blockMarks new ArrayDeque(); public void enterBlock() { blockMarks.push(currentBlock); currentBlock; } public void exitBlock() { int mark blockMarks.pop(); while (!symbols.isEmpty() symbols.get(symbols.size() - 1).blockId() mark) { symbols.remove(symbols.size() - 1); } currentBlock blockMarks.peek(); } public Symbol find(String name) { for (int i symbols.size() - 1; i 0; i--) { Symbol s symbols.get(i); if (s.name().equals(name)) { return s; } } return null; } public boolean existsInCurrentBlock(String name) { for (Symbol s : symbols) { if (s.blockId() currentBlock s.name().equals(name)) { return true; } } return false; } }因為符號列表是從表尾開始查找的所以內(nèi)層聲明的同名符號總會被先找到這正好實現(xiàn)了內(nèi)層遮蔽外層的語義。退出內(nèi)層塊時符號被清理內(nèi)層名稱對外不可見外層名稱重新變回可見。Symbol用 Java record 寫很緊湊val 字段對常量才有意義addr 字段對變量和過程才有意義別在語義檢查里混淆它們。4.2 聲明處理與語義檢查查重、未定義變量、常量賦值攔截處理 const 聲明和 var 聲明時重復定義是最需要攔截的錯誤。判斷規(guī)則不是“全局唯一”而是“當前塊內(nèi)不得重名”。private void constDecl() { getsym(); // 跳過 const do { if (sym ! Kind.IDENT) { error(ERR_IDENT_EXPECTED, 常量聲明缺少標識符); return; } String name token.text; if (table.existsInCurrentBlock(name)) { error(ERR_DUP_DECL, 重復定義: name); } getsym(); if (sym ! Kind.EQ) { error(ERR_EQ_EXPECTED, 常量聲明缺少 ); getsym(); } else { getsym(); } if (sym ! Kind.NUMBER) { error(ERR_NUM_EXPECTED, 常量值必須是整數(shù)); return; } int val token.intVal; table.add(new Symbol(name, Kind.CONST, val, currentLevel, 0, currentBlock)); getsym(); } while (sym Kind.COMMA); if (sym ! Kind.SEMICOLON) { error(ERR_SEMI_EXPECTED, 常量聲明缺少分號); } else { getsym(); } }變量聲明類似只是不給值而是分配偏移量。給變量分配地址時記住一個原則過程符號不占用數(shù)據(jù)槽位常量符號也不占用只有 VAR 才會讓currentVarOffset遞增。PL/0 的棧式虛擬機里每個棧幀通常要留出三個固定槽給動態(tài)鏈、靜態(tài)鏈和返回地址所以局部變量從偏移 3 開始分配是常見約定。如果你沒有這三槽設(shè)計可以從 0 開始但要保證調(diào)用過程時棧幀布局和解釋器一致。賦值語句的語義檢查尤其要攔常量賦值private void assignment() { String name token.text; Symbol s table.find(name); if (s null) { error(ERR_UNDEFINED, 未定義變量: name); } else if (s.kind() Kind.CONST) { error(ERR_CONST_ASSIGN, 不能給常量賦值: name); } getsym(); if (sym ! Kind.ASSIGN) { error(ERR_ASSIGN_EXPECTED, 缺少賦值號 :); return; } getsym(); expression(); if (s ! null s.kind() Kind.VAR) { gen(STO, levelDiff(currentLevel, s.level()), s.addr()); } }如果變量未定義語法分析可以繼續(xù)但不應生成 STO 指令如果變量其實是常量就更不能生成存儲指令。語義錯誤和代碼生成要分開這類“報錯但不再生成錯誤代碼”的處理是實驗評分里很容易被檢查的細節(jié)。4.3 中間代碼生成一個指令八條的表驅(qū)動虛擬機PL/0 不生成 x86 匯編而是生成一套精簡的中間指令再由解釋器執(zhí)行。我習慣用八條指令指令參數(shù)含義LITval整常數(shù)壓棧OPRop對棧頂做運算LODlevel offset從指定層取變量壓棧STOlevel offset棧頂存入指定層變量CALlevel offset調(diào)用過程INTsize給當前塊分配棧空間JMPaddr無條件跳轉(zhuǎn)JPCaddr棧頂為假時跳轉(zhuǎn)OPR 的子操作碼屬于內(nèi)部約定你完全可以用自己的一套編號只需要保證生成器和解釋器一致。我常用0 返回、1 取負、2 加、3 減、4 乘、5 除、6 判斷奇數(shù)、7 到 12 是六個比較運算、13 讀入、14 輸出。生成代碼時if 和 while 都要用“先留空地址生成完畢再回填”的 backpatch 技巧// if cond then stmt else stmt condition(); int jpc gen(JPC, 0, 0); // 條件為假時跳出 then 分支 statement(); if (sym Kind.ELSE) { int jmp gen(JMP, 0, 0); // then 分支執(zhí)行完要跳過 else patch(jpc, pc()); // 回填假跳轉(zhuǎn)到 else 的語句 getsym(); statement(); patch(jmp, pc()); // 回填跳過 else } else { patch(jpc, pc()); // 沒有 else 時跳到整個語句之后 }回填的位置差一行就會讓程序邏輯徹底變樣比如 if 的兩個分支都執(zhí)行或者 while 循環(huán)永遠多跑一次。寫完之后把指令流打印出來逐條核對你會發(fā)現(xiàn)這套虛擬機對排錯非常友好。5. 避坑PL0-Compiler 調(diào)試中我反復踩的四個編譯原理實驗坑這門實驗最大的特點是代碼量不大但每類錯誤都藏在最不起眼的位置。下面四個問題是我在類似 PL0-Compiler 實現(xiàn)里見過最多、自己也踩過的坑全部按“現(xiàn)象 → 原因 → 解決”的順序?qū)憽?.1 詞法死循環(huán)非法字符被吞掉后 getsym 原地打轉(zhuǎn)現(xiàn)象給詞法器一個包含或者^的測試程序編譯進程不退出CPU 卻跑滿有的實現(xiàn)則表現(xiàn)為錯誤消息洪流刷屏到幾乎停不下來。原因getsym 在 popup fallback 里識別不了這個字符只是報錯但沒有推進 pos。下一輪 getsym 還是讀同一個字符于是無限循環(huán)。有些代碼在錯誤分支里調(diào)用了自己卻沒在遞歸前先推進 pos效果同樣。解決非法字符分支里必須先pos再報錯保證每一次 getsym 調(diào)用最多只處理一個字符。詞法主函數(shù)里凡是能返回 Token 的分支都必須有明確的字符推進動作。我在 2.3 節(jié)里把它寫在代碼注釋里就是因為它太容易漏。5.2 優(yōu)先級翻車12*3 算出 9term 層沒把 factor 包起來現(xiàn)象語法分析沒報錯解釋執(zhí)行的結(jié)果卻不對12*3輸出 9而不是 7。原因expression 里沒有調(diào)用 term而是直接調(diào)用了 factor或者 term 里沒有 while 循環(huán)只解析了一個因子就 return。遞歸下降的每層函數(shù)都對應文法的每一層優(yōu)先級少一層就退化成完全左結(jié)合或右結(jié)合。解決嚴格按照expression → term → factor三層來寫。第一層處理加減第二層處理乘除第三層處理標識符、數(shù)字和括號。調(diào)試時用12*3、(12)*3、-x1三個用例同時驗證任何一個不對都說明層級關(guān)系有誤。5.3 作用域污染內(nèi)層過程退出后同名變量仍然可見現(xiàn)象內(nèi)層過程聲明了一個和外層同名的變量返回外層后外層變量居然被內(nèi)層的那個同名變量遮蔽了更嚴重的是外層之后訪問這個變量時程序行為完全錯亂。原因符號表只做增加不做清理退出內(nèi)層塊時沒有把本塊符號彈出去。find 函數(shù)又總是從表尾往前查于是內(nèi)層符號一直“穿透”作用域屏障。解決用 4.1 節(jié)的 blockId 方案進入塊時記 mark退出塊時按 mark 彈出本塊符號。寫完作用域測試用例后最好打印一份符號表觀察名字和 blockId 的對應關(guān)系不要只靠運行結(jié)果判斷。5.4 跳轉(zhuǎn)目標差一行if/while 的 backpatch 算錯位置現(xiàn)象if 的 then 和 else 兩個分支同時執(zhí)行或者 while 循環(huán)多執(zhí)行一次、少執(zhí)行一次而詞法、語法、符號表都查不出問題。原因JPC 或 JMP 的后綴位置填錯了。常見做法是把回填時機放在 getsym 之后結(jié)果實際地址已經(jīng)比預期多跑了一段也有的是把“語句結(jié)束后的地址”當成了“else 分支的地址”來填。解決把生成指令的 pc 值打印出來對照中間代碼人工走一遍。沒有 else 時JPC 應跳到整個 if 語句之后有 else 時JPC 跳到 else 語句首條指令JMP 跳到整個語句之后。while 的回填目標則是條件判斷指令之前形成一個向后循環(huán)的 JMP。注意不要迷信“程序跑通了就沒問題”。PL0-Compiler 這類實驗的評分點通常很細建議把中間代碼和符號表都保留成可打印狀態(tài)答辯時這些比嘴上講原理更能說明問題。6. 驗證 PL0-Compiler從最小用例集到自動化 diff 的收尾等到詞法、語法、語義和代碼生成都跑通之后最需要做的不是著急寫完整測試而是建立一套能反復執(zhí)行的回歸用例集。PL/0 語言小每個語法成分都不難測真正的風險在于“改動一處帶來別處回退”這種問題只有靠自動化 diff 才抓得住。6.1 最小用例集每個語法成分都要有一個正例和一個反例我建議準備這樣一個 cases 目錄每個.pl0文件對應一個測試主題用例文件覆蓋點期望結(jié)果const.pl0常量聲明、常量引用輸出 3var_assign.pl0變量聲明、賦值輸出 2priority.pl012*3與(12)*37 和 9if_else.pl0if/else 分支分支選擇正確while.pl0循環(huán) 0 次和多次輸出累計結(jié)果nested_proc.pl0過程嵌套、作用域遮蔽內(nèi)外變量互不干擾err_dup.pl0重復定義編譯期報錯err_undef.pl0未定義標識符編譯期報錯err_const_assign.pl0給常量賦值編譯期報錯每個用例文件旁邊放一個.out文件保存期望輸出。數(shù)量不用多但每個語法成分都必須覆蓋到“能跑”和“不能跑”兩個方向。反向用例的價值在于驗證編譯期的錯誤報告和退出碼而不是看解釋器執(zhí)行。6.2 自動化 diff把“好像能跑”變成“回歸全綠”在項目根目錄放一個run_tests.sh把每一個.pl0文件編譯后執(zhí)行再和期望輸出對拍#!/usr/bin/env bash if ! java -cp . com.sdu.pl0.Main $src real.out 21; then ... fi for src in cases/*.pl0; do base${src%.pl0} java -cp . PL0Compiler $src /dev/null real_${base}.out 21 if [ -f ${base}.out ]; then if ! diff -u ${base}.out real_${base}.out diff.log; then echo FAIL: $src cat diff.log exit 1 fi fi rm -f real_${base}.out done echo test all passed這段腳本的邏輯很簡單編譯產(chǎn)物和期望輸出做diff -u任何不一致都立刻失敗并打印現(xiàn)場。跑一次全綠才算這個頁面的最小可用版本真正穩(wěn)住了。后續(xù)不管改詞法、改語法還是加新指令集都要重跑一遍這個腳本而不是只手動試一兩個例子。6.3 一個看棧的底牌給解釋器加 trace 開關(guān)調(diào)試 PL/0 生成指令時最抓狂的情況是“我知道結(jié)果不對但不知道是哪一條指令開始不對”。給解釋器加一個全局布爾變量trace在每條指令執(zhí)行后打印當前 pc、操作碼、操作數(shù)和棧頂內(nèi)容if (trace) { System.out.printf(pc%04d op%s level%d addr%d stackTop%d%n, pc - 1, opName(ins.op()), ins.level(), ins.addr(), stack.empty() ? Integer.MIN_VALUE : stack.peek()); }開 trace 之后把12*3的指令序列和手算結(jié)果逐條對照很快就能發(fā)現(xiàn)是1*2先算還是2*3先算。這個習慣我當時一直保持到實驗結(jié)束先小用例開 trace 驗證指令序列再關(guān)掉 trace 跑完整測試套件兩者配合幾乎沒有排不掉的邏輯錯誤。希望幫到你。本文還有配套的精品資源點擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日本不卡在线二区三区| 色哟哟-国产专区| 久久禁| 人人操人人大香蕉| 偷拍三区| 9丨久久九九九| 人妻娇喘 激情视频| 亚洲色吧网| 亚洲一区二区三区播放在线| 精品少妇999| 极品出轨视频网站| 欧洲小说色图视频另类| 色第一页| 男人的天堂2010| 人人 操人人 操人人| 91美女视频直播| 九九热视频这里只有精品| 涩涩五月天| 亚欧成人综合影院| 亚洲无吗在线视频| 国产精品无码久久久久2028| 亚洲视频1区| 亚洲中文字幕在现观看| 国产熟女一区二区| 91亚洲欧美激情| 777超碰| 欧美在线第五页| 日日噜噜夜夜久久亚洲一区二区| 欧美性色综合网| 91xingse| 亚洲色图 91| 久久成人网站| 日本成人在线不卡一区二区三区| 囯产精品久久久久久久久久梁医生 | 国产69精品久久久久99尤物| www.av在线观看| 97国产高清视频在线观看| 国产专区第一页| 一级日本牲交大片好爽在线看| 国产后入| 人妻天天爽天天爽三区| 五月亭亭六月丁香| 亚洲乱码精品一区二区| 97最新在线播放视频| 日本午夜福利影院| 嫩草伊人久久精品| 狠狠爱夜夜干| 人妻夜爽夜夜爽| 欧美草草高清日韩视频| 可免费观看的av毛片中日美韩| 97免费在线观看| 搡老女人老熟女91老熟女综合网| 激情小说亚洲| 国产又黄又粗的视频| 国产精品亚洲高清在线| 欧美日韩天堂| av线电影| 天美精品原创av片国产| 婷婷五月天在线观看| 嗯嗯啊中文字幕| 亚洲AV无码天美传媒一区| 久久人人妻| 中文字幕av久久爽Av| 国产乱弄免费在线视频。| 久9久精品视频| 999久久芭蕾| 欧美精品三级黄片| 国产精选三级在线观看| 国产日韩精品一区二区三区| 国产女人9999| 97超碰超碰| 久久久亚洲高清不打码| 欧美色色色| 国产精品九9| 天天日熟妇| 国产91 丝袜在线播放00-百度| 18禁止看精品中文字幕| 熟妇操花| 中出20p| 干少妇视频| 东京热视频网| 欧美激情综合色综合啪啪五月| 成人老鸭窝人人在线视频| 2019亚洲男人天堂| 黄色香蕉视频网站一区| 美女诱惑爱爱| 97精品全部| 91av一区二区在线观看| 日本福利社| 伊人久久亚洲中文字幕不卡| ji熟女.com| 日本有码久久| 午夜九九| 久久曰曰| 国产99999| aaaa黄片| 天堂伊人久久| 亚洲 欧美 精品专区 极品| 婷婷丁香六月| 国产第12页| 国产精品一区二区三区在线密挑| 玖玖大干人妻| 性爱边摸边日免费AV| 夜夜爽77777| 熟妇一区,二区,三区。| 日本人妻一区二区| 青青草久草| 1769精品一区二区三区| 美国三级日本三级久久99| A 天堂| 人妻啊啊人妻啊啊| 欧美中文字幕精品人妻| 香蕉99秘 精品一区丁香| 亚洲日韩资源| 免费观看啪视频| 久久久少妇诱惑精品视频| 亚洲阿v天堂无码z2018| 97超碰巨乳| 人妻一区二区三区视频| 亚洲AV不卡在线观看| 国产人妖视频一区在线观看| 欧美国产成人在线| 乱伦3P视频| 成熟熟女国产精品一区二区| 大香网站| 黑白配性爱AV成| 激情干在线| 欧美手机在线综合| 一区二区三区四区色图| 九色黄站| 97硬碰| 久久久久亚洲AV无码专区少妇| 人人综合| 五月丁香网站| 毛片一区二区| 国偷自 一区| 婷婷综合在线| 美女被啪到深处抽搐视频| 台湾佬激情综合| 女生久久网| 亚洲熟妇图片| 色婷婷亚洲婷婷| 日韩性色| 亚洲综合影片| 亚洲欧美中文日韩视频中国语| 久草看看看| 蜜桃视频精品一区二区| 亚洲欧美国产中文视频| 久热99999| 色五月综合网| www熟女乱伦com| 亚洲日韩欧美一区二区| 黄色AV影视| 大二网站亚洲| 亚洲欧美变态| 色鬼在线综合| 最近的最新的中文字幕视频| 日本人妻中文字幕| 9Ⅰ超碰| 国产不卡中文字幕免费avi| 国产99精品一区二区三区免费| 欧美色图小说综合 | 女人久久久| 国产性感在线观看| 婷婷深爱五月| 91动漫操逼视频| 91制服丝袜中文字幕| 亚洲淫乱骚妇AV| 国产在线精品偷| 亚洲欧洲日韩天堂av| 日日AAvv| 伦理日韩国产久久| 开心六月色| 免费看毛片操穴| 多毛小伙内射老太婆| 亚洲情色 自拍| 草蕉影视亚洲无码| 亚洲欧美精品一区天堂久久 | 99re综合伊人| 色情亚洲日本成人| 九九综合| 中文字幕 人妻不满 在线视频| 中文字幕人成乱码熟女香港| 人人妻人人爱人人玩| 亚洲交换| 九九九九免费高| 亚洲丝袜二区| 精品人妻伦一二三区久久| 国产精品美女在线一区| 国产欧美精选自拍一区| 思思热免费在线视频| 秋霞操逼片| 日韩免费簧片| 香蕉热人人精品| 1769国内精品视频| 成人性爱免费播放| 日韩欧美亚洲自拍偷拍| 久久夜夜| 99999精品| 欧美性高潮| 亚洲天堂一区二区| 无码人妻毛片丰满熟妇精品区| 国产97在线 | 亚洲| 国产精品动态一区二区三区四四| 亚洲第一二区另类图| 怡红院怡春院| 日本东京热大香蕉a片| 绑缚麻绳人妻寝取完整版| 五月天伊人| 天天看特黄的免费网站| 夜夜騷av、一區二區| 日本青青草在线| 久久国产精品91| 嗯嗯嗯啊啊啊在线免费观看| 91红杏| 一区中文字幕二区日韩| 91新在线欧美| 黄色片大香蕉| 好吊妞转入那个网| 日本在线视频导航| 中文啪啪视频| 日韩无码人妻| 国产亚洲深夜激情| 欧美精品久久| 久久久久久久久久精| 亚拍在线| 91亚洲电影| 国产精品久久妻无码网站| 亚洲高清国产理伦片| 久久性爱免费送| 97干com| 啊啊啊啊,啊啊好多水 | 四虎免费视频| 久久久96| 久久五月婷| 97超碰亚洲| 97天堂| 欧美精品久久久久久久久88| 97青青操视频| 九热久| www超碰| 成人精品水蜜桃久久久久久久| 92久久| 亚洲无码久久久久久久| 亚洲AV免费在线观看| 東南亚性呦成人伦理资源在线视频| 精品人妻一区二区三区四区石在线| 俺去俺来也在线www| 欧美日韩亚洲高清不卡一区二区三区| 97免费在线观看| 亚洲天堂 视频你懂的| 东京热精品97综合网| 97色伦97色伦国产欧美| 国产精品天美传媒| 日韩精品在线视频在线观看| 久久99国产综合精品女同| 天天激色| 极品内射| 中日高清无码操逼视频| 欲女人妻性色av| 亚洲国产精品9999在线观看| 97久久久久久久精| 91情色在线| 免费视频97| 青草青草久热| 欧美日韩性爱操大逼| 亚州乱码中文字幕综合久久久| 俄罗斯及免费在线看| 亚洲国产一区二区三区在线| 干我久操| 熟女精品一区二区在线观看| 欧美成人午夜免费福利785| 99蜜月精品久久| 色综合99| 日本三级一区二区 在线| 欧洲小说色图视频另类| 热热色色综合| 欧美精品精品一区二区| 亚洲男人的天堂V| 国产成人综合在线播放| 久久久久熟女| 嗯嗯啊啊好大好爽| 欧美在线播放aaaa| 26uuu欧美| 岛国999| 人妻一区视频| 亚洲中文字幕熟女| 四虎影视永久在线观看精品免费网站| 先锋精品av色鲁| 狠狠色狠狠色狠狠五月| 麻豆视频一区二区| 91男同| 夜夜高潮夜夜爽高清视频一| 乱老女人一区二区视频| 精品久久久久久中文字幕三区| 蜜臀99久久国产| 极品AV网站在线观看| 91超级碰| 97色涩| 岛国色情视频在线观看| 久久久久久久久久久久九| 色综合天天| 天天做日日做天天欢。| 国产精品熟女丝袜一区二区| 亚洲九区| 亚洲诱惑| 福利视频香蕉免费一区二区在线| WWW操逼| 夜夜操一区二区| 国产剧情一区在线观看| 亚州 综合 色图| 啊啊啊啊啊啊在线| www.av不卡中文字幕| 极品久久久久久久久久久久久久| 久极品在线观看| 青青网三级视频| 成人AV素股で擦久久| 伊人青青一区成人视频在线观看区| 玖玖视频在线资源一区二区三区| 五月天偷拍| 欧美嫩性色| 午夜性| 久久爱超碰网| 就去色综合| 亚洲精品欧洲色| 夜夜草我| 精品久久久高清无码| 午夜无码精品免费看性色| 午夜黄色免费在线观看| 天天日天天操心| 欧美大香蕉97| 久九9精品| 中国人高清www色视频免费| 精品免费视频国产一区| 国产亚洲女v在线观看| 黄色网址在线免费观看| 色婷婷影视| 日韩欧美成人大香蕉| 综合97久久| 亚洲巨爆乳一区二区三区四季网| 亚洲AV操| 国产传媒美日韩av| 亚州性色| 色播综合| 久久久免费懂色| 欧美夜夜草视频| 亚洲性爱高潮影院| 无码九九九九| 国产精品久久久久久久黄无码| 久区视频| 欧美亚洲涩涩| 亚洲日本大香蕉1| 97在线观看视频| yazhouzaixian| 综合网少妇| 天堂蜜桃无码视频一区二区| 日韩一级成人毛片免费观看 | 日本在线观看网址| 夜夜操av亚洲一区二区| 久久专区| 四虎永久在线精品免费网址| 91爱看| 国产精品自拍xxxx| 国产亚洲色停停久久99精品91| 成人AV素股で擦久久| 亚洲情色综合| 亚洲欧美色图| 日韩一性一交一A片俄罗斯| 亚洲国产熟妇综合色专区| 91制服丝袜| 无码操逼视频一下| 国产视频三区四区| 激情综合二| 亚洲伊人a线观看视频| 校园春色家庭伦理欧美激情| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 综合网欧| 84YTCOM性无码| 欧美亚男人的天堂| 国产99精品一区二区三区免费| 天天综合网~91入口| 日本女人操逼| 97超碰站| 97久久精品不卡| 韩日精品四区| 亚洲国产成人福利在线观看| 欧美淫乱视频| 九九九久久久久| 丁香五月天激情网站| 一区二区影视| 91人妻素女| 亚洲高清色综合| 操我啊啊啊啊啊| 日韩无码专区| 国产av激情无码久久天堂| 久久精品无码熟妇一区二区三区视频导航 | 日韩成人精品中文字幕| 日韩成人私密一级精品av| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 中文字幕一区二区三区四区在线视频| 久草免费在线一区二区| 熟妇国产免费一区| 日本色婷婷| 人妻无码一区二区三区久久99| 欧美日韩亚洲一区二区在线观看| 久久精品国产亚洲AV片多多| 日韩在线女优天天干| 中国熟女网站| 91性网| 人人操我人人干| 激情欧美97| 亚洲啪啪啪啪视香蕉| 91久久久久久久| 91欧美美女日韩国产婷婷| 国产粉嫩蜜臀av一区二区三区| 男人久久精品| 亚洲综合性感在线| 亚州精人品大香蕉| 人妻少妇精品一区二区三区| 午夜男女爽爽爽在线视频| 可以在线观看AV的网站| 色乱二区| 婷婷深爱五月| 激情婷婷五月天| 久热色情精品| 9精品在线| 精品999日本| 久久精品人妻一区二区三区| 欧美色图99| 美女诱惑一区| 人人干黄色| 精品区国产区一区二区三区| 色噜噜狠狠色综合日日| 亚洲熟妇丝袜在线观看| 日韩精品99久久久久久中文字幕 | 强奸乱伦AV一天堂网| 中文久久| 极品销魂美女一区二区 | 色婷网| 精品久久97观看在线视频| 操九九九九九九| 色吧5亚洲| 91久久久久久久| 一区二区三区免费岛国片| 婷婷香蕉| 人妻丝袜肏逼| 亚洲无线码欧洲精品区别| www.色五月| 色老久久| 8x福利精品第一福利视频导航| 超碰在线91| 热久久无毒不卡| se01国产在线视频| 亚洲熟女乱熟乱熟妇综合网二区| 91人妻人人澡人人爽人人精品| 国产真实野战在线视频| 精品九九九九九九九| 人人摸人人入| 日日干日日操五月天伦理视频| 欧美综合色图片| 在线可观看的黄色网址| 丝袜狂射91| 日本免费一级AAA大片器| 91女在线观看| 国产亚洲色停停久久99精品91| 亚洲男人天堂Av| 97在线免费视频观看| 九月丁香婷婷| 久久少妇| 99国产在线绯色一区| 夜夜骑夜夜操| 天天综和| 波多野结衣一级视频| 狠狠亚洲| 逼逼逼逼操操操操操操操操操午夜剧场 | 99999国产| 这里有精品| 91制服丝袜中文字幕| 亚洲第一页色| 一二三区操逼国产91| 任我爽视频在线观看| 亚洲 欧美 日韩 国产一区二区| 欧洲综合视频| 欧美1区二区三区公司 | 黑人嘿嘿嘿超爽免费视频| 久久超碰98| 色乱二区| 91亚洲欧洲| 亚洲第一页欧美| 污污汅18禁网站在线永久免费观看 | 亚洲深夜福利| 成人影 天天操 亚洲| 大香蕉乱级| 91AV天美在线视频| 精品少妇一区二区三区在线视频| 9丨久久九九九| 97资源欧美| 久久久免费的精品| 97精品一区二区三区免费| 色好看av| 久久99人妖视频国产| 清纯唯美亚洲综合| 麻豆人妻偷人精品无码视频| 色五月婷婷五月天| 久久av一级av少妇av高潮| 97色欧洲| 日韩精品9999| 亚洲精品男人的天堂| 亚洲天堂在线怕怕视频| 91欧美少妇| 亚欧美天堂在线| 天天精品| 免费的很黄很污的全部视频| 日韩91网站| 亚洲熟久久| 殴美,日韩国产伦精品| 日韩人妻播放| 亚洲中字幕日本一区二区三区| 欧美亚州色的图| 91xingse| 九九在线视频| 91强热人妻| 亚洲人体视频在线观看| 竹菊一区二区三区AV线| 青草视频人妻在线观看| 久久精品视频28| 精品久久久无码| 五月天黄色激情视频| 亚洲国产精品成人综合| 91成人18| 欧洲精品二区| 婷婷九月丁香| 好爽要喷了| 性性欧美| 欧美少妇高潮| 日本亚欧爱爱| AV在线播放网址| 精品久久久不卡一区二区| 欧美日韩222| 日韩三级视频一区二区三区| 亚欧性爱在线无码| 亚洲超碰AV| 欧美精品日韩久久久九| 欧美熟妇成人一区二区| 中文字幕av亚洲精品| 91欧美综合| 亚91网| AV中文字幕三四五| 国产91丝袜 在线播放| 亚洲校园激情| 午夜福利合集| 国产又粗又长视频| 国产sv美女内射| 久九九九九九九九热| 中文字幕av一区二区三区人妻少妇 | 伊人网在线观看| 久久伊人网视频一区二区三区| 2001天天操| 久久国色天香香蕉| 青青草在线视频人人想人人上| 亚洲18禁| 中文字幕人妻色偷偷久久皮| 狠狠2050在线观看| 四虎在线免费视频| 天天肏夜夜肏| 亚洲精品99999| 久久产精品一区二区三区电影| 男人天堂网址| 欧美中文字幕日韩在线| 日欧亚洲二三区大片不卡| 91成人精品在线播放| 亚洲成人美女无吗| 免费看日本操逼视频| 日本狠狠干| 久久精品免费| 精品无码久久久久| 男人天堂毛片| 免费成人自拍视频在线| 欧美的性爱网站免费| 草草网站影院白丝内射| 色99在线| 超碰 另类 欧美| 色网1| 黑人精品欧美一区二区蜜桃| 2020久久免费视频| 人人看欧美性爱| 9久精品| 日韩精品人妻中文字幕有码午| 超碰97最新人妻| 中文字幕av一区二区三区人妻少妇| 国内一级精品| 欧美黄色大片在线观看| 91日韩在线| 吉川爱美98堂在线| 加勒比色99999| 国产又黄又粗又猛大片| 亚洲蜜桃V妇女| 久久欧美按摩999| 久久一区二区加油站| 丁香九月婷婷| 欧亚在线视频| 欧美精品偷拍| 狠日欧美| 国产精品99久久久www| 搡老女人老妇女老妇老熟女怎么读| 天天射夜夜| 91肉片| 色色婷婷丁香| 日韩不卡网操逼中文字幕日韩| 91精品人妻| 强奸乱伦麻豆| 自拍视频大全亚洲专媒视频/一区二区三区| 久久精品一区一起草| 精品国模无码| 男人天堂2019亚洲| 十八禁电影伊人网| 18禁免费视频| 中文字幕乱碼在线| 丰满人妻区一区二区三| av九九| 破处bbq| 91深夜夜| 亚州色图狠狠干| 91老熟女| 校园春色制服丝袜中文字亚洲| 热久久无毒不卡| 中国少妇XXXX做受| 精品国产99| 国产品精品自在在线午夜免费| 色区久久| 欧洲亚洲人妻无码久久三区四区| 伊人黄色视频免费观看| 91性| 亚洲成熟国产精品美女| 无码久| 乱伦色图网址是多少| av在线浏览| 老熟妇乱轮| 青娱乐导航AV| 久久的免费性爱视频| 日韩在线视频1234| 97视频网站| 国产青一二三| 26uuu成人影片| 日韩成人午夜精品久久高潮| 久久久久久久久久va| 欧美高潮在线| 欧美性爱免费短视频| 精品一久久久| 午夜福利在线合集| 人妻五十路在线| 久草国产在线视频| 欧美日韩美女精品久草一区二区三区 | 88xx成人精品视频| 欧洲亚洲人妻无码中字久久三区四区| 熟妇xxxxx性春色| 最新精品久久蜜桃| 亚洲二区精品在线观看| 亚洲区小说| 丁香五月激情五月| 亚洲精品久久久久毛片A片拉屎 | 亚洲精品国产熟女| 超碰碰小说97| 五月天综合网| 欧美高清18A片| 情色五月天网| 国产原创剧情在线丝袜| 色欧洲| 91中文精品日韩欧美在线| 亚洲天堂AV在线播放| 伊人视频| 天天欧美欧美亚洲网| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 又大又大又大又粗爽高潮观看| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 9超碰免费| www.91理论| juliaann丝袜| 亚洲激情天堂网| 国产女人成人精品视频| 日韩在线观看三级电影| 日韩啪啪啪视频| 超碰av在线| 偷拍三区| 丰满人妻一区二区三区免费| 麻豆性爱视频在线播放| 久久久国产成人一区二区三区在线| 97Ai亚洲| 噜噜噜亚洲精品| 首页亚洲国产高跟丝袜诱惑视频| 日韩黄片视频试看| 丰满人妻大屁一区二区| 好色综合| 亚洲欧美变态| 国产日韩人人| 爱爱60秒免费视频| 欧美成人性爱视频免费观看| 91在线视频国产网站| 999九九九九国产动| av在线人气| 欧美色五月| 金莲网址| 欧美成年人性爱视频免费观看| 久久99干一本高清| 九区国产| 手机不卡视频不卡在线一二三区| 强奸xx国产| 老熟女乱子伦中文字幕一区二区| 97超碰站| 久久久夜夜夜| 国产精品69久久久久久久| 精品久久久久久久久久久久 | 麻豆天美91| 久久久精品九| 天美一区在线| 91国产美女丝袜足交精品视频| 九九九九九九亚洲| 人妻少妇色综合| www.av在线观看| 口爆吞精在线观看| 丰满岳乱妇一区二区三区 | 久久999久| 蜜桃久久久久久久| 亚洲色图大香| 天天爽天天操| 五月丁香激情综合| 日韩AV一起草| 人人摸人人叼| 亚洲人妻中文高清| 八人操人人摸人人看| 大香蕉视频一二三区| 日韩有码 一区二区三区| 探花精品 一区二区| 啊啊啊啊啊好多水| 九九亚洲| 日韩啊V| 亚洲最新Av| 1000部熟女视频在线观看| 亚洲欧洲成人在线电影| 日韩三级伊人| 超碰在线人妻中文字幕| 激情熟女12P| 国产午夜精品理论片一二三区区| 欧美一区二区三区不卡高清视频 | 青青草国产盗摄一二三区| 97超碰逼| 九九热精彩视频| 久久一区二区加油站| 精彩久久中文| 欧美高清91| 99热在线播放| 无码久久国产| 中国少妇XXXX做受| 黑人精品成人一区二区三区 | 欧美综色欧| 五十路熟女人妻一区二区三区四区五| 999综合网| 欧美十八禁视频| 3028国产精品| 婷婷五月天激情网| 蜜色网色哟哟| 97精品97久久| 九久久精| 国产精品麻豆成人av| 操操操日本的逼| 五月丁香六月婷| http://qxhbdz.com| 中文字幕久久精视频久久大全| 91欧美丝袜| 亚洲色图欧洲| 免费观看国产不卡av| 亚洲欧美日韩夜夜| 啊嗯好大视频在线观看| 国产久久男人天堂| 射久久| www.99中文字幕| 激情五月天网站| 69人妻精品丰满熟女区| 熟妇女伦乱视频视频| 一起草三级AV电影在线观看 | 秋霞鲁丝午夜无码一区二区三| 欧美性色欧美| 中文字幕一区二区三区字幕| 日本肉体xxxx裸交| 大香蕉手机在线| 操碰97| 国产福利第一视频| 国产精品 午夜福利| 久草成人影片| 1000部熟女视频在线观看| 一区三区啪啪| 欧美一二三区四五区| 在线洲亚线| 日韩性爱1级片视频| 大香蕉97久久| 丰满熟女人妻一区二区三五十一路| 国产精品人妻无码久久久互動交流 | 91久久午夜无码鲁丝片久久人妻| 精品久久久一本一道| www.yeyecao| 青青草视频这里只有精品| 无码操逼天堂| 影音先锋每日最新资源在线观看| 激情网五月天| 91国产丝袜美女| 人人干黄色| 久久色人体| 天天干人妻视频| 欧美一区二区三区蜜桃| 亚洲91网。| 一级二级在线观看| 婷婷五月丁香五月| 凹凸 69堂 在线播放| 日韩美女操b| 诱惑人妻欧美一区在线播放| 欧美性xxxxx狂欢| 日本三级大片| 桑老女人九区| 人妻精品视频一区二区| 午夜毛片高清免费不卡| 午夜福利一区二区影院| 国产视频三区四区| 亚洲欧美不卡线| 操操AV电影| 99少妇| 99精品久久| 午夜美女诱惑电源网| 精品久久人妻成人网| 97天天在线| α√在线| 色综九九九一区| 一区二区娱乐网站| 久肏视频字幕| 狠狠干婷婷| 狠狠爱夜夜| 婷婷五月天小说| 欧美天天综合网版| 色性综合| 婷婷色综合欧美日韩| 性感女人网页在线观看视频| 成人免费性爱视视| 99re3这里只有精品| 亚洲码在线中文在线观看| 情色av电影| 91香蕉视频在线观看免费| 蜜臀久久99精品| 51一区二区三区| 91色射| 天美国产三级传媒| 99婷婷一区二区| 丁香婷婷激情五月天无毒不卡| 日本黄色大片一级视频免费麻豆| 黄资源| 在线看免费无码AV天堂的| 精品少妇99| 清纯唯美激情四射| 天天艹天天日| 9精品久久久久| 99re6国产精品99re在线| 欧美性生活男人的天堂| 丰满人妻一区| 天天插天天干| 国产精品99精品视频网站| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 久久这里是精品| 久草线上视频免费看| 中文字幕黄色片| 神马久久久久| 欧美日韩人妻婷婷一区| 99热最新网址| 国产亚洲精品一区二区三区| 美国三级日本三级久久99| 激情五月综合网| 亚洲 中文字幕 精品| 走光一区92下载| 99精品在线| 日韩av不卡在线看| 男生通女生屁股| 亚洲不卡av在线| 国产小u女在线观看| 91美女在线观看| AV中文字幕剧情1区2区3| 97五月天| 日本操逼视频导航| 97天天综合| 久久国产熟女影院| 欧美丝袜91| 亚洲熟女乱熟乱熟妇综合网二区| 久草五月| 国产精品一区二区三区,亚洲综合| 啪啪自拍九九综合| 天天摸天天舔天天操| 操九九九九九九| 熟女突然公开看18禁影片| 中国农村熟妇毛片视频| 日本大香蕉综合网红本杳社区| 五月天久久婷婷亚洲| 五月天激情国产综合婷婷婷| 岛国黄| 久久久久久久免费A片国产成a人亚洲精∨品无码 | 黄片免费日韩| 九九热精品| 97国产综合欧美| 妇女视频网站| 在线啊啊啊啊| 99色色| 囯产乱伦一区二区三女| AV和黑人在线播放| 婷婷超| 人妻一区二区三区熟女| 天天操熟妇| 九九热精彩视频| 97色97好| 色女综合| 亭亭丁香激情| 久久天天摸| 久久99热这里只频精品6学生| 无码人妻丰满热妇又大又粗| 强奸乱伦AV网站| 欧美爱三级日韩久久| 在线午夜成人无码视频| 91美女小视频| 91欧美经典| 风间由美日韩欧美久久| 超碰97人人乐| 另类图片五月天| 国产AV天美传媒一区二区三区| 91AV天堂| 不卡一区视频| 欧美一级专区免费大片| 色男人色天堂东京热| 亚洲诱惑| 色网综合网| 老女人91| 97资源站久久| 亚洲不卡一| 欧美韩日精品99综合| 国产精品对白自产拍| 90后后入| 久久久精选| 国产精品久久久久久久久久久久久久吹| 91精品导航| 四虎在线观看视频| 日韩熟女三十乱伦| 国产成人拍国产亚洲精品| 日韩免费三级黄片电影| 国产超碰AV在线精品| 中文字幕五月婷婷免费| 中文字幕一区二区日韩网| 亚洲精品官网在线观看| 日韩AV一起草| 五月丁香久久| 日韩精品高清资源在线| 久操 高清| 青操影院| 蜜臀AV一区二区三区| 亚洲图片欧美| 色操逼网| 秋霞一级视频在线观看免费| 亚洲欧美精品91| 熟女一区二区| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 久久久久国产一区二| 婷婷色色五月| AV天堂电影网| 中文日韩欧美熟| 天天久久| 777AV电影| 丁香五月性| 天天亚洲综合| 97欧美色| 成·人免费午夜在线观看| 国产亚洲精品美女久久久| 亚洲欧洲网站免费观看| 欧美美女自慰一区二区三区| 加勒比综合九九99视频在线播放| 精久久久| 欧美岛国精品在线观看| 国产综合网站在线播放| 五月天社区| 天天射夜夜| 神马久久久久久久| jizzjizz欧美| 久操B网| 性九九九九九九| 国产偷人伦激情在线观看| α√在线| 男人的天堂.com| 91精品91久久久久77777| 婷婷伊人五月| 国产激情视频在线观看| 久久綜合很很很| 玖玖久久久| 成人精品一区二区91毛片不卡| caorenqi shipin| 国产成人精品午夜福利| 张柏芝国产一区在线观看| 亚洲精品aa久久伊人| 午夜天堂网| 超碰色图| 18禁超污无遮挡无码免费网| 白丝AV网站| 91五十路| 五月婷婷性爱| 天天影视之亚洲综合网| 日韩无码视频黄色| 日韩国语字幕| 色亚洲欧美| 亚洲成a人在线观看久| 超碰97玖玖爱| 东京热一区二区中文字幕| 色香蕉影院| 欧美日韩系列| 亚洲欧综合另类无码一区| 国产超碰在线一区| 国产精品高潮久久久无码| 五月婷色| 日韩欧美久久婷婷网站| 免费啪啪一级视频| 亚洲精品1区| 国产三级资源在线观看| 久九干| 欧美精品三级黄片| 国内91熟女人妻丝袜天天精品视频在线 | 97免费在线观看视频| 欧美性爱另类综合| 熟女91网| 91动漫操逼视频| 99999这里都精品| 日韩 欧美 另类 人妻| 性性欧美| 91精品国产日韩欧美综合| 99国产精品免费| 天天懆天天日| 99精品伊人| 免费一级特黄特色大片在线观看看| 大香蕉综合久久| 蜜乳Av成人片网站| 9999九九九久久久| 日韩一性一交一A片俄罗斯 | 这里都是精品在线观看| 丝袜视频网国产90| 97干在线| 久久99午夜精品一区人妻| 综合网97| 97最新在线播放视频| 国产97av| 少妇99成人麻豆| 国产真乱mangent| 伊人991| 干日本人少妇午夜寂寞影院| 91jk色拍| 老司机午夜精品福利视频一区二区 | 影视综合无码少妇| 欧美 日韩 国产传媒| 丰满人妻一区二区三区性色| 久久啊啊啊视频| 婷婷五月天激情网| 5252色欧美在线男人的天堂| 久久综合五月天| 日本操逼视频免费| AV丝袜少妇| 午夜寂寞欧美| 午夜欧美精品久久久| 国产精品天美传媒| 日本一区视频在线观看| 欧美一区二区三区成人性生活| 国内三级自拍小视频在线观看| 久热最新在线杭州| 日韩二三区| 国产精品自在自拍视频| 亚洲丝袜少妇在线| 爽爽爽免费视频| 性爱1区| 日本一级真人黄色性爱视频| 欧美中文狠| 亚洲五月婷婷| 国产亚洲福利第一页丝袜| 国产免费一区| 中文字暮97| 顶级丝袜熟女一区二区三区| 射久久| 亚洲日韩久久精品一区| 日本狠狠干| 中文字幕中文字幕一区二区| AV有码在线| 中 文字幕一区二区三四 五 区日 日 骚| 8050无码八戒| 999综合网| 国产精品国产| 欧洲免费一区二| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲人天堂| 亚洲清纯唯美| 九九九久千久久激情蜜桃在线看 | 久久是精品| 婷婷综合在线观看| 丁香九月激情啪| 久久午夜鲁丝片| AV色女综合| 中亚黄色三级大片| 亚洲熟女国产综合另类| 国产AV久久久蜜爱影集| 国产亚洲日韩欧| 91亚洲欧美激情| 美女丝袜激情小说| 色哟哟-国产专区| 狠狠穞A片一區二區三區| 国产福利在线视频网站| 人人爱人人乐人人操| 精品免费囯产一区二区三区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 久久久性| 一区二区三区看视频| 精品无码一区二区人妻久久蜜桃| 蜜桃久久久久久久| 熟女精品一区二区三区| 另类小色呦| 亚洲精品天堂久久A∨51成人漫| 女沟厕偷窥piss小便| 78精品| 综合自拍| 国产精品一二三| 欧美色图在线视频少妇| 夜夜国产一区| 97欧美精品综合| 中文字幕91综合| 午夜精品久久久久久久男人的天堂| 亚洲欧美国产其他二区| 一起草欧美| 国产家庭乱伦性爱视频| 日韩综合无码一区久久92| 91国模| 狠狠超| 91网站18| 外站AV在线| 亚洲高清自拍| 九九热九九| 日韩无码极品| 天天色图| 精品无码一区二区三区色欲| www.四虎在线| 少妇贴图| 久九九九九九九九热| 久久久青草青青国产亚洲免观精品高清完整版_97久久综合区小说区图片区,国精品 | 偷拍 亚洲 欧美| 无码人妻一区二区三区免费九色| 九九九国产| 久久系列| 性夜影院爽黄A爽免费动漫| 97精品久久| 20cm女自慰在线日韩欧美| 五月天我淫我色av| se吧提供国产乱老熟视频胖女人| 无码高清少妇久久| 成人免费看吃奶视频网站| 久操网视频| 精品一区二区人妖| 色丁香五月婷婷| 日韩素人无码一区二区三区三州|