亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

編譯原理詞法分析:帶Tkinter界面的狀態(tài)機(jī)實(shí)現(xiàn)與避坑指南

編譯原理詞法分析:帶Tkinter界面的狀態(tài)機(jī)實(shí)現(xiàn)與避坑指南 簡介一份面向編譯原理學(xué)習(xí)者的詞法分析器Java源文件包包含完整可運(yùn)行代碼與注釋并基于SWING實(shí)現(xiàn)了可視化界面可在MyEclipse中直接導(dǎo)入運(yùn)行。資源共5個java文件壓縮包僅5KB涵蓋詞法規(guī)則定義、輸入讀取、分詞邏輯和錯誤處理等核心模塊便于逐文件對照學(xué)習(xí)。已有525人學(xué)習(xí)下載。通過研讀和運(yùn)行該項(xiàng)目讀者既能掌握詞法分析從正則規(guī)則到有限狀態(tài)自動機(jī)的具體實(shí)現(xiàn)思路也能了解如何用Java和SWING構(gòu)建簡單編譯器前端工具對于課程設(shè)計(jì)、期末復(fù)習(xí)以及編譯器入門實(shí)踐均具有直接參考價值。1. 詞法分析帶界面源文件這道編譯原理實(shí)驗(yàn)真正卡人的不是狀態(tài)機(jī)是你拿到的“完整可運(yùn)行”能不能在自己電腦上睜開眼做編譯原理實(shí)驗(yàn)的同學(xué)最崩潰的一刻往往不是寫識別程序而是下載了一份聲稱“完整運(yùn)行含注釋”的詞法分析源碼雙擊之后要么黑框一閃要么控制臺里的中文注釋全部變成亂碼要么壓根沒界面。詞法分析本身是編譯前端的第一道關(guān)卡它把源代碼字符流切成Token流聽起來不難但加上界面、加上注釋、加上“能跑”就成了三件事。這篇文章就按“一份帶界面的詞法分析源文件該怎么組織、怎么跑通、怎么調(diào)、坑在哪”的順序展開目標(biāo)是讓你拿到任意一份這類工程能在半小時內(nèi)自己復(fù)現(xiàn)并改成自己的實(shí)驗(yàn)報告。2. 先把理論立住DFA狀態(tài)機(jī)、界面層與“完整可運(yùn)行”的真實(shí)含義2.1 詞法分析的實(shí)質(zhì)是狀態(tài)機(jī)不是正則表達(dá)式比賽詞法分析器要回答的問題只有一個給定一個字符流從哪里開始、到哪里結(jié)束算一個單詞這個單詞屬于標(biāo)識符、常數(shù)、運(yùn)算符還是界符標(biāo)準(zhǔn)教材會告訴你用正則表達(dá)式描述單詞然后轉(zhuǎn)為NFA、再確定化為DFA。但落到工程代碼里絕大多數(shù)課堂項(xiàng)目不會真的去實(shí)現(xiàn)子集構(gòu)造算法而是直接用DFA的等價物——手寫狀態(tài)轉(zhuǎn)移函數(shù)或查表。我一般會先讓讀者區(qū)分三個層次。最底層是字符分類你要把輸入字符分成字母、數(shù)字、空白、運(yùn)算符、界符中間層是狀態(tài)轉(zhuǎn)移當(dāng)前狀態(tài)加當(dāng)前字符決定下一個狀態(tài)最上層才是Token封裝把命中的子串連同類型、行號、列號打包。很多同學(xué)從網(wǎng)上找的源碼一上來就寫一堆if判斷那也能跑但狀態(tài)一多就變成黑匣子調(diào)一個錯誤半天找不到位置。真正適合課程實(shí)驗(yàn)的寫法是表格驅(qū)動。把狀態(tài)轉(zhuǎn)移規(guī)則放進(jìn)一個二維數(shù)組行是狀態(tài)列是字符類別值是下一狀態(tài)。這樣詞法規(guī)則要擴(kuò)展時只需要改表格不用動控制流。下面第3章給的代碼就是這個思路的簡化版——沒有做完整的NFA轉(zhuǎn)DFA但對“標(biāo)識符/數(shù)字/運(yùn)算符/界符/注釋/錯誤字符”這類課程級需求完全夠用而且每個分支都有注釋老師一看就知道你沒抄。2.2 界面層不是裝飾它承擔(dān)了調(diào)試窗口、結(jié)果核對和報告素材三件事有人會問詞法分析不是命令行輸出Token表就行了嗎為什么非要界面答案是命令行輸出是單向的你沒法在出錯時回看掃描位置界面能把輸入?yún)^(qū)和Token表并排放在一起鼠標(biāo)點(diǎn)一行Token輸入?yún)^(qū)同步高亮到對應(yīng)代碼行查錯效率完全不同。同時絕大多數(shù)編譯原理實(shí)驗(yàn)要求提交“運(yùn)行截圖”沒有界面的話一張黑底白字的終端截圖在報告里非常單薄。界面提供的結(jié)果表格序號、行號、類型、值可以直接裁剪進(jìn)報告也讓答辯老師一眼看出程序確實(shí)在“分析”而不是硬編碼。一個容易走偏的點(diǎn)是界面不等于美化。有人花大量時間調(diào)字體、配顏色卻忽略了界面邏輯——錯誤定位、單步掃描、Token分類過濾這些功能才是界面層該有的價值。下面實(shí)現(xiàn)的界面用Tkinter做原因是它是Python自帶的圖形化界面開發(fā)工具不需要額外裝包運(yùn)行環(huán)境干凈跨Windows和Linux都不會因?yàn)槿睅於嚒?.3 選型對比Tkinter、Java Swing、C# WinForms和Qt怎么選很多流傳的“編譯原理詞法分析含界面源文件”是Java或C#寫的。Java Swing項(xiàng)目通常要配JDK版本老項(xiàng)目還容易踩高版本模塊化限制C# WinForms只能在Windows跑而且不少老代碼是.NET Framework新機(jī)器上要先裝對應(yīng)運(yùn)行時。WinForm界面美化倒是成熟但對編譯原理實(shí)驗(yàn)來說美化不是重點(diǎn)能穩(wěn)定運(yùn)行才是。我的建議是如果你只是想快速跑通并看清詞法分析過程優(yōu)先選Python Tkinter如果課程要求必須用Java再選Java Swing如果要求C那Qt是唯一比較省心的選擇但環(huán)境配置成本最高。對比下來各方案的差異可以用下面這張表說清楚。方案開發(fā)速度跨平臺環(huán)境依賴課程答辯友好度常見坑Python Tkinter最快好僅Python標(biāo)準(zhǔn)庫高中文編碼、Tk縮放Java Swing中等好需JDK版本要匹配中JDK模塊化限制C# WinForms中等僅Windows需.NET運(yùn)行時中老項(xiàng)目框架版本不一致C Qt慢好裝Qt庫體積大中信號槽編譯報錯難查另外提醒一句網(wǎng)上不少標(biāo)題帶“界面”的資源實(shí)際只是個極簡輸入框加一個“分析”按鈕沒有Token表格、沒有錯誤行跳轉(zhuǎn)。拿這種源碼交實(shí)驗(yàn)老師一眼就看得出來。要復(fù)現(xiàn)就復(fù)現(xiàn)一個能講清楚“掃描過程”的工程而不是只有樣子的殼。3. 從零搭一份可運(yùn)行工程文件結(jié)構(gòu)、核心狀態(tài)機(jī)與界面代碼3.1 工程文件結(jié)構(gòu)四個文件各干一件事我習(xí)慣把詞法分析界面工程拆成四個文件入口文件、詞法核心、規(guī)則常量、示例輸入。這樣做的直接好處是詞法規(guī)則改了不需要碰界面代碼界面調(diào)整了也不需要動狀態(tài)機(jī)。下面是文件組織方式你照著建目錄即可。token_ui/ ├── main.py # Tkinter 界面負(fù)責(zé)采集輸入和展示結(jié)果 ├── lexer_core.py # Token定義 狀態(tài)機(jī)掃描器 ├── rules.py # 關(guān)鍵字集合、運(yùn)算符集合、界符集合 └── sample.txt # 一份用于測試的迷你源代碼main.py里不要寫任何詞法判斷邏輯它只做四件事讀輸入、調(diào)用Lexer、把Token列表填進(jìn)表格、把錯誤信息顯示在狀態(tài)欄。lexer_core.py只接收字符串吐出Token列表和錯誤列表。rules.py純粹是常量表方便你改成C語言風(fēng)格或者Java風(fēng)格的關(guān)鍵字。這種分層還有一個現(xiàn)實(shí)原因課程實(shí)驗(yàn)經(jīng)常要求同時交“核心代碼”和“界面代碼”分開后你可以直接說明邊界答辯時也不會被問得手忙腳亂。3.2 核心狀態(tài)機(jī)代碼一個能直接跑的Token識別類下面這份lexer_core.py是完整可運(yùn)行的核心代碼量不大但覆蓋了標(biāo)識符、整數(shù)、小數(shù)、運(yùn)算符、界符、行注釋、塊注釋和錯誤字符八類情況。關(guān)鍵位置都寫了中文注釋方便你改成自己的規(guī)則。# lexer_core.py KEYWORDS {if, else, while, for, int, float, return, void, main, break, continue} MULTI_OPS {, !, , , , ||, , --, , -, *} SINGLE_OPS -*/!|%(){}[],;: class Token: Token對象類型、值、行列號、序號缺一不可 def __init__(self, type_, value, line, col, tno): self.type type_ # 類別標(biāo)識符/關(guān)鍵字/常數(shù)/運(yùn)算符/界符/錯誤 self.value value # 實(shí)際字符串 self.line line # 起始行 self.col col # 起始列 self.tno tno # 第幾個Token def __repr__(self): return fToken({self.type}, {self.value!r}, 行{self.line}:{self.col}) class Lexer: def __init__(self, text, max_id_len32): self.text text self.pos 0 self.length len(text) self.line 1 self.col 1 self.max_id_len max_id_len self.tokens [] self.errors [] def peek(self, offset): 向前看一個字符不移動指針 idx self.pos offset if idx self.length: return self.text[idx] return def is_letter(self, ch): return ch.isalpha() or ch _ def is_digit(self, ch): return 0 ch 9 def add_token(self, type_, value, is_errorFalse): tk Token(type_, value, self.line, self.col, len(self.tokens) 1) self.tokens.append(tk) if is_error: self.errors.append(tk) def skip_line_comment(self): while self.pos self.length and self.text[self.pos] ! \n: self.pos 1 self.col 1 def skip_block_comment(self): # 遇到 /* 時進(jìn)入直到找到 */沒找到則報告錯誤 start_line, start_col self.line, self.col self.pos 2 self.col 2 while self.pos self.length: if self.text[self.pos] * and self.peek(1) /: self.pos 2 self.col 2 return if self.text[self.pos] \n: self.line 1 self.col 1 else: self.col 1 self.pos 1 self.add_token(錯誤, 未閉合塊注釋, start_line, start_col, True) def run(self): 開始掃描一邊移動指針一邊生成Token while self.pos self.length: ch self.text[self.pos] if ch in \t\r: self.pos 1 self.col 1 continue if ch \n: self.line 1 self.col 1 self.pos 1 continue if ch / and self.peek(1) /: self.skip_line_comment() continue if ch / and self.peek(1) *: self.skip_block_comment() continue if self.is_letter(ch): self.read_word() continue if self.is_digit(ch): self.read_number() continue # 到這里說明是運(yùn)算符/界符先嘗試匹配雙字符運(yùn)算符 two self.text[self.pos:self.pos 2] if two in MULTI_OPS: self.add_token(運(yùn)算符, two) self.pos 2 self.col 2 elif ch in SINGLE_OPS: self.add_token(運(yùn)算符 if ch in -*/!|% else 界符, ch) self.pos 1 self.col 1 else: self.add_token(錯誤, ch, is_errorTrue) self.pos 1 self.col 1 return self.tokens def read_word(self): 讀標(biāo)識符或關(guān)鍵字標(biāo)識符長度可設(shè)上限 start self.pos start_col self.col while self.pos self.length and (self.is_letter(self.text[self.pos]) or self.is_digit(self.text[self.pos])): self.pos 1 self.col 1 word self.text[start:self.pos] if len(word) self.max_id_len: self.add_token(錯誤, word, is_errorTrue) elif word in KEYWORDS: self.add_token(關(guān)鍵字, word) else: self.add_token(標(biāo)識符, word) def read_number(self): 讀數(shù)字支持整數(shù)和小數(shù)小數(shù)點(diǎn)后必須跟數(shù)字 start self.pos start_col self.col has_dot False while self.pos self.length and self.is_digit(self.text[self.pos]): self.pos 1 self.col 1 if self.pos self.length and self.text[self.pos] .: # 防誤判如 1..2 這種不是一個數(shù)字Token if self.is_digit(self.peek(1)): has_dot True self.pos 1 self.col 1 while self.pos self.length and self.is_digit(self.text[self.pos]): self.pos 1 self.col 1 num self.text[start:self.pos] if has_dot: self.add_token(常數(shù), num) else: self.add_token(常數(shù), num)代碼里你發(fā)現(xiàn)我在try匹配雙字符運(yùn)算符時沒有用elif后再嘗試單字符運(yùn)算符而是直接判斷ch。這是因?yàn)镾INGLE_OPS里已經(jīng)包含了所有非法前綴字符的兜底分支但要注意像“!”這種雙字符運(yùn)算符如果直接匹配失敗代碼會走到單字符分支把“!”當(dāng)作運(yùn)算符輸出這會導(dǎo)致源代碼里寫“!”卻被切成了兩個Token。因此MULTI_OPS的匹配順序必須放在單字符之前上面代碼的順序是對的。另一個參數(shù)是max_id_len默認(rèn)32字節(jié)。它對應(yīng)部分教材要求的“標(biāo)識符長度上限”超過上限我直接把整個詞標(biāo)記為錯誤Token而不是截?cái)?。截?cái)鄷淖兂绦蛘Z義標(biāo)記錯誤更容易在界面里看出來。3.3 界面層代碼輸入?yún)^(qū)、Token表格、錯誤狀態(tài)欄界面代碼main.py用Tkinter的Text組件做輸入?yún)^(qū)用Treeview做Token表格底部加一個狀態(tài)欄顯示錯誤數(shù)量。Treeview按列展示序號、類別、值、行號、列號這五列正好對應(yīng)詞法分析報告里必須出現(xiàn)的字段。import tkinter as tk from tkinter import ttk from lexer_core import Lexer, Token class TokenUI(tk.Tk): def __init__(self): super().__init__() self.title(詞法分析器 - 編譯原理實(shí)驗(yàn)) self.geometry(960x640) self._build_input_area() self._build_table() self._build_status_bar() self._build_buttons() def _build_input_area(self): # 左側(cè)輸入?yún)^(qū)放大源代碼支持滾動 left tk.Frame(self) left.pack(sideleft, fillboth, expandTrue, padx8, pady8) tk.Label(left, text源代碼輸入?yún)^(qū), anchorw).pack(fillx) self.input_text tk.Text(left, undoTrue, wrapnone, font(Consolas, 11)) self.input_text.pack(fillboth, expandTrue) def _build_table(self): # 右側(cè)Token表格結(jié)果一列一列排開 right tk.Frame(self) right.pack(sideright, fillboth, expandFalse, padx8, pady8) tk.Label(right, textToken分析結(jié)果, anchorw).pack(fillx) columns (序號, 類別, 值, 行, 列) self.tree ttk.Treeview(right, columnscolumns, showheadings, height28) width_map {序號: 60, 類別: 70, 值: 160, 行: 50, 列: 50} for c in columns: self.tree.heading(c, textc) self.tree.column(c, widthwidth_map[c], anchorcenter) scrollbar ttk.Scrollbar(right, orientvertical, commandself.tree.yview) self.tree.configure(yscrollcommandscrollbar.set) self.tree.pack(sideleft, filly) scrollbar.pack(sideright, filly) def _build_status_bar(self): self.status_var tk.StringVar(value就緒粘貼源代碼后點(diǎn)擊“開始分析”) tk.Label(self, textvariableself.status_var, reliefsunken, anchorw).pack(sidebottom, fillx) def _build_buttons(self): btn_bar tk.Frame(self) btn_bar.pack(sidebottom, fillx, pady4) tk.Button(btn_bar, text開始分析, commandself.analyze).pack(sideleft, padx8) tk.Button(btn_bar, text清空結(jié)果, commandself.clear_all).pack(sideleft, padx8) def analyze(self): # 清空上一輪表格只保留表頭 for item in self.tree.get_children(): self.tree.delete(item) source self.input_text.get(1.0, end-1c) if not source.strip(): self.status_var.set(輸入為空先粘貼一段測試代碼) return lexer Lexer(source) tokens lexer.run() for tk in tokens: self.tree.insert(, end, values(tk.tno, tk.type, tk.value, tk.line, tk.col)) self.status_var.set(f掃描完成共 {len(tokens)} 個Token f錯誤 {len(lexer.errors)} 個) def clear_all(self): for item in self.tree.get_children(): self.tree.delete(item) self.status_var.set(已清空等待下一次分析) if __name__ __main__: app TokenUI() app.mainloop()這段代碼的邏輯說明三點(diǎn)。第一Text組件的undoTrue能讓你在粘貼大段代碼后還能撤銷誤操作這個細(xì)節(jié)在實(shí)際調(diào)試時很管用。第二Treeview的height28是固定的如果你的Token數(shù)量超過28行右邊會單獨(dú)出滾動條這不占用輸入?yún)^(qū)空間。第三狀態(tài)欄直接展示“錯誤數(shù)量”它和樹表里的“錯誤”類別對應(yīng)老師截圖時一眼能看到程序處理了非法字符。tree.insert里再次使用了tk這個詞作為循環(huán)變量與tkinter模塊別名沖突是故意的還是失誤這里要小心上面代碼里我寫的是for tk in tokens這會把tkinter模塊名遮蔽掉一旦后續(xù)代碼再用tk.Toplevel就會報錯。常見的避坑做法是把循環(huán)變量命名為tok或t。你復(fù)現(xiàn)時務(wù)必改成for tok in tokens。界面代碼風(fēng)格像卡片式界面輸入?yún)^(qū)、表格區(qū)、按鈕區(qū)各自獨(dú)立擴(kuò)展時互不干擾。4. 跑通最小示例與三個必調(diào)的參數(shù)從能運(yùn)行到敢答辯4.1 啟動命令與目錄層級把運(yùn)行成本壓到最低拿這份工程運(yùn)行只需要兩步。第一保證你的Python版本不低于3.8因?yàn)榇a里用了f-string和typing相關(guān)語法3.6也能跑但3.8以下對中文注釋和Text組件支持有些舊坑。第二在token_ui目錄下打開終端執(zhí)行下面這行命令。python main.py如果哪個文件寫了import lexer_core卻提示ModuleNotFoundError絕大多數(shù)情況是你把命令行工作目錄切到了別處而不是工程根目錄。在VSCode里直接點(diǎn)運(yùn)行默認(rèn)工作目錄是當(dāng)前項(xiàng)目文件夾沒有問題的在Windows命令行里要先cd到token_ui再執(zhí)行。還有一個經(jīng)常遇到的情況是你雙擊main.py啟動控制臺一閃而過界面還沒出現(xiàn)就退了。這種問題通常是import環(huán)節(jié)有語法錯誤回到終端運(yùn)行就能看到報錯。為了測試我在sample.txt里放了一段迷你代碼你也可以直接用界面輸入?yún)^(qū)粘貼int main() { int count 0; float pi 3.14; if (count 1 pi ! 3.14) { count count 1; // 行注釋 } return 0; }這段輸入能覆蓋你需要的絕大多數(shù)Token類型關(guān)鍵字int、main、return標(biāo)識符count、pi運(yùn)算符、、、!、界符(){};常數(shù)0、3.14還有一個行注釋需要被跳過。跑完以后對照右側(cè)表格注釋內(nèi)容不該出現(xiàn)行號應(yīng)該正確從1遞增常數(shù)3.14應(yīng)該是一個Token而不是3和.14兩個。4.2 三張必須會改的規(guī)則表關(guān)鍵字、運(yùn)算符、界符詞法分析項(xiàng)目的“參數(shù)”不是數(shù)字而是三張規(guī)則表。絕大多數(shù)課程設(shè)計(jì)只要求識別三類關(guān)鍵字、運(yùn)算符、界符。下面這三張表是入門級配置你可以直接照著改rules.py。類別集合說明關(guān)鍵字if else while for int float return void main break continue大小寫敏感按C語言習(xí)慣配置雙字符運(yùn)算符 ! || -- - * /必須優(yōu)先于單字符匹配單字符運(yùn)算符/界符 - * / ! | % ( ) { } [ ] , ; :按實(shí)際需要增刪改表時最常犯的錯是把“/*”和“//”也放進(jìn)運(yùn)算符表里。這樣會導(dǎo)致注釋識別失效因?yàn)闋顟B(tài)機(jī)會先匹配到運(yùn)算符“/”后面的星號被當(dāng)成非法字符。正確的做法是像核心代碼那樣在run()開頭就攔截注釋起點(diǎn)注釋處理優(yōu)先于運(yùn)算符處理。還有一個細(xì)節(jié)關(guān)鍵字表不應(yīng)該包含printf、scanf這類庫函數(shù)名它們是標(biāo)識符而不是關(guān)鍵字。我看到不少網(wǎng)上源碼把printf放進(jìn)關(guān)鍵字表答辯被老師一問就露餡了。標(biāo)準(zhǔn)是語言規(guī)范保留字才叫關(guān)鍵字。4.3 三個隱藏參數(shù)最大標(biāo)識符長度、錯誤恢復(fù)策略、滾動閾值第一個隱藏參數(shù)是max_id_len默認(rèn)32。很多C語言教材說標(biāo)識符前32位有效但實(shí)際編譯器早就放寬了限制。這個參數(shù)存在的意義是讓你演示“超長標(biāo)識符報錯”。如果實(shí)驗(yàn)指導(dǎo)書沒要求建議直接設(shè)成64或128避免把自己寫的正常運(yùn)行代碼誤報錯。第二個隱藏參數(shù)是錯誤恢復(fù)策略。上面的實(shí)現(xiàn)遇到非法字符時跳過該字符繼續(xù)掃描這是最簡單的“恐慌模式”。另一種策略是跳過整個非法單詞對于中文注釋、特殊符號混入的場景后者更容易把后續(xù)Token切錯所以我不建議用。第三個參數(shù)是表格的最大顯示行數(shù)。Treeview的height限制只影響初始高度超出后滾動條接管沒有實(shí)際問題但預(yù)覽時如果不想讓窗口過高把它和顯示器的分辨率匹配起來就好。這里真正要調(diào)試的其實(shí)是“行號對齊”輸入?yún)^(qū)Text組件默認(rèn)沒有行號欄老師問起“第3行第5列怎么定位”時你可以直接回答狀態(tài)欄和表格里有行列字段界面按卡片式界面布局排查錯誤時先看行列再看值。5. 避坑五個高頻問題每一個都能讓“完整可運(yùn)行”當(dāng)場翻車5.1 中文注釋在界面上變成亂碼但程序不報錯現(xiàn)象復(fù)制一段帶中文注釋的代碼進(jìn)輸入?yún)^(qū)點(diǎn)擊分析表格里Token值正常但輸入?yún)^(qū)里的中文注釋在Windows下顯示成“錕斤拷”或方框。原因Tkinter在Windows上內(nèi)部使用Unicode問題通常出在源文件的編碼。如果你的.py文件不是UTF-8保存Python 3默認(rèn)按UTF-8讀取文件里的中文字符串字面量自然解碼錯。還有一種情況是你從網(wǎng)頁或PDF里復(fù)制代碼復(fù)制進(jìn)來的文本本身帶不可見字符顯示出來像亂碼但長度卻占位。解決用VSCode或任意編輯器把所有.py文件重新保存為UTF-8編碼不要用Windows記事本默認(rèn)的ANSI。另外在界面輸入?yún)^(qū)里粘貼代碼后先隨便刪一個字符再撤銷回來可以觸發(fā)Tk的刷新比手動關(guān)掉重開省時間。這在VSCode里被說成“注釋亂碼”其實(shí)是編碼保存問題不是Tkinter的錯。5.2 數(shù)字后面緊跟字母被切成了兩個Token現(xiàn)象輸入123abc正確行為應(yīng)該報一個非法Token或整個作為錯誤但程序可能輸出常數(shù)123 標(biāo)識符abc。原因狀態(tài)機(jī)在read_number()結(jié)束條件是“遇到非數(shù)字”它沒有檢查當(dāng)前字符是不是字母。如果數(shù)字后面直接跟字母說明這本身就不是合法數(shù)字詞素第二種處理才符合詞法規(guī)則。解決在read_number()退出循環(huán)后加一個檢查如果當(dāng)前位置的字符是字母就把整個串收回并標(biāo)記為錯誤。代碼寫法是在while循環(huán)結(jié)束后判斷self.is_letter(self.text[self.pos])為真則繼續(xù)讀完整個標(biāo)識符然后用add_token(..., is_errorTrue)登記。很多網(wǎng)上的源文件沒有這一步但這一步是實(shí)驗(yàn)報告里最容易加分的小細(xì)節(jié)。5.3 超長標(biāo)識符讓狀態(tài)機(jī)“卡死”或界面無響應(yīng)現(xiàn)象粘貼幾千行壓縮過的代碼點(diǎn)擊“開始分析”界面卡了好幾秒然后風(fēng)扇狂轉(zhuǎn)。原因可能的瓶頸有兩個。一是字符串切片過長二是Treeview一次性插入成千上萬個節(jié)點(diǎn)GUI線程被占滿。詞法分析本身是O(n)掃描但如果你的代碼在每次前進(jìn)時都做self.text[start:self.pos]切片長標(biāo)識符會造成重復(fù)復(fù)制。解決一是像上面代碼那樣只在單詞結(jié)束時切一次二是把Treeview插入改成批量操作每次insert前先禁用界面刷新或用after_idle延后或者限制最大顯示5000行并提示用戶。對于課程實(shí)驗(yàn)通常代碼長度不超過幾百行不會觸頂?shù)绻故緣毫y試建議在Lexer里加一個max_tokens參數(shù)超過8000個Token就停止掃描并在狀態(tài)欄提示防止界面卡死。5.4 每次重新運(yùn)行輸入?yún)^(qū)里殘留上一次的內(nèi)容現(xiàn)象第二次粘貼新代碼時輸入?yún)^(qū)里舊代碼還在導(dǎo)致Token表混入上一份代碼的結(jié)果。原因這是UI設(shè)計(jì)問題不是詞法分析問題。很多入門源碼只寫了“開始分析”沒寫“清空輸入?yún)^(qū)”按鈕。解決在analyze()開頭強(qiáng)制清空上一次的Token表并讓“清空結(jié)果”按鈕同時清空輸入?yún)^(qū)、表格和狀態(tài)欄三處。按鈕復(fù)用時不要只delete表格行而留下Text內(nèi)容。實(shí)際操作里我一般會把“打開樣例”和“清空全部”放成兩個獨(dú)立按鈕前者把sample.txt讀進(jìn)輸入?yún)^(qū)后者把三塊區(qū)域全部重置這樣演示時才不會因?yàn)闅v史殘留翻車。5.5 中文注釋在Git提交后變成問號或代碼顯示正常但diff時一片紅現(xiàn)象本地跑得好好的git add和git commit之后倉庫里源碼中的中文注釋全部變成“?”或亂碼。原因Git本身不會改文件內(nèi)容問題出在提交前沒有統(tǒng)一文件編碼。如果你用Windows記事本另存過文件它可能被存成UTF-8 with BOM或GBK而Git默認(rèn)按UTF-8無BOM顯示于是“看著正常、diff亂掉”。這跟git commit提交注釋是兩回事但很多人都會誤以為是自己寫提交信息時打錯了字。解決倉庫根目錄放一個.gitattributes文件強(qiáng)制所有.py文件按UTF-8處理并在編輯器里統(tǒng)一“UTF-8無BOM”編碼。另外提交前用git diff --stat檢查改動文件數(shù)量發(fā)現(xiàn)整個文件被識別為重寫多半就是編碼被改動過回退后重新保存即可。6. 進(jìn)階把狀態(tài)機(jī)變成可回放的調(diào)試器而不是一次性黑匣子到這里你的詞法分析界面已經(jīng)能跑、能看、能報錯了。但拿高分或者讓后續(xù)語法分析省力還需要一個核心技巧給狀態(tài)機(jī)增加“單步掃描”能力。做法是給Lexer加一個step()方法一次只前進(jìn)一個有效字符每走一步把當(dāng)前狀態(tài)、當(dāng)前字符、當(dāng)前已累積的單詞、當(dāng)前Token列表長度四樣信息保存下來。界面上的“單步”按鈕每次調(diào)用step()并把這四樣信息追加到一個只讀日志區(qū)。這個日志區(qū)產(chǎn)生的效果是你可以從第一個字符開始看著狀態(tài)機(jī)如何把一個詞逐步拼出來還能在報告里截一串狀態(tài)轉(zhuǎn)移記錄。常見做法是不改原有的run()而是寫一個TraceLexer子類把run()拆成step()然后界面用一個after循環(huán)每300毫秒自動走一步形成自動播放效果。這個回放過程對答辯特別有用因?yàn)槔蠋焼枴澳阍趺刺幚順?biāo)識符和關(guān)鍵字的區(qū)別”時你直接播放到某個標(biāo)識符位置日志區(qū)顯示“累積單詞:count狀態(tài):關(guān)鍵字檢查”比口頭解釋清楚得多。另一個我反復(fù)用的習(xí)慣是把Token結(jié)果導(dǎo)出成CSV用git diff對比兩次修改前后的差異。第一次導(dǎo)出token_baseline.csv改動詞法規(guī)則后再次導(dǎo)出token_new.csv這時git diff會精確顯示哪幾行Token變了。這個習(xí)慣幫我抓到過好幾次“改了運(yùn)算符優(yōu)先級但沒改規(guī)則表”的低級錯誤也能讓課程報告的驗(yàn)證部分站得住腳。CSV導(dǎo)出可以用兩行Python代碼實(shí)現(xiàn)核心是csv.writer和tree的遍歷不需要額外引庫。最后落到一句我的血淚經(jīng)驗(yàn)上詞法分析界面項(xiàng)目最重要的不是代碼寫得有多花哨而是你清楚“當(dāng)前指針在哪、當(dāng)前Token是什么、出錯了停在哪一行”。把這三點(diǎn)做進(jìn)界面里你的實(shí)驗(yàn)就跑在了大多數(shù)同學(xué)前面。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
黄aaaaaaaaaaaaaaaaaa色网站| 97国产成人精品免费视频| 后X久久| 91精品无码久久久久久久| 日韩欧美中文字| 91neishe| 日韩成人电影AV| 亚洲?V无码专区在线电影| 男人的天堂三级| 青青操在线亚洲视频观看欧美在线 | 色天使大香蕉| 久久黄色网址| 欧美日韩999| 日本裸体久久色噜噜| wwwcaobibi| 久久久一区二区三区三州| 亚洲日本大香蕉1| 亚州综合色图| 丰满精品人妻少妇久久字幕| 成人AV素股で擦久久| 丁香五月色| 精品高清一区二区三区三州| 国产又操| 一级啊性爱在线视频| 亚洲熟伦熟妇AV无码春色| 精品久操| 国产91丝袜在线播放蜜月| 久草精品国产蜜臀| 中文字幕十五区| 精品久久99| 丁香激情网| 国产精选三级在线观看| 日韩视频啪啪| 午夜丁香| 天天插天天操天天摸天天射天天看| 亚州操操穴网| 国产精品九9| 九色 人妻 大香蕉| 91日日夜夜| 久久中文字幕人妻熟av女蜜柚| 性色av一区二区| 日韩精品熟妇| 欧美97网| 国产熟女精品一区二区| 国产精品视频内谢女人| 亚洲黄片免费在线播放| 国产精品露脸在线观看| 亚洲国产欧美一区二区潘金莲| av网站在线看| 国产精品永久免费10000| 午夜小电影在线插入淫高潮| 久综合网| 综合久欧洲| 很很很很操| 999熟女精品| 亚洲日韩资源| 18禁免费视频| 亚洲有码 视频一区| 日本不卡码黄色| 亚洲 中文 女同| 黄资源| 美国三级日本三级久久99| 久久久久久九九九九九九| 日韩内| 亚洲天堂在线怕怕视频| 久久亚洲AV成人精品无码| 中日亚韩免费视频| 欧美日韩丝袜| 日欧毛片久久| 超碰97精品| 蜜乳AV免费观看| 香蕉久久国产AV一区二区| 青青国产精品在线| 丰满少妇精品一区二区| 在线精品福利免费播放| 熟女在线视频| 超碰97极品9| 尹人免费观看视频在线| 亚欧高清v| 日韩无码嘿咻黑热久| 男人的天堂在线| 国产精品久久久久久久久久久久久久吹| 国产日韩久久| 天天草天天干天天日| 国产精品久久久久久夜夜夜| 尤物视频偷拍免费| 日本人妻中文字幕精品| 黄色小说亚洲| 国产农村妇女精品| 午夜精品视频777| av在线人气| 高清不卡 中文 人妻| 久久婷婷视频| 日韩亚洲97| 国产精品成久久久久午夜午夜| 极品色www影院| 欧美国产一区二区三区麻豆传媒 | 亚洲影院365| 欧美色图天堂网m| 超碰 国产熟女精品一区| 乱伦熟女论坛| 九九综合| 欧美色图欧美| 亚洲蜜桃V妇女| 欧美日韩人人早| 蜜臀久久99精品久久久久久| 在线v中文字幕一区二区三区| 久久超碰爱| 精品人妻一区二区免费看| 乱伦av麻豆| 91殴美大片| 天天肏天天干| 美女啊啊啊啊啊啊啊| 农村少妇久久久久久久| 99热啪啪| 天堂成人网| 久色网| chaopen97久久| 国产午夜激片Av毛片不卡| 国产有码一区| 人妻精品免费一二三区| 中文字幕国产精品1区| 7777欧美成是人在线观看| 欧美后入视频| 99热这里只有精品地址| 安微少妇操BBB| 亚洲s在线观看| 国产精品一级片在线看| 精品性爱久久视频| 国产家庭乱伦网址| 久久久天美| 久久天天摸| 国产精品久久久久久久免牛肉蒲团| 日B操| 丝袜综合网| 在免费jIzzjIzz在线视频| 久9久精品视频| 亚洲 国产 精品一区| 91欧洲入口| 超碰av在线| 国产97av| 伊人久久国产免费观看视频| 狠狠激情综合狠狠操中文字幕| 欧美在线视频观看一二三四区高清| 都市久久精品激情亚洲| 中文字幕无码不卡啪啪| 超碰97网址| 啪啪啪东京| oumeizonghese,www| 家庭乱伦国产| 中日韩久久久免费看| 97色婷婷| 亚洲av影音先锋| 欧美激情亚洲| 欧美精品91| 99色婷婷中文字幕乱色| 夜嗨影院| 日韩熟女无码| 欧美另类天堂| 好屌色综合| 探花精品视频| 91伊人久| 人人摸.人人色| 蜜桃精品一区二区三区久在线| 伊人91| 性夜影院爽黄A爽免费动漫| 色婷婷综合久久中文字幕雪峰| 人人操肉肉| 91岛国动作片| 国际精品久久久| 国产传媒1234区| 极品白嫩美女白浆成人福利在线看| 亚州男人天堂| 伊人久大| 久久九精品| 欧美制服网站美腿丝袜| 午夜久久无码1000合集| 日韩精品在线视频,日韩精品……| 精品中文日韩字幕视频| AV天天在线观看| 欧美黄片免费在线观看视频| 成人a级高清视频在线观看| 88在线一区二区三区| 亚洲中文人妻色| 日韩无码专区| 天天摸,夜夜摸| 激情五月天社区| 蜜臀AV秘一区翔田千里| 激情抓乳插进去啪啪啪日韩 | 毛片视频白嫩| 国产成人在线观看综合| 亚洲无码免费看| 中文字幕丰满人妻日本| 视频国产成人精品日本亚洲18| 久久久国产精品亚洲精品| 男人天堂站| 婷婷丁香六月天| av日韩在线观看电影| 两女互慰AV高潮喷水在线观看| 九九九九热只有精品| 老熟女中文字幕高清| 91欧美www| 影音综合网| 999久久久精品国产| av日韩在线观看电影| 日韩无码操逼片| 婷婷超| 欧美色乱| 国产资源中文字幕在线| 亚洲激情在线观看一区| 国产精品爆乳懂色蜜乳| 日韩免费中文字幕视频| 亚洲国产精品无码AV久久| 97精品一区二区三区免费| 少妇精品| 亚洲久久久久| 手机看片91人妻| 欧美综合网| 97啪啪| 91久久久亚洲| 一类无码操逼视频| 日本成人电影资源网| 久久一二三四五六七八九区区| 久久久一热在线播放| 强奸少妇AV导航网| 超碰97在线中文| 久久亚州大香蕉| 欧美午夜熟妇黑人精品91| 欧美BT 亚洲色图| 999热这里只有精品| 精品少妇99| 久久9久| 欧美91精品国产自产| 亚洲 欧美 精品专区 极品| 99久久无码| 影音先锋视频在线| 日韩精品一区的| 91操人视频| 91狠| 在线黄色污污网站| 国产精品一区在线播放| 乱欲视频| 天堂中文资源在线bt| 日韩中文字幕二区| 青青草在线视频人人想人人上| 97久久久精品| 色欲久久99国产精品久久久久久| 色哟哟AⅤ| 熟女视频久久| 欧美色图亚洲色图成人在在线| 亚洲综合99999| 91天堂丝袜美腿| 日本成人在线不卡一区二区三区| 操婢日韩| 亚洲日本加勒比在线| 亚洲一区二区专区-国产丝袜精品丝袜-成人AV | 亚洲天堂人妻一区二区| 精品久久九| 国产免费内射视频| 欧美亚洲| 欧美日韩婷婷中文| 国产v亚洲v日韩v欧美v片另类| 日韩欧美大力操| 婷婷综合网| 偷拍在线观看视频| 蜜臀无码视频在线观看| 国产AV久久久蜜爱影集| 偷拍片久久| 免费国产视频| 97青青操视频| 精品1区2区3区| 午夜欧美女人操逼| 久久国99999| 成年人黄色| 91人人臊| 亚洲人妻久久久| 国产精品久久久无码aV去| 99啪啪| 韩国国产欧美情侣视频在线| 男女日B国产| 国产按摩一区二区三区| 青草精品视频一日本久久久久网站| 亚洲国产av中文字幕久久| 色欧美天天| 日本国产二线女色| 全免费a敌肛交毛片免费| 成人综合视频久久| www.亚洲黄色| 国产污视频麻豆传媒一区二区| 九九九国产| av九九| 亚洲情色综合网| 国产精品嫩草影院免费| 蜜臀久久精品久久久久视频| 狠狠中文字幕| 欧美大色交| 园内精品自拍视频在线播放| 天天看高清麻豆| 极品综合| Aa东京男人的天堂| 丁香五月天啪啪| 97ai亚洲| 欧美午夜精品久久久久久超碰| 久久岛国| 97色色国产视频| 亚洲麻豆av一区二区| 欧美78p| 亚洲欧美另类小说| 中文字幕乱在线伦视频中文字幕乱码在线| 91精品久久综合熟女| 国产精品3| 国产午夜无码片在线观看影视| 欧美超碰人妻97| 午夜福利免费精品视频| 欧美亚洲韩国视频十五区| 国产精品久久久久无码AV会牛| 97视频新免费| 色婷婷丁香五月| 欧美亚洲91| 国产一级久久久| 一区二区三区高清天码| 无卡一区=区| 精品久久99| 亚洲国产成人精品女人久久久| 91青视频| 人人射人人操人人摸| 少妇天堂| 1204金沙人妻懂旧版免费| 少妇3P性爱自拍| 欧美色交| 精品国产72| 在线v中文字幕一区二区三区 | 国产免费内射视频| 色九九九| 久热伊人| 99久久久无码精品国产人| 亚洲青青草| 志村玲子视频一区二区| 手机在线播放国产福利| 91少妇| 亚洲综合69| AV九九| 97超碰磁| 天天干嫩逼网| 九热超碰| 亚洲日韩青青草色月| 欧美强奸一区二区诱惑| 一区二区三区美女超清| 青女偷拍网| 牛牛久久国产精品视频一二三| 操一区| 快点操死我| 5252色欧美在线男人的天堂| 后入人妻一区| 色综合五月天| 日韩AC| A 天堂| 亚洲精品国产拍免费91在线| 国产五码丝袜屁眼| 欧美少妇大量自拍视频在线观看| 欧美特大黄一级片片免费| 国产资源中文字幕在线| 麻豆 美女 丝袜 人妻 中文| 女人天堂网| 狠狠夜色午夜久久综合在线| 久久婷婷一区二| 亚洲国产成人精品无码专区| 日韩欧洲操屄视频| 午夜福利一区二区影院| 亚洲无码精品AV久久久| 中国农村熟妇毛片视频| 操国产高清| 九九热av| 東南亚性呦成人伦理资源在线视频| 极品久久久久久久久久久久久久| 97精品视频免费| 97网址www| 999在线电影香蕉| 九九无码视频| 免费AV播放| 国产人妻天天干精品| 久久男人精品| 欧美熟女操屄| 黄片不用下载在线观看| 亚洲最大网站av| 亚洲蜜桃V妇女| 免費黃色視頻觀看一| 欧美日本国产日韩激情视频| 簧片免费看视频| 久久久久国产精品片区无码直播| 色婷婷九月天天综合| 国产精品激情久久久久久久| 色色香蕉| 九九热精品| 色婷五月天| 亚洲色图91欧美日韩| 国产999精品久久久久久| 丁香六月婷婷久久综合| 日本有码影片下载| 九九自拍伦理| 超碰人人超在线观看| 欧美第一页| 91肉片| 强奸乱伦 亚洲一区| 中文字幕av亚洲精品| 国产91福利小视频在线观看 | A片A5445444| 1级黄色夫妻对换性交免费看| 澳门黄片一香蕉视频| a一区二区三区乱码在线| 国产欧美日韩一区二区三区| 在线无码操| 狠狠干,狠狠操| 开心六月色| 天欧美在线| juliaann欧美丝袜办公室| 思思热在线视频免费| 久久久久久久久久久免费精品| 在线观看一级α片刺激高潮视频| 精品国产乱码久久久久久免费| 亚洲黄色网址| 四虎免费在线观看| 91在线视频免费播放| 五月色网| 今日头条成人一区二区三区四虎精品| 中文字幕色AV| 亚洲麻豆av一区二区| 国产亚洲精品美女久久久久久2021| 在线视频日韩欧美国产| 艾草av| 久草线上视频免费看| 伊香蕉综合久久久久久久噜噜噜| 波多野结衣一级视频| 97在线资源| 在线亚洲丝袜视频网站| 97超碰欧美手机在线| 91精品老女人| 男人的天堂一区三区| 91色艳| 校园春色宗合网| 啊啊啊啊网站| 国产视频一区二区免费| 日本在线一二| 舔人妻中文免费视频| 18禁在线视频| 91oumei| 欧美日本不卡| 欧美中文字幕日韩在线| 欧亚综合一卡二卡中文字幕| 97精品视频在线| 夜夜操美女| 精品人体无圣光凹凸| 久9爱精品| 五十路六十路素人熟女| 丰满搜索结果 -第18页- 久久高清无码 | 2020中文字幕| 先锋女优在线观看视频| 色小视频蜜乳| 欧美性五月| av强奸乱轮| 五月天色图| 91色图| 亚洲精品男人的天堂| 亚洲人妻久久久| 操高情无码| 亚洲熟久久| 国产精品熟女九色九色蜜臀| 色网在线| 一本一道波多野毛片中文在线| 伊人成人情色综合| 亚洲国产一级黄色视频| 亚洲中文字幕妇伦久久| 无码国产精品96久久久久孕妇| www.天天干| 欧美热图99| 大香蕉九九| 久久久啊啊啊| 国产九月婷婷| 黄片视频观看| 久久精品人妻一区二区| 国产精品久久久无码AV网站| 久久久少妇诱惑精品视频| 强奸乱伦av电影| 久久精品女同亚洲女同13| 亚欧国产无码精品在线| 色噜噜国产精品视频一区二区| 亚洲高潮少妇| 国语对白露脸XXXXXX| 哈哈操电影AV| 日韩亚洲精品一区二区| 国产一区二区在线看| 国产超碰在线| 亚洲无码 国产无码| 91国产大片| 午夜寂寞欧美| 97超碰9| 人人色人人射人人妻| 国产AV色黄看到爽| 亚洲色图8| 久热69九色熟妇97| 激情综合二| 九九九九亚洲| 九九久久国产精品| 亚洲第一在线视频| 在线黄页看毛片| 欧美天天影院| 77777亚洲蜜臀精品久久综合蜜臀| 超碰成人人人爽人人爽| 嗯嗯,好大,好爽,好骚| 国产精品制服丝袜清纯唯美| 久久久久99999| 色av中文字幕| 色婷婷久久| 操逼视频国产无套| 午夜啊啊| 国产视频小说| 东北黄色电影| 美女黄频a美女大全免费皮| 色欧美亚洲| 亚州欧美总和| 丝袜喷水在线| 久久婷婷色| 久久透逼视频| 后入式免费视频| 最新9久久久9免费视频| 1024亚洲中文字幕久在线看片你懂的| 屁屁影院一区二区三区国产| 波多野结衣之双飞调教在线播放| 97日韩欧美亚洲| 有码色中文字幕在线观看| 99人人干| 91成人在线免费视频| 黄色无码高清黄色无码网站| 日韩内| 久久综合av| 开心六月色| 国产按摩一区二区三区| 国产成人自拍视频在线| 性影在线视频| 免费自拍三级综合| 精品无码久久久久久久杏吧| 亚州综| 五月天人妻综合| 97这里只精品| 后入式在线免费观看60秒| 69人妻人人揉人人躁人人精品| 97 国产一区| 亚洲人妻av| 日韩激情啪啪| 午夜精品久久久久久久99蜜桃一| 中文精品一区二去| 欧美性爱免费短视频| 欧美黄色手机在线观看| 女沟厕偷窥piss小便| 加勒比海人人操超碰在线| 久久华人网| 神马九九九| 豆1无夜无码| 欧美传媒一区| 欧美在线干| 色老久久| 欧美色图片欧美色图| 毛片麻豆91糖心精品毛情片| 学生妹天天看| 青青草影视蜜久久| 欧美亚洲特P| 天天干人人乐| 日本一级特级毛片视频| 一区二区三区美女超清| 国产亚洲在线观看| 亚洲中文日韩欧美大香蕉视频| 国产无码精品高清| av天堂天堂av日韩| 伊人五月天激情| www成人啪啪18秘 免费| 久久女婷| 国产精品经典一卡久久久| 蜜臀亚洲中文| 欧美综合 站| 大香蕉手机在线| 久久伊人影院| 操啊国产| 久久精视频美日韩在线视频| 涩五月婷婷| 岛国AV一区二区电影| 欧美久久婷婷| 久久精品国产97欧美精品亚洲| 亚洲 日本 不卡| 欧美巨大性舒爽顶到了| 国产黄片精品在线| 色五月亚洲| 日本丝袜美腿人妻九九| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 久久亚洲熟妇在线视频| 青青久久久| 欧美天天| 亚洲欧美日韩精品久久久一区二区| 91GD.COM| 草久久久| 91 丝袜在线播放| 国产精品熟女九色九色蜜臀| 五月香婷婷| 黑人中出21连凳花野真衣| 超碰欧美97资源| 国产精品电影大全| 曰韩成人免费视频| 欧美色图私拍91| 97伊人超碰| 最新9久久久9免费视频| 超碰碰小说97| 欧美不卡在线一区二区| 超碰AV在线| 日日夜夜青青草母狗| 91美女视频。| 人人摸人人添人人操 | 久久久久久久综合,国产| www国产无码| 亚洲成?V人片在线观看福利| 99热aaa| 欧美日韩亚洲天堂| 自慰白浆在线观看| 77国产精品| 很很操在线| 五月天婷婷色| 青青草导航在线视频| 乱伦色图网址是多少| 亚州精品一区二区三区香中文字幕在线| 亚洲素人网| 黄色人人| 97免费视频网| 日韩黄片影院| 亚洲AV资源| 超碰97护士| www五月| 亚洲狠狠入| 国产女生在线| 少妇人妻激情四射| 亚洲欧美综合区自拍另类| 中文字幕制服欧美久久一区| 99re免费| 狼人狠干| 99ri在线视频| 熟人人妻少妇精品久久| 中文字幕 国产 精品| 男人的天堂日韩| 日韩无码黄色片| 午夜毛片高清免费不卡| 亚洲国产精品9999在线观看| 伊人网在线观看| 欧美性生活男人的天堂| 亚洲精品天天影视综合网| 美女裸体无遮挡永久免费观看网站| 黄色AV影视| 男人的午夜天堂| 超碰超碰95| 人人操人人色网| 免费农村成人少妇人妻Aa一区二区视频 | 综合亚洲网| 五月丁香网站| 久久神马| 欧美韩国你懂得在线| 亚洲色图欧美色图日韩色图| 久久熟女久| 亚洲福利中文字幕在线| 97国产精品一区二区传媒公司| 爽爽淫人网| 欧美精品精品一区二区| 久久9精品| 久久久久亚洲Aⅴ无码| 午夜福利在线视频1000| 日本熟女免费視颖| 日本黄页视频在线观看| 欧美一区二区亚洲天堂| www欧美91| 大香蕉免| 乱伦Av网| 久久久久白虎| 成人网欧美风情| 国产精品视频麻豆入口| 青青草影视蜜久久| 青青草九九九九九| 熟女五十路一区二区三| 久久东京热成人| 九九久久久九九| 亚洲乱伦图片视频| 天美传媒AV在线| 男人的天堂VA在线| 亚洲精品三| 青娱乐淫乱1314| 骚女高跟AV在线| A久久| 亚洲乱色熟女一区| 欧美精品系列| 97久久免费| 另类小说五月天| 少妇啪啪自拍| 久久黄片国产一区二区| 欧美宗合色| 亚州色站 日韩电影| AA特级绝黄| 97操| 激情文学亚洲| 麻豆AV短剧| 色情综合网| 人人操人人摸人人看人人插| 高清视频一区| 亚洲精品不卡一二三区| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 九九九久久久| 久久99干一本高清| 久久精品国产精品一区| 男人天堂网手机版婷婷| 性色高清在线| 五月天开心网| 超碰人人超在线观看| 成人精品久久久午夜福利| 国产馆| 欧美亚洲韩国视频十五区| 91处女视频在线观看| 天天操女人| 开心激情站| www…国产操逼| 国产91精品福利在线| 一区二区三区免费视频入口| 天天网综合| 中文有码9| 黑丝制服中文字幕| 国产精品午夜精品| 欧美在线综合| 国产热av| 亚洲熟妇综合久久久久久| 精品然女一区二区| 亚洲综合113页| 蜜臀精品1区2区| 午夜精品一区二区三区三上悠亚| 综合网色| 久久五月天婷婷| 亚洲超碰在线| 成人日韩欧美| 久久香蕉影院| 伊人久久婷婷| 99色色网| www.狠狠干.coom | 97视频免费播放| 久久精品区| 亚洲综合网91| 欧美色乱| 国产强奸乱伦无码视频| 人妻少妇久久中文字幕一区二区 麻豆 | 操香逼| 久久亚洲不卡一区二区三区 | 人人模人人看| 黑人白女精品一区| 大香网站| www.91久久| 婷婷操逼| 啊啊啊啊嗯嗯嗯用力好爽 | 亚洲 欧美 天天| 炮色五月| 欧美亚洲厕所精品偷拍91| 91 亚洲情侣偷拍 久久| 亚洲脚交| 久久久久9| 粉嫩国产精品久久粉嫩| 午夜呻吟欧美| 另类av综合久久| 久久机热| 神马久久午夜| 在线色导航| 抽插无码高清一区| 少妇高潮99p| 欧美 熟女 日韩| 91AV国产精品| 91w欧美| 中文字幕精品一区欧美| 国产精品免费视频人成| 亚洲婷婷五月天| 91亚州欧美| 日日AAvv| 日本成人免费一区二区三区| 97人人操人人摸| 婷婷伊人| 欧美A√综合网| 少妇贴图| 久久人人爽爽人人爽人人片αV| 日本黄 R色 成 人网站| 日韩一区二区熟女| 91麻豆天美国产欧美高潮| 欧美影院一区二区三区| 91动漫操逼视频| 亚洲s在线观看| 国产精品大屁股999| 国产精品精品系列在线观看| 欧美日韩操逼嗦吊| 久久少妇视频| 亚洲熟女综合网| 亚洲一欧洲中文字幕在线 | 精品午夜福利| 成人八戒网站| 在线综合 亚洲 欧美中文字幕 | 美日韩男女操屄视频| 五月丁香激情综合| 日韩欧美偷拍美女视频| 国产成人在线观看网址| 日韩欧美经典在线观看| 久久精品视频在线观看| 亚洲无 码A片在线观看麻豆| 手机看片1024你懂的国产| 99re9这里只有精品| 校园春色AV天堂| 手机在线中文字幕国产| 天天综合AV| 欧美图片校园春色| 国产精品视频一区二区三区八戒| 国产性感骚丝袜在线| 蜜臀Av一区二区三区| 国产一区二区三区导航| 伦在线97| 在线观看高清AV| 99.色网| 国产高清免费不卡av| 黄片免费看的| 日逼五月天| 青娱乐国产剧情av一区| 99免费在线视频| 精品女同一区| 1禁看欧美黄片免费看| 五十路熟女工口 | 日韩啪啪视频| www.acm成人黄色毛片| 国产精品久久久久无码A√| 人人污日韩一区二区| 精品91| 欧美美女啪啪视频| 加勒比综合| 青娱乐亚洲热| 国产拍偷精品网站| 亚熟在线| 亚洲另类小说卡通动漫| 日夜干射色啊| 色婷婷视频| 91色伦| 九久9精品| 偷拍视频青青草在线视频| 婷婷五月天伊人| 999久久久九九九九| 999在线电影香蕉| 欧美亚洲| 自拍欧美| 黄色欧美性爱视频| 亚春色色| 99超碰色| 国产午夜在线观看视频| 9999亚洲精品| 婷婷AV一区二区三区| 东京热91| 啊啊啊啊啊啊啊国| 少妇高潮流水av免费| 免费成人在线熟妇网| 欧美劲爆视频一区二区| 午夜电影在线观看无码专区| 中国熟女91| 色婷婷久久| 欧美精品三级黄片| 欧美亚洲日韩16色| 亚洲色图亚洲无码强奸乱伦| 91蜜桃传媒精品久久久一区二区| 中文字幕一二三av| 丁香五六月啪啪| 射丝袜高跟鞋99| 高清国产无码av| 韩国三级三级BD在线| 久久透逼视频| 2019男人的天堂| 熟妇高潮一区二区免费视频| 国产女人高潮嗷嗷嗷叫小说| 91痴汉| 91 丝袜在线| 日本免费专区| 香蕉99秘 一区精品蜜桃臀| 久久久久久久久九九久孕交| 日韩激情啪啪| 91视频精品| 哑洲在线| 综合激情97| 一区二区三区机械有限公司| 白丝被操91| 午夜福利 成人 91| 欧美色一二三| 热久久这里只有精品| 一区不卡在线观看av| 欧美伊人电影| 少妇精品久久久| 熟女丰满人妻一区| 亚洲成人性爱在线观看| 国产精品免费久久久久久久久久| 97在线资源| 色狠人在线99| 久久久久久亚洲精品不卡人乳| 国模不卡| 性色av大全| 亚洲图片欧美色| 亚洲综人网| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 色五天伊人| 中文字幕三四区| 国产精品毛片| 级品肉射| 色鬼在线综合| 天天影视网综合少妇| 国产精品自产拍在线观看社区| 天天爽夜夜爽夜夜爽精| 丰满少妇一区二区三区免费看| 国产精品高朝久久久久久久| 日韩激情视频| 人妻在线臀日韩| 女优免费一区二区永久| 岛国成人av在线播放网址| 亚洲 自拍偷拍 欧美| 欧美爆乳精品一区二区| 九九九久久久| 超碰97亚洲| 色九久| 99操逼| 久久久96精品| 亚洲九九视频在线观看| 亚洲日韩乱码中文无码蜜桃臀网站| 欧美色图片91| 99爱久久视频频| 青青青操| 老熟女91av| 久9久| 大香蕉十区| 中文字幕免费观看| 亚洲永久AV无码精品秋霞| 天天弄欧美| 美腿丝袜偷拍亚洲欧美| 青春草A| 天天色怡春院| 超碰97首页| 亚洲人人夜夜澡人人爽| 亚洲欧美综合网站| 国产久9| 加勒比综合在线| 1024精品在线| 久久精品一区二区三区四区五区| 人妻丝袜美腿中文字幕| 成·人免费午夜在线观看| w w w.久久精品| 国产精品高清2021在线| 韩国手机不卡无码三级视频| 日小BB小视频| 国产 热久久久久国产精品| 日本熟妇人妻中出视频| 去干网最新版| 蜜桃视频精品一区二区| 亚洲精品色| 中文字幕人乱码中文字的预防方法 | 91伊人| а√天堂资源官网在线资源| 日韩99精品视频综合区| 搡老人老9丨女老熟人| 国模精品一区二区三区苹果色戒 | 亚洲色交| 国产精品午夜福利亚洲综合网| 国产成人自拍视频视频| 欧美三级中文字幕hd| 综合熟女| 美女的肌被草喷水视频| 大屁股国产在线视频| 欧中美三级一区二区三区| 尤物网站91| 乱伦图一区| 夜夜爽33333| 大香蕉在线视频重口味毛片在线| 99re6在线视频精品免费完整版安卓版| 91国产丝袜白虎| 日韩操啪| 国产日本久久免费精品| 超碰日本97美女人妻人人玩人人爱 | 国产三级日产三级韩国三级| 丁香六月东京热| 欧美十八禁在线看| 天堂av2019| 亚洲成人妻日韩在线| 好爽视频在线观看视频 | 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 亚洲双插| 国产精品无码成人精品| 三级片网站在线播放| 国产大片精久久久久久| 偷拍亚洲情色| 豆花视频操逼网址| 色色五月婷婷| 天综合网欧美| 色色毛片| 99热综合| 日产成人久久| 超碰在线欧美性爱激情| 五月天婷婷久久| 国产亚洲精品美女| 男人的天堂 在线一区| 欧美东京热精品A∨| 激情露脸爱| 欧美国产婷婷久久| 国产精品自拍欧美在线| 精久久久91| av影片在线观看不卡| 精品人妻美妇91job| 人人妻人人色| 欧美色综合| 大香蕉AV在线| 欧洲一区二区三区四区在线观看| 一个人免费视频观看在线WWW| 五月激情综合网| 日1区2区3区2020| 亚洲精品啪视频| 和协影院中文字幕三区| 日韩成人私密一级精品av| 这里只有精品视频在线| 国产久9| 玖玖资源综合在线视频| 亚洲天堂自拍| 13小男生GAY自慰脱裤子| 蜜臀久久99精品久久久久久久久| 可乐操亚洲蜜911| 国产精品免费视频人成| 2019午夜福利视频| 精品视频免费在线一区| 自拍视频大全亚洲专媒视频/一区二区三区 | 久久免费精彩视频| 黑人精品欧美一区二区蜜桃| 国产精品久久久久久 百度| 日本孕妇孕交| 欧美性巨大╳╳╳╳╳高跟鞋| 天天天天做夜夜夜夜做| 日本三级A片网站com| 上床不卡网站| 成在线人在线观看视频| 综合天天网| 久久直播国产| 日韩二区三四区五区六区在线看| 亚洲成熟国产精品美女| 免费99精品国产自在在线| 户外裸露刺激视频第一区| 久久超碰av在线| 婷婷亚洲五月***久久| 91插B网站| 91狠狠综合久久| 999精品乱码| 亚洲、日韩、综合、另类| 日韩性爱小视频| 欧美熟女妇同| 欧美色性爱| 夫妻AV网站| 久久久久免费少妇| a'v在线资源| 欧美性爱网97| 欧美日韩岛国大片在线观看| 成人区人妻精品一| 婷婷日韩一区二区三区中文字幕在线| 综合网91| 樱花草社区www中国| 女人喷水视频在线观看| 91日韩网站| 人妻久热在线| 国产一区在线观看无码AV| 天天爱综合网| 日韩人妻精品久久久久| 日韩成人私密一级精品av| 日本999精品| 国产欧美一区激情交| 亚洲天堂男人天堂网| 99在线观看无大码| 欧美日韩操逼嗦吊| 久久精品一区二区三区四区五区| 日韩欧美被操黄免费观看| 强奸乱伦av电影| 亚洲另类春色| 久久熟女久| 99热这里都是精品| 亚洲av国产av综合av卡| 97欧美色| 熟女中出视频| 91干熟女| 亚洲一区在线观看欧洲| 美女网站黄页| 精品久久在线区一区| 亚洲av影院在线观看| 夜夜嗨视频| 蜜桃精品一区二区三区久在线| 狠狠操夜夜操蜜桃视频三区| 大香蕉www.超碰| 夜夜欢天天干| 亚洲精品1区| 天天欧美欧美亚洲网| 三级网色| 精品国模无码| 欧美一区二区| 男人的天堂日本东京热| 999狠狠综合| 国产女性无套 免费观看| 国产品精品自在在线午夜免费| 尤物视频偷拍免费| 久久亚州高清| 蜜桃臀av在线观看| 91成人在线免费视频| 黄色成人网久久久久久| 青青草一区二区高清无码视频| 天天澡天天爽日日av| 久久久久久久久久久久久久久性生活视频 | 伊人成人中文字幕久久网| 黄色网址在线免费观看| 人人操 欧美| 欧美乱欲| 天天干夜夜鈤| 中文字幕精品三级久久久| 日韩三级在线观看mp4| 性欧美另类高清| 97在线精品| 青青操狠狠撩| 国产精品宅男免费| 亚洲一区二区三区不卡国产欧美| 啊啊啊操死我| 黄页av| 可乐操亚洲蜜911| 亚洲AV在线资源| 人妻内射一区二区在线视频| 在线综合 亚洲 欧美中文字幕| 亚洲欧洲偷拍一区| 色色99| 日本99视频| 国产成人+综合亚洲+天堂| 最新日产中文在线麻豆| 精品国产人成在线| 日韩精品在线观看观看| 国产精品探花色| 国产JDAV无码视频在线观看| 东北毛片| 国产强奸乱伦欧美| 韩国一级做a久久久久| 日韩无码一区二区三区| 欧美乱欲| 亚洲天堂一区| 国产女同在线观看视频| 成人线上超碰| 欧美巨大性舒爽顶到了| 亚洲无码精品AV久久久| 久久久久久久免费A片国产成a人亚洲精∨品无码 | 日韩免费a级毛片无码a∨| 国产激情视频一区区三区| 久久精品久| 日本操逼视频免费| 日韩精品资源专区二区| 98人妻精品一区二区色欲| 欧美日韩*字幕一区| 97资源视频| 日韩无码黄色片| 亚洲AV无码国产精品久久久久|