国产成人欧美一区二区三区vr_久久国产精品人人爽人人爽_国产精品永久免费播放_肉欲啪啪a∨无码精品一区二区_国产超短裙jk丝袜在线_亚洲AV片高清资源在线观看_国模无码一区二区三区久久_国产成年人未进视频_中文字幕无码精品夜_一区二区三区在线视频免费看_亚洲成AV人片在线观看网址_日本激情视频高清综合久久_亚洲午夜视频福利_国内大量揄拍人妻精品視_久久国产精品福利二区三区

ARTICLE DETAIL

資訊詳情

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

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

PL0編譯器設(shè)計與實現(xiàn):從詞法分析到中間代碼生成的編譯原理實驗指南 簡介這是山東大學(xué)編譯原理課程PL/0編譯器實驗的完整實現(xiàn)面向計算機(jī)專業(yè)學(xué)生及編譯原理學(xué)習(xí)者覆蓋詞法分析、語法分析、語義分析與符號表建立等編譯器前端核心環(huán)節(jié)。壓縮包共94個文件、約513KB以C/C源碼、CMake構(gòu)建腳本、可執(zhí)行程序、實驗報告及多組測試輸入與運(yùn)行截圖為主要內(nèi)容便于對照工程結(jié)構(gòu)重新編譯和驗證結(jié)果。目前已有104人學(xué)習(xí)下載。資源除完整可運(yùn)行的PL/0編譯器外還包含模塊劃分清晰的工程組織、多組PL/0測試程序如素數(shù)、乘方、公約數(shù)計算及對應(yīng)截圖可直接用于課程設(shè)計參考、實驗報告撰寫和編譯原理備考復(fù)習(xí)。1. PL0-Compiler是什么把編譯原理課程實驗壓成一臺能跑的小編譯器第一次打開“PL0-Compiler 山東大學(xué)SDU編譯原理課程實驗”這個項目標(biāo)題時我差點(diǎn)把它當(dāng)成又一個普通的課程設(shè)計。真正動手之后才發(fā)現(xiàn)它要求你為一種叫 PL/0 的教學(xué)語言寫一個完整的小型編譯器從詞法分析到語法分析再到符號表、語義檢查、中間代碼生成最后還要有一個解釋器把程序跑起來。PL/0 本質(zhì)上是 Pascal 的極小核心子集只有常量、變量、過程、賦值、if、while、call 這些最基礎(chǔ)的語法單位但恰好把編譯原理課程里最該掌握的主干線全部覆蓋了。所以這篇筆記的服務(wù)對象很明確你要么是剛拿到 PL0-Compiler 實驗、不知道從哪下手要么已經(jīng)寫完一版但總在某幾個邊界用例上翻車。很多學(xué)校的編譯原理實驗都在 PL/0 上做或大或小的剪裁SDU 的版本也跳不出“語言說明 編譯器框架 解釋器”這個套路。下文我會按順序拆開詞法、語法、語義和代碼生成每一步都給出能直接抄的代碼和參數(shù)最后再把我踩過的幾個坑完整復(fù)述一遍。用 Java 來寫編譯原理實驗是最常見的選型對象化改造也順手這篇就默認(rèn)用 Java 落地。2. 詞法分析先從源文件榨出干凈的 Token 流PL0-Compiler 的地基詞法分析是整個 PL0-Compiler 里最先動手的部分也是很多初學(xué)者“看著簡單、寫起來全是暗坑”的地方。PL/0 的詞匯很少十幾個保留字、一個標(biāo)識符、一個整數(shù)、幾個運(yùn)算符和界符所以常見做法是只寫一個 getsym() 函數(shù)每次調(diào)用從源代碼里取出下一個 Token。這里有兩個決策會直接影響后面所有代碼Token 用什么結(jié)構(gòu)表達(dá)關(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(標(biāo)識符), 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對應(yīng)程序結(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 對象從詞法階段傳到語法分析再傳進(jìn)符號表字符串只在最開始保留一份后面全程都用對象引用查錯了也知道該把錯誤定位到第幾行。2.2 getsym 主循環(huán)先收標(biāo)識符再查表收編關(guān)鍵字PL/0 的保留字不多但如果你寫成if word.equals(const) else if word.equals(var)這種長串一旦要加關(guān)鍵字或者調(diào)整大小寫策略函數(shù)會臭不可聞。編譯原理實驗里最穩(wěn)妥的做法是源程序里以字母開頭的連續(xù)串一律先當(dāng)作“可能是標(biāo)識符”來掃描然后查一個 Map查不到就是 IDENT查得到就改成對應(yīng)保留字。先定義保留字表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); } }這段邏輯里我允許了標(biāo)識符中包含數(shù)字和下劃線這是很多課程實驗會給的小放寬。如果你拿到的文檔嚴(yán)格規(guī)定“標(biāo)識符只能以字母開頭后續(xù)只能是字母或數(shù)字”把_的分支去掉就行。大小寫策略也值得提前定好我做了toLowerCase()所以Begin和BEGIN都會被識別成 begin如果你們的實驗區(qū)分大小寫刪掉 toLowerCase 并且保證保留字表全小寫也可以。注意關(guān)鍵字識別采用“先當(dāng)標(biāo)識符掃再查表改判”的順序比邊掃描邊逐字符匹配要穩(wěn)得多。這樣標(biāo)識符和關(guān)鍵字共用同一套字符推進(jìn)邏輯少一個分支就少一類 bug。2.3 三個容易埋雷的邊界多字符符號、整數(shù)溢出、非法字符多字符符號是詞法階段最容易留坑的地方。PL/0 的不等號是#而不是!小于等于和大于等于分別是、賦值號是:。每次 getsym 只推進(jìn)一個字符所以遇到時必須看一眼下一個字符是不是是就合成一個 LE同時 pos 要推進(jìn)兩位漏掉這次 peek 的錯誤非常難查癥狀是x 2被解析成和兩個符號語法分析直接懵掉。數(shù)字掃描我建議用 long 做累加再判溢出不能等 int 已經(jīng)溢出之后再補(bǔ)救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ù)字全部消費(fèi)掉否則一個大整數(shù)會被拆成兩段數(shù)字后面可能誤判成合法程序。非法字符的處理同理、^、$這類誰都不是的字符如果分支里只報錯不推進(jìn) pos下一輪 getsym 還會看到同一個字符輕則錯誤刷屏嚴(yán)重時直接死循環(huán)。正確做法是報錯之后pos繼續(xù)。注釋要不要支持一定要看實驗文檔。有的 PL/0 版本沿用 Wirth 原書的{ }注釋有的學(xué)校改成/* */有的是壓根不要求。如果要求支持我一般只做非嵌套的/* */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)中間不需要反復(fù)調(diào)用 getsym。缺點(diǎn)是注釋不閉合時 pos 會一路走到文件尾所以主流程里最好檢查一下pos是否已經(jīng)越界并報“注釋未閉合”。寫完詞法器我建議先跑一個臨時 main把源文件里的 Token 流打出來看一眼確認(rèn)無誤再往下寫語法分析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 文法表達(dá)式優(yōu)先級不再翻車詞法分析把源程序切成 Token 流之后語法分析負(fù)責(zé)按文法把這些 Token 組織成語法結(jié)構(gòu)。PL/0 的文法是經(jīng)典的自上而下文法常見做法是手寫遞歸下降一個非終結(jié)符對應(yīng)一個函數(shù)。它和 LL(1) 文法長得幾乎一樣手工實現(xiàn)也不需要額外的表驅(qū)動框架調(diào)試時還能直接看到調(diào)用鏈最適合作為編譯原理實驗的骨干。3.1 PL/0 的文法全貌先把 block 和 statement 遞歸關(guān)系畫清楚一份標(biāo)準(zhǔ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)和文法一一對應(yīng)答辯的時候別人問哪段對應(yīng)哪條產(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要格外小心。每個塊進(jìn)入時都從某個固定偏移開始給局部變量分配槽位但這個偏移不能一直累加否則不同塊的變量地址會互相踩踏。所以進(jìn)入 block 時保存舊值塊結(jié)束再恢復(fù)正是這段代碼里savedVarOffset的職責(zé)。3.2 expression/term/factor 的調(diào)用層級乘除為何排在加減下面表達(dá)式是語法分析里最好檢驗優(yōu)先級的地方。PL/0 的表達(dá)式定義成[加號|減號] term { (加號|減號) term }term 定義成factor { (乘號|除號) factor }factor 才是真正出現(xiàn)標(biāo)識符、整數(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); } } }這段代碼先處理一元正負(fù)號再通過 while 循環(huán)把同層級的加減法運(yùn)算符全部消耗掉。如果沒有最前面的if (sym Kind.PLUS || sym Kind.MINUS)-x1就會被理解成“負(fù)號后面缺一個操作數(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, 未定義標(biāo)識符 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)在表達(dá)式中 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()必須放在每個分支的公共出口否則解析到非法因子時會原地重復(fù)處理同一個 Token遞歸下降立刻被打成死循環(huán)。寫完這三層拿12*3和(12)*3兩個用例分別驗證一個結(jié)果應(yīng)該對另一個應(yīng)該不對如果輸出反了多半是 expression 和 term 的層級倒掛了。3.3 test() 錯誤同步語法分析如何從第一個錯里活下來遞歸下降解析器遇到一個不期望的符號時如果只是簡單報錯并 return后續(xù)語句大概率會被連環(huán)誤報。經(jīng)典 PL/0 教材里的做法是寫一個test()函數(shù)它接收一個期望符號集合如果當(dāng)前符號不在集合里就報錯并向前同步直到找到集合中的某個符號為止。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 前先確認(rèn)當(dāng)前符號是語句合法的開頭 test(new int[]{Kind.IDENT.ordinal(), Kind.CALL.ordinal(), Kind.BEGIN.ordinal(), Kind.IF.ordinal(), Kind.WHILE.ordinal()}, ERR_STMT_EXPECTED, 語句開始符號非法);“同步”這個詞聽起來玄實際含義就是跳過那些既不屬于當(dāng)前集合、也不像錯誤終結(jié)符的 Token直到找到一段可以繼續(xù)分析的結(jié)構(gòu)邊界。比如begin x : ; end里面賦值號后面缺表達(dá)式expression 會報錯但同步到end后statement 還能繼續(xù)往下走不會把“end 后面缺分號”這種假錯誤也報出來。錯誤同步是答辯論時老師大概率會問的點(diǎn)它不追求報錯數(shù)量追求報錯質(zhì)量。4. 符號表與語義動作PL0-Compiler 的判斷力藏在這里語法分析只回答“這串 Token 合不合文法”但x : 1里的 x 到底有沒有定義、能不能給常量賦值、過程名能不能當(dāng)變量用這些必須靠符號表和語義檢查來回答。符號表就是編譯器的“業(yè)務(wù)現(xiàn)場”所有聲明信息、作用域關(guān)系、變量地址都要在這里落地。4.1 符號表設(shè)計按塊管理進(jìn)入和退出 block 時自動清理PL/0 支持過程嵌套所以符號表必須按塊劃分。常見做法是給每個符號記錄一個 blockId進(jìn)入塊時壓棧并遞增編號退出塊時把屬于當(dāng)前塊的符號全部彈出。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 聲明時重復(fù)定義是最需要攔截的錯誤。判斷規(guī)則不是“全局唯一”而是“當(dāng)前塊內(nèi)不得重名”。private void constDecl() { getsym(); // 跳過 const do { if (sym ! Kind.IDENT) { error(ERR_IDENT_EXPECTED, 常量聲明缺少標(biāo)識符); return; } String name token.text; if (table.existsInCurrentBlock(name)) { error(ERR_DUP_DECL, 重復(fù)定義: 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 的棧式虛擬機(jī)里每個棧幀通常要留出三個固定槽給動態(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ù)但不應(yīng)生成 STO 指令如果變量其實是常量就更不能生成存儲指令。語義錯誤和代碼生成要分開這類“報錯但不再生成錯誤代碼”的處理是實驗評分里很容易被檢查的細(xì)節(jié)。4.3 中間代碼生成一個指令八條的表驅(qū)動虛擬機(jī)PL/0 不生成 x86 匯編而是生成一套精簡的中間指令再由解釋器執(zhí)行。我習(xí)慣用八條指令指令參數(shù)含義LITval整常數(shù)壓棧OPRop對棧頂做運(yùn)算LODlevel offset從指定層取變量壓棧STOlevel offset棧頂存入指定層變量CALlevel offset調(diào)用過程INTsize給當(dāng)前塊分配??臻gJMPaddr無條件跳轉(zhuǎn)JPCaddr棧頂為假時跳轉(zhuǎn)OPR 的子操作碼屬于內(nèi)部約定你完全可以用自己的一套編號只需要保證生成器和解釋器一致。我常用0 返回、1 取負(fù)、2 加、3 減、4 乘、5 除、6 判斷奇數(shù)、7 到 12 是六個比較運(yùn)算、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)永遠(yuǎn)多跑一次。寫完之后把指令流打印出來逐條核對你會發(fā)現(xiàn)這套虛擬機(jī)對排錯非常友好。5. 避坑PL0-Compiler 調(diào)試中我反復(fù)踩的四個編譯原理實驗坑這門實驗最大的特點(diǎn)是代碼量不大但每類錯誤都藏在最不起眼的位置。下面四個問題是我在類似 PL0-Compiler 實現(xiàn)里見過最多、自己也踩過的坑全部按“現(xiàn)象 → 原因 → 解決”的順序?qū)憽?.1 詞法死循環(huán)非法字符被吞掉后 getsym 原地打轉(zhuǎn)現(xiàn)象給詞法器一個包含或者^的測試程序編譯進(jìn)程不退出CPU 卻跑滿有的實現(xiàn)則表現(xiàn)為錯誤消息洪流刷屏到幾乎停不下來。原因getsym 在 popup fallback 里識別不了這個字符只是報錯但沒有推進(jìn) pos。下一輪 getsym 還是讀同一個字符于是無限循環(huán)。有些代碼在錯誤分支里調(diào)用了自己卻沒在遞歸前先推進(jìn) pos效果同樣。解決非法字符分支里必須先pos再報錯保證每一次 getsym 調(diào)用最多只處理一個字符。詞法主函數(shù)里凡是能返回 Token 的分支都必須有明確的字符推進(jìn)動作。我在 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īng)文法的每一層優(yōu)先級少一層就退化成完全左結(jié)合或右結(jié)合。解決嚴(yán)格按照expression → term → factor三層來寫。第一層處理加減第二層處理乘除第三層處理標(biāo)識符、數(shù)字和括號。調(diào)試時用12*3、(12)*3、-x1三個用例同時驗證任何一個不對都說明層級關(guān)系有誤。5.3 作用域污染內(nèi)層過程退出后同名變量仍然可見現(xiàn)象內(nèi)層過程聲明了一個和外層同名的變量返回外層后外層變量居然被內(nèi)層的那個同名變量遮蔽了更嚴(yán)重的是外層之后訪問這個變量時程序行為完全錯亂。原因符號表只做增加不做清理退出內(nèi)層塊時沒有把本塊符號彈出去。find 函數(shù)又總是從表尾往前查于是內(nèi)層符號一直“穿透”作用域屏障。解決用 4.1 節(jié)的 blockId 方案進(jìn)入塊時記 mark退出塊時按 mark 彈出本塊符號。寫完作用域測試用例后最好打印一份符號表觀察名字和 blockId 的對應(yīng)關(guān)系不要只靠運(yùn)行結(jié)果判斷。5.4 跳轉(zhuǎn)目標(biāo)差一行if/while 的 backpatch 算錯位置現(xiàn)象if 的 then 和 else 兩個分支同時執(zhí)行或者 while 循環(huán)多執(zhí)行一次、少執(zhí)行一次而詞法、語法、符號表都查不出問題。原因JPC 或 JMP 的后綴位置填錯了。常見做法是把回填時機(jī)放在 getsym 之后結(jié)果實際地址已經(jīng)比預(yù)期多跑了一段也有的是把“語句結(jié)束后的地址”當(dāng)成了“else 分支的地址”來填。解決把生成指令的 pc 值打印出來對照中間代碼人工走一遍。沒有 else 時JPC 應(yīng)跳到整個 if 語句之后有 else 時JPC 跳到 else 語句首條指令JMP 跳到整個語句之后。while 的回填目標(biāo)則是條件判斷指令之前形成一個向后循環(huán)的 JMP。注意不要迷信“程序跑通了就沒問題”。PL0-Compiler 這類實驗的評分點(diǎn)通常很細(xì)建議把中間代碼和符號表都保留成可打印狀態(tài)答辯時這些比嘴上講原理更能說明問題。6. 驗證 PL0-Compiler從最小用例集到自動化 diff 的收尾等到詞法、語法、語義和代碼生成都跑通之后最需要做的不是著急寫完整測試而是建立一套能反復(fù)執(zhí)行的回歸用例集。PL/0 語言小每個語法成分都不難測真正的風(fēng)險在于“改動一處帶來別處回退”這種問題只有靠自動化 diff 才抓得住。6.1 最小用例集每個語法成分都要有一個正例和一個反例我建議準(zhǔn)備這樣一個 cases 目錄每個.pl0文件對應(yīng)一個測試主題用例文件覆蓋點(diǎn)期望結(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重復(fù)定義編譯期報錯err_undef.pl0未定義標(biāo)識符編譯期報錯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í)行后打印當(dāng)前 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先算。這個習(xí)慣我當(dāng)時一直保持到實驗結(jié)束先小用例開 trace 驗證指令序列再關(guān)掉 trace 跑完整測試套件兩者配合幾乎沒有排不掉的邏輯錯誤。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
色综合av综合久久| 亚洲凸凹超碰成人| 日本操逼无码| 蜜桃久久一区二区| 国产精品农村妇女| 97资源站国产精品| 亚洲自拍一区夜夜操| 97天天爽| 91人妻人人妻| 97亚洲国产影视| 99热精品在线观看| 91久久精品国产| 五月天婷婷久久| 色色色色网站| 国产传媒1234区| 天天综合,91综合永久| 亚州九九九精品视频| 一道本东京热加勒比一区二区三区| 五月天激情国产综合婷婷婷| 色五月婷婷网| 婷婷五月天久久精品视频一区二区三区 | 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 五月丁香六月婷| 最新日产中文在线麻豆| 国产精品探花在线| 香蕉久久国产AV一区二区| 青青草色情网站视频| 绯色AV粉色AV蜜臀AV| 嗯嗯啊啊好疼| 日本道人妻久久久在线不卡色视频| 中文字幕免费看| 国模无码人体一区二区三| 午夜.DJ高清在线观看免费7| 天天艹天天日| 婷婷中文字幕| 亚洲欧美爆| 加勒比伊人综合| 五月天婷婷社区| 成人精品久久久午夜福利| 人妻丰满熟妇一区二区三| 操逼视频免费日韩无码| 成人AV素股で擦久久| 日韩欧无码一区二区三区免费不卡| 超碰78| 亚洲欧美中文一区二区三| 精品少妇高潮久久| 久久久久久久| 欧美熟妇亚洲版| 天天情欲宗合网| 口爆欧美91| 天天综合网久久ww| 久久精品亚洲婷婷| 欧美熟女丝袜| 91N综合网在线| 夜夜嗨免费视频| 操学生天天| 国产亚洲女v在线观看| 亚洲二区精品在线观看| 99夜夜操| 亚洲人精品久久久| 亚洲欧洲无码一区夜| 中文啪啪视频| 日本免费二区三区| 97精品免费| 日韩熟女操逼| 超碰久久性爱| 亚洲色 国产 欧美 日韩| 人妻少妇精品视频一区二区三区| 亚洲凸凹超碰成人| 欧洲精品欧洲精品| 91男人天堂网| 97欧美久久久久久久| 1区2区3区中文字幕日韩| av日韩国产一区二区| 91久久免费视频互動交流| 91GD.COM| 天美传媒麻豆一区二区三区国产精| 黄片免费看的| 东北女人性交| 999久久久九| 国产又黄又粗的视频| 玖玖爱伊人玖玖爱| 高潮内射在线| 欧美性爱一级操| 人人爽夜夜玩视频| 国产精品嫩草影院免费| 欧美色亚洲| 91久久国产精品| 日本黄色天堂| 欧美熟女丝袜| 色五月综合网| 丁香五月综合| 欧美一区二区三区入口| 91精品人| 国产精品嫩草影院午夜两性| 神马麻豆福利院| 成人久久无码www| 成人国产精品三级A片| 日韩日本欧美在线观看| 男人天堂2030| 日产精品久久久一区二区| 狠狠图片青青草| 国产av白丝| 免费一级毛片在线视频观看| 国产成人一级av88| 2020中文在线一区二区三区| 中文字幕在线播放2中文字幕在线观看2| 国产精品伦理| 偷偷人人精品女女久久| 激情婷婷丁香网| 96久久久精品| 久久后入制服| 久区视频| 国产精品操| 伊人91| 资源新线在线天堂| a片自拍直播视频| 久久久久久9| 嗯嗯不要视频| 七月丁香婷婷| 亚洲精品国产熟女| 日韩欧美中文| 激情深爱五月天| 亚洲天天艹| 亚洲宗合电影| 偷拍亚洲视频一区二区三区四区| 97在线免费公开视频| 女生看匆91网站| 国产97亚洲| 黄片视频观看| 欧美日韩岛国大片在线观看| 91久久国产综合久久| 天天日天天射天天干| 激情小说亚洲图片| 九九热三级片| 大香蕉久| 亚洲aw毛茸茸在线| 日韩人人精品| 绯色一区二区三区不卡少妇| 秋霞曰韩R级| 亚洲精品色| 国产免费一区| 欧美 精品国产制服第一页| 日本有码久久| 国产呦精品系列在线观看| 91在线精品一区二区三区| 可以在线观看AV的网站| 大香蕉伊人亚洲| 色综合20p| 欧美高清第一页| 亚洲一级特黄大片在线播放91| 国产激情综合| 超碰 国产熟女精品一区| 日韩一级性爱无码| 精品四五区| 亚洲日本大香蕉1| 日韩黄片视频试看| 1769一区| 日韩欧美成人性爱在线| 九九九网页| 亚洲色人阁| 亚洲最大网站av| 懂色AV中文| 一级毛片电影免费看| av在线资源| 日韩综合色网| 九九无码视频| 97碰碰色| 亚洲美乱| 久久久精品中文字幕爱豆| 九色 人妻 大香蕉| 人人摸人人入| 久久97资源 网| 国产午夜福利电影免费在线观看| 国产夜夜操| 台湾一区国产高清在线| 欧美亚洲美少妇一区二区| 午夜超爽| 精品人妻一区二区三区蜜桃视频| 成人性爱电影一区二区| 熟妇色99| 天天综合网1| 日本性爱网址| 激情小说亚洲色图| 欧美91在线+|+欧美| 日韩欧美aⅴ综合网站发布| 二级毛片| 精品久久久久黄少妇| 久久精品国产亚洲妲己影视| 91成人亚洲色图| 无码99| 凹凸久久人人| 国产午夜在线观看| 国产中文字幕在线观看| 欧美熟妇乱码在线一区| 嫩草影院性色| 91中出| 久久久少妇诱惑精品视频| 色色热| 亚洲精品人妻在线| 亚洲综合色婷婷| 夫妻日逼| 欧美综合传媒| 欧美亚洲一区二区久久久婷精品大包诱| 成人一级性爱| 大香蕉78| 亚洲色交| 操一对老熟妇爽上天视频| 99re不伦| 久久久一区二区三区四曲免费听| 国产日韩在线播放av| 亚洲色宗合| 国产久久久久影院老熟女| 国产av白丝| 婷婷伊人綜合中文字幕小说| 亚洲成熟国产精品美女| 欧美另类精品xxxx| 人妻81p| 亚洲 小说 欧美 激情 另类| 亚洲情欲| 国产自制av蜜乳| 91爱啪| 欧美激情 亚洲色图| 久久久久亚洲AV无码专区少妇| 色综合天天| 强奸抽插av| 亚洲欧美综合| 欧美人人曰人人操人人射射| 我要去看2个日本美女.com曹逼| 青青草大香蕉视频| 91美女片在线| 久久97| 91亚州| 国产成人亚洲精品无| 极品另类| 久久黄色性爱视频| 国产精品亚洲四五区在线观看| 夜夜爽爽爽| 人妻久久久| 久久久久久久久久久97| 美腿丝袜高跟网免费视频免费视频| 2019AV天堂| 五月开心久久AV官网| 伊人在线大香蕉视频久久| 亚洲人妻色图| 13小男生GAY自慰脱裤子| 99这里只有精品国产| 国产东北女人在线视频| 超碰人人妻| 免费日韩黄片| 97草草| 天天射天天操天天干天天吃2018| www超碰| 日韩精品99999| 9999伦理视频| 青青草这里只有精品| 人妻精品视频一区二区三区| 黄色免费网页无码| 嗯阿好爽好紧| 欧美翘臀视频网站一区二区三区| 国产精品久久久久久久AV大片 | 在线视频 亚洲精品| 免费精品人妻一区二区三| 啊啊啊操一区| 亚洲图片视频小说| 一级黄色性爱A级片| 91超碰人人| 97网站在线观看 | 成 人 影视 一区 二区 三区 四区 | 91亚洲色人| 东北夫妻性偷拍| 免费精品AB| 亚洲中文一区二区三区| 成人热久久精品| 91久久久亚洲| 麻豆性爱视频在线播放| 免费成人在线观看91| 日本精品一区三区| 九九九九精品| 欧洲中文字幕| 国产日韩区| 97精品97| 久久精品国产亚洲AV无码电影| 久久一二三四不卡 | 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 国产成人精品一区| 中文字幕一区二区三区人妻不卡| 又黄又爽在线观看视频| 亚洲成a人在线观看久| 夜色97| 日韩三级一区| 九九久久一区二区伦理| 男人的天堂com| 欧洲中文字幕| 色五月首页| 黄片在线免费在线观看| 超碰诱惑| 2020久久免费视频| 欧美日韩性爱无码| 精品久久久久,69国产成人精| 国产午夜视频| 91黑丝在线| 天天看,天天做| 中文字幕88av在线| 丝袜AV一区二区三区| 另类图片欧美激情综合| 美女淫穴| 超碰免费97| 熟女人妻精品一区二区视频| 国产成人无码啪| 日韩免费性爱视频在线观看| 欧美日韩精品一区二区三区高清| 国产亚洲色婷婷久久99精品91 - 百度| 97久久精品不卡| 日韩影片中文字幕一区二区三区| 26uuu国产| 五月婷婷久久综合| 色综合久久88色综合久久天天| 12一15性XXXX粉嫩国产| 天天做天天爱| 97chaopengongkai| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 久草加勒比一区在线| 激情 欧美 亚洲 小说| 蜜臀在线网站| 中文字幕一区二区三四五区日日骚| 欧美最婬乱婬爆婬性视频 | 99热最新| 五月婷婷色| 99热综合| 肥臀熟女福利视频一区二区| 九九九久千久久激情蜜桃在线看 | 一区二区三区四区五区高清无码永久视频 | 亚洲AV乱码专区国产噜噜亚洲 | 国产白丝网站| 精品九九九九| 噜噜噜在线视频| 亚洲精品第一| 日本狠狠干| 综合欧美色图| 男人天堂资源| av在线观看不卡网站| 亚洲图片日本AⅤ欧美在线| 在线无码网站| 欧美一级色| 欧美综合第一| 欧美丰满少妇交换91欧美精品| 大但人体久久久久| 欧美劲爆第一页| 久久久九九九| 超碰99re| 久久久久久久国产a∨| 激情久久久| 亚 欧 美 综合| 精品一区二区三区四区外站| 久久久性爱| 少妇一区二区三区精选| 欧美1727免费观看视频| 校园春色宗合网| 懂色AV一区二区三区| 品亲网欧美品亲网| 精品人妻一区二区三区免费视频| 天天做日日做天天欢。| 亚洲国产97在线精品一区| 极品销魂美女一区二区| 可乐操亚洲蜜911| 亚欧高清在线| A级在线视频| 干美女人妻| 91色图片| av情色影音| 国产不卡精品91| 久久激情综合| 日本一区二区不卡精品| 欧美色偷偷| 久草看看看| 九九精品热| 亚洲一区二区性爱电影| 任我爽视频在线观看| 加勒比久久av| 可以在线观看AV的网站| 97超碰亚洲| 欧美亚洲91| 98一区二区精品| 久艹日日日| 中文字幕在线观看丝袜| 国产精品夜夜| 精彩久久中文| 性做久久久久久免费观看软件| 97 超碰 人人做 人人爱| 欧美精品三区| 成人无码专区精品视频| 国产精品久久久久久久AV大片| 欧美亚洲91| 97av在线观看| 情趣丝袜无码操逼视频| 亚洲一区二区三区AV无码 | 色哟哟1区2区| 淫荡熟女乱伦网| 中文幕97| 国产黄色 A 片免费看| 亚洲和欧美裸体美女双飞视频| 国产精品懂色tv影视免费观看| 伊人天堂在线| 国产精品久久久久久亚洲色欲| 厕所偷拍在线| 88xx成人精品视频| 成人无码在线超碰网| 天天色悠悠激情| 精品久久久av无码免费| 亚洲永久永久永久永久一级一级一级精品 | 99久久久久| 欧美性暴力猛交| 亚洲丝袜色| 精品无码欧美三级| 亚洲性图91| 欧美黄色大香蕉一区二区| 9美女超碰在线免费观看| 天天日夜夜| 亚洲人妻中文在线视频| 欧亚日韩综合精品国产| 99色在线| 日本无码1| 欧亚 另类 久| 大香蕉99热| 特级毛片特黄久久免费看| 91视频综合在线| 人妻丰满熟妇av无码区蜜桃| 亚洲日韩精品在线播放| 日韩操逼性鲍| 78精品| 久草毛片电影怡| www.色婷婷色综合| 亚洲欧洲综合av在线| 亚洲色图欧美色18直播在线| 日本999精品| 久久精品午夜国产亚洲AV无码| 亚洲一本色码中文字幕| 五月婷婷深深爱| 97天天操| 超碰97导航| 一区 欧美 日韩 麻豆| www久| 国产免a费看黄片在线| 99热这里都是精品| 97在线资源| 区一二区日韩亚洲乱码av电影| 首页中文字幕中文字幕免费| 在线播放一级无码视频| 日韩强奸av| 91岛国动作片| 九九热av| 91岛国动作片| 美女网站91| 猛猛干| 亚洲色电影在线| 日日摸日日弄日日拍| 91网站18+| 欧美亚州色的图| 蜜桃臀一区二区aV| 91视频综合在线| 欧美伦乱爱| 亚洲涩涩| 精品女同一区| 国产精品另类| 国产精品操| CCYY草草影院地址入口| 青青草国产盗摄一二三区| 亚洲色图久久精品蜜| 一道本久久棕合爱| 求求你操操我| 91精品婷婷国产综合久久| 亚洲区小说| 亚洲一区二区AV| 日本成熟少妇A∨网站| 欧美αv.com| 免费观看啪视频| 日夜啪电影| 嗯嗯,好大,好爽,好骚| 另类专区加勒比| 中文字幕后石码四区五区| 国产精品麻豆成人av| 美国aaaaa一级黄片| 五月激情视频| 国产熟女精品区| 日韩欧美传媒一区国产| 久久久久久一日韩字幕无码| 亚洲一本大道中文字幕无码在线| 日韩乱码Av| 黄色十八禁| 亚洲av成人精品一区| 国语av最新自产拍在线观看| 97国产精品国| 少妇天堂| 亚洲女毛多水多21P| 超碰精品| 20cm女自慰在线日韩欧美| 四虎影院成年人片| 肉丝中文无码高清| 国产精品一级毛片不卡视| 一区二区三区精品黑丝白丝酒店对鸡 | 日韩射图| 一级黄色性爱A级片| 久久性爱大全| 天天操天天干一区二区| 天天香香欲综合| 久久久精品网| 激情婷婷丁香| 黄页| 五月天社区| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 北京专精特新企业招聘信息| 久久东京热久久| 色播五月丁香| 久久78| www鬼畜国产男人的天堂| 亚洲熟女av中文字幕| 思思热在线观看| 欧美黑人与女人91| 天美麻豆精品视频99| 久久久精品网| 日本一二三高清| 自拍偷拍亚洲熟女妇人精品| 日日骚精品视频| 精品人人插人人操| 91东北熟女| 超碰色中文| 日韩精品资源专区二区| 中文字幕人乱码中文字的预防方法 | 久久精品国产亚洲AV高清演员表| 男人的亚洲天堂| 99ri视频| 99久久久久久亚洲精品不卡| 97视频在线视频| 九九综合| 色乱二区| 性色AV网站| 天天综合网合集91| 91逼逼女人91| 欧美高清在线| 5252色欧美在线| 在线精品福利免费播放| 九九九久久久| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 日韩欧美亚洲国产日韩| 中文字幕狠狠玩| 亚洲 欧美 日韩 国产一区二区 | 大香蕉免费3| 加勒比色99999| 加勒比海成人视频网| 丁香五月天视频| 国产亚洲美日韩Aⅴ中文字幕无码成人| 0755午夜福利视频| 热热色国产一二区AV| 青青草伊人久久| 一区二区三区精品黑丝白丝酒店对鸡| 国产绿奴视频在线观看| 日韩福利综合一区| 91内射| 91无遮挡| 97香蕉网| 啊啊啊啊啊啊在线观看| 国产日韩怡红院| 国产在线激情| 亚洲资源一区| 嗯嗯不要视频| 97色在线视频| 国产深喉视频一区二区| 91色花堂| 欧美真人抽搐一进一出gif| V A在线| A级在线视频| 影音先锋日本乱伦| 十八禁av无码免费网站APP| 宅男影院久久久,99| 综合激情二| 日韩无码黄色片| 免费黄色片。| 亚洲日韩美国人妻| 亚洲综合九九| 人妻一区二区三区| 另类 综合 日韩 欧美 亚洲| 欧美 牲| 五月天精品| 91九九| 九九热精品视频在线观看| 亚洲精品美女久久久久久久久| 婷婷五月天成人网| 丰满少妇一区二区三区四区观看 | 欧美,日韩,中文,另类| 啊啊啊啊好爽好舒服一区二区易域| 综合色好色| 欧美成人四级在线播放| 色优久久| 夜夜 中文视频rt| 免费视频观看60秒| 翔田千里爆乳巨臀无码| 强免费黄色网址| 欧美精品成人亚洲| 91美女国产在线| 亚洲色欧美| 中文自拍欧美影视| 亚洲中文电影| 欧美色网| 九九久久综合| 欧美日韩人妻婷婷一区| 9999久久久| 亚州操逼网| 日本丝袜美腿人妻九九| 久久久久成人网| 国产乱码精品一区二区三区四川| 桃色五月天| 亚州大图综合色图| 黄色AAAAA欧美| 日产中文字幕2020| 日本久久女同性恋视频| 情侣开房子拍 日韩无码 女的很漂亮| 久草老司机| 69av一区二区三区| 5252色欧美在线| 91天天看| 日韩精品高清资源在线| 囯产精品久久久久久久久久二区三区| 久9热| 天天影视综合色| 93人人操人人| 嗯嗯,好大,好爽,好骚| 亚洲AV成人精品网站在AV| 五月婷婷综合在线| 丝袜美腿av女优在线| 欧美日韩丝袜 | 风骚少妇视频中文字幕| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 这里都是精品在线观看| 欧亚三区动漫| 国产精品视频电影| 国产精品人妻熟女aⅴ| 久久九操在线观看| 亚洲成人综合在线| 久久夜夜| 欧美极品色| 欧美精品四区| 变态乱伦伪娘灌肠一区二区| 超碰久草| 内射中出日韩在线观看视频| 精品国产人成在线| 亚洲欧美色图片| 91久久久视| 欧美综合色图片| AV天天综合| 亚州色国| 少妇人妻精品| 啊啊啊啊啊在线视频| 看免费一级在线播放毛片| 台湾一区国产高清在线| 国产操偷| 久久这里精品国产99丫e6| 九热超碰| 91被操| 色狠狠色| 亚洲成人免费电影| 亚洲综合嫩| 成人七区| 天堂伊人久久| 黄色片一区二区三区四区五区| 日本久操视频| 日本熟女中文字幕一区| 色图四区| 97日视频| 激情第四色| 国产精品久久久久无码A√| 四虎免费在线播放| 久久超碰亚洲人| 深夜激情无码| 亚洲春色欧美激情自拍| 国产精品第一页国产大屁股视频免费区i| 老熟女综合网| 91色鬼| 亚洲一区二区中文字幕| 久久精品国产亚洲AV清纯| 欧美黑人精品在线播放| 97在线资源| 大色综合网| www.久久99| 综合久久中文字幕综合日韩精品| 久久毛卡| 一区二区三区激情在线观看| 久久同城AV| 色香欲综合| 超碰在线综合97| 不卡人妻少妇精品毛片一区23区视频| 四虎884a| 凌辱美少妇久久aV| 久久黄色性爱视频| 97国产超湿| 国产中午字一暮区| 国产精品无码成人精品| 欧苏综合色综合| 人妻黑丝袜电影| 97久久精品亚洲中六字幕| 东京男人天堂| 九九黄色视频在线观看| www久久精品| 久久久久久免费电影| 嗯嗯嗯啊啊在线观看| 国产9l 大屁股| 欧美欧美啪啪视频| 在线一道啪| 久久思思热| 少妇天堂网络| 啊嗯嗯啊好大好爽| 欧美天天综合网| 国产又猛又粗又爽又黄| 亚洲欧美日韩精品久久久一区二区| 久久精品色欧美aⅴ一区二区| 婷婷五月天激情网| 国产天天看| 嗯嗯不要 视频| 国产精品久久久无码aV去| 手机在线中文字幕国产| 色婷婷亚洲婷婷| 二三四区精品| 91天天综合日韩欧美| 国产精品成人无码a v毛片| 五月综合视频| 伊人色综合欧美| 岛国免费视频在线| www.色综合| 99999这里都精品| 欧美v亚洲v综合v国产v妖精| 志村玲子视频一区二区| 亚州九九九精品视频| 欧美第一页| 欧美视频在线第3页| 肉丝中文无码高清| 天天摸夜夜添无码小视频| 91狠| 日日摸天天爽夜夜欢| 日韩视频啪啪| 色九九九综合| 欧美aa一级片| 亚州综合AⅤ| 国产成年女人免费视频播放a| 91亚洲黑人| 啪啪视频免费在线观看| 丁香五月天啪啪| JuliaAnn丝袜熟女系列| 色婷婷综合视频| 久9九综合在线| 中文字幕日韩综合| 91AV入口| 综合av影片| 五月丁香综合啪啪| 日韩天天综合| 欧美99| 火箭成精品视频884必出精品| 日本精品一区二区中文字幕| 久久在肏| 9久久9综合| 婷婷久久五月综合激情| 亚洲无套久久嗯嗯| 中国农村熟妇毛片视频| 大香网伊人久久综合网eew| 黄色片一区二区三区四区五区| 97超碰在线资源网站| 日本视频一区二区三区| 久射吧| 久操B网| 青娱乐国产精品| 不卡在线观看视频| 大香蕉综合久久| 亚州,欧美在线| 伊人丝袜美腿高跟在线观看高清| 日本三级A片网站com| 色爱三区| 屁股久久久久久久| 最新国产精品| 中文字幕亚洲欧美在线不卡| AV网站高清无码在线观看| 欧美97在线欧| 熟女露脸激情自拍视频| 国产人伦精品一区二区三区| 欧亚在线视频| 国产传媒操逼视频| 在线视频97| 97射欧美| 91路www| 少妇与黑人高潮在线| 99热这里只有精品99| 国产欧美岛国精品一区| 男女日B国产| 午夜超碰| 人妻夜夜爽天天爽三区麻豆AV网站| 老熟妇一区二区三区| 91夜夜蜜桃臀1区2区3区| 9/A片 | 91少妇人妻| 天天干18禁| 中出91视频| 亚洲图片视频小说| 青青草在线视频播放器| 蜜臀一二三区| 60秒免费小视频| 国产精品网站www| 久久色一区二区| 91撸色网 玖玖网 欧美| 中文字幕乱碼在线| 欧美成人综合| 任你干在线视频| 2020中文字幕在线| 亚洲图片欧美偷拍| 日韩有码专区| 三男一女不戴套的A片| 国产无马在线| 家庭乱伦网站国产| 亚洲欧美经典一区二区| 免费黄色视频网址| 不卡超碰护士AV在线免费播放| 欧美午夜精品久久久久久超碰| 日韩精品一区二区三区四虎影视| 97超碰69| 97超碰总站| 亚洲男人在线观看天堂| 亚洲国产丝袜熟女av| 国产成人精品必看| 综合色99| 97 国产一区| 青青草原香蕉日本Ap| 草草草视频在线免费看| 亚洲第一精品在线视频| 噜噜吧,噜噜色,噜噜| 色婷婷综合久久久久中文一区二区| 日夜干射色啊| 亚洲色天| 日韩女模中文造逼| 少妇69中文| 日日夜夜免费| 玖玖爱免费观看视频| 欧美日韩222| 久久系列| 久久久97| 怡红院亚洲怡春院av| 亚洲国产精品无码AV久久久| 欧美一区二区观看在线| 97久久精品亚洲中六字幕| 欧美日韩久久精品爱爱| 留下AⅤ黄色片| 粉嫩AV输入| 久久亚洲欧美中文字幕国语| 欧美香蕉视xxx| 色牛aV| 歐美性天天| 最近二区三区视频大全| 中文字幕蜜乳av| 九热超碰| 国产97亚洲| 国产尹人在线视频免费| 日韩亚洲97| 岛国片国产成人亚洲播放| 二对二中文字幕。| 26uuu性物| 男人精品天堂一区| JULIA一区二区三区在线播放| 中文字幕乱偷人妻久久艾草网| 色五天伊人| 粘花网06av视频| 大香蕉一人| www99热| 亚洲一区二区三区婷婷| 色老汉色| 国产精品一级毛片不卡视| 久久久精品,3| 亚洲免费精品一区| 无码免费在线观看黄色片| 亚洲色图欧美另类在线| 免费综合亚洲中文| 国产传媒日韩| 97视频www| 少妇超碰在线| 性色生活片久久毛片婬片免费放女人一级毛片 | 91黄射| 国产视频一区二区在线观看| 四虎影视永久在线免费| 欧美自拍网| 性爱AV天堂| 91人妻超碰| 俺去俺来也在线www| 欧美黑人168页欧美黑人167| 日韩熟妇二区| 日本国产高清色www视频在线| 人爽不卡视频| 激情人妻另类| 精品久久久中文字幕不| 国产91久久九九免费精品无码| 26uuu最新| 999久久芭蕾| 久啪| 91亚州欧美| 成人区人妻精品一| 97视频免费播放| julia在线观看久久| 啊视频在线| 国产美女mm131爽爽爽爽| AV天堂国产| 久久久中文| 中文字幕青青草| 一区e区三| 亚洲男人天堂2| 国产精品视频在线播放 | 留下AⅤ黄色片| 91快色色色色色| 黄片视频,下载| 美国一区二区三区视频| 99久国产精品午夜性色福利| 激情小说亚洲| 亚洲国产成人精品女人久久久| 日本久久超碰| 午夜小电影在线插入淫高潮| 人妻天堂网| 久久久9999| 中文字幕一区二区三区高清| 美女熟妇色| 日韩激情小说一区二区| 高清成年美女黄网站免费大全 | 青草精品视频一日本久久久久网站| 加勒比东京热五月天天堂网| 无码九九九九| 亚洲一区中文字幕| 一区二区三区国产在线播放| www久久国产精品| 视频在线观看免费一区二区三区| 国产一区二区三区导航| 伊人婷婷五月天| 日韩紧密久久| 亚洲精品不卡一二三区| 偷偷人人精品女女久久| 欧美精品69性爱| 97 九色| 亚洲精品九九九| 97青娱乐超碰久久| 超碰av在线| 国产亚洲精品美女久久久久久2021| 午夜啪| 风月影院十八禁| 亚洲成人性爱网站在线播放| 久久亚洲av成人无码国产| 按摩中文字幕| 欧美激情 亚洲色图| 无码免费在线观看黄色片| 成人AV在线电影| 丰满人妻一区| AV一起草在线| 天天欧美色| 4tube欧美女厕所| 黄片免费久久久久久久| 日本三级小说中文字幕| 狠日欧美| 超碰人人在线| 蜜桃臀av一区二区| 国产 v乱码一区二| 亚洲日韩乱码中文无码蜜桃臀网站 | 女人被添高潮免费视频| 中文字幕文字幕无码一区二区三区电影99 | 国产偷仑| 午夜国产综合视频在线观看| www.97在线| 国产综合色精品在线观看| 亚洲少妇色| 妇女一区二区三区| 天天爽天天爽| 精品天堂| 国产精品女同| 肏逼视频日本| 99热亚洲天堂| 丁香婷婷五月| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 欧美性五月| 强奸乱亚洲| 啪啪综合网| 插老姨肥穴| 日韩性爱人人爱人人操| 性爱视频免费网址| 精品一区二区三区最新| 成年人网站在线免费观看| 精品国产一区二区三区久久久蜜臀| 免费少妇一区二区| 大香蕉青青9| 色99视频| 国产精品露脸在线观看| 91少妇香蕉久久精品| 国产久久久久久久久一区二区| 91欧美经典| 福利一级版子| 色色五月婷婷| 成人八戒网站| 久久亚洲影院一区二区| 操www| 风间由美日韩欧美久久| 色婷婷aV一区二区三区麻豆综合| 亚欧视频在线| 综合另类| 玖玖资源视频一区二区三区| 91 丝袜在线| 亚洲天堂 视频你懂的| 国产精品久久久吖| 日韩BBN| 久久久久大香青草精品综合| 先锋精品av色鲁| 九月丁香综合网| 无码人妻一区二区三区色欲aⅴ| 色色青青久久| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 日韩一卡二卡三卡| 亚洲熟女一区| 久久久熟妇熟女国产| 色99在线| 激情六月婷婷| 色婷婷影视| 2024人人操人人摸| 国产视频不卡在线观看| 色噜噜精品一区二区三| 很很操在线| 国产高清亚洲日韩一区| 日韩97在线| 超碰97久久| 久久午夜色播影院免费高清| 一区二区三区麻豆| 亚洲 欧美综合| 青青草福利视频| 激情综合网激情综合| 立川理惠无码一区二区| 熟女精品va中文字幕| 欧美第一页性| 日本孕妇一区二区视频操逼免费看 | 亚欧视频在线| 免费的很黄很污的全部视频| 亚洲国产欧美另类自拍| 国产亚洲女v在线观看| 国产熟女免费观看久久| 亚洲天堂99| 精品久久99| 欧美青青视频| 青青五月天| 中日韩免费看男女操逼大全| 国产成人在线观看网址| 一起草日韩| 亚洲色久| 日日夜夜国产综合| 亚洲素人综合| 17c嫩草51久久91嫩草| 中文日本免费高清| 久久99综合| 综合天天网| 久热影视| 99热99色| 婷婷15月天青娱乐| 丰满人妻一区二区三区蜜桃视频| 亚洲影院无码在线| 色五月婷婷色| www.男人天堂| 91丝袜在线观看| aaa一级黄片| 好屌色综合| 麻豆天美传媒毛片| 国产第25页在线观看| 欧美在线色图| 国产精品一区二区三| 中文字幕视频二区| 日本免费人成视频播放120秒| 人妻少妇色综合| 啊啊啊不要嗯嗯在线观看| 日本高清免费一本视频在线观看| 大香蕉丝袜一级片| 久久熟女嫩草成人片免费 | 偷拍片久久| 国产精品99精品视频网站| 看日韩美女二区三区免费操逼视频 | 男人天堂日日夜夜| 天天92av| 人人天天欧洲| 巨乳特殊服务按摩| 五月色网| 综合亚洲网| 午夜免费视频1000| 亚洲美女精品九九视频| 国产精品久久久久久久久AV大片| 加勒比伊人综合| 免费一级特黄特色大片在线观看看| 亚洲中文人妻色| 青娱乐二区免费| 色情亚洲日本成人| 午夜一区二区三区国产| 日韩精品大香蕉伊人在线| 老司机射| 9久久久久久| 欧美日日网| 秋霞成人一级在线观看| 色亚州人久干视频在线观看免费版| 亚洲天堂7777| 亚洲欧美在线丝袜| 少妇一区二区三区在线观看| 国产精品久久久无码aV去| 91碰碰| 大香蕉伊人网WWWn0n| 午夜120视频在线观看| 欧姜老司机| 国产成人主播| 婷婷六月天| 天堂中文日本在线观看| 91人妻少妇| 久久精品男人的天堂| 精品视频123区小说区| 亚洲最新av无码成人精品区| 黄页网站成人免费| 绑缚麻绳人妻寝取完整版| 国产成人无码久久精品| 日韩欧美亚欧在线视频| 殴美色网| 久热99999| 亚洲精品天天影视综合网 | 懂色av一区二区三区天美传媒| 亚洲综合情色| 嗯嗯嗯,草死我| 国产精品老熟女一区二区| 国产浮力影院第1页| 在线人成亚洲视频免费观看| 96超碰网| 东京热大香焦| 加勒比五月天| 久久久久ab| 黑丝少妇麻豆| 后入美女国产| 婷婷丁香六月天| 五月激情综合网| 国产免费一区二区在线A片视频| 国产熟女乱论| 成人5码视频| 岛国大片在线观看网站入口| 一起草欧美| 91社区拍啪人妻| 亚洲国产精品9999在线观看| 中文字幕av亚洲精品| 天天射天天操天天干天天吃2018| 试看60秒 爽| 亚洲一卡二卡在线免费| 亚洲乱熟女一区二区三区大香蕉| 很黄很色的视频在线观看| 色色色色日本| 黑人精品成人一区二区三区| 五月天激情综合网| 亚洲 中文 女同| 91久久国产综合精品| 偷拍新久久| 久操免费在线| 性暴力欧美猛交在线直播| 国语国产操逼伊人AV网| 国产亚洲在线| 99抽插| 骚妻少妇精品性色无码四色A V| 丰满人妻一区二区三区免费|