* lexer需要輸入的是一個字符串。好在大多數機器都有足夠的內存,這很少導致性能的問題。這意味著,lexer現在還不能用來處理文件流或者socket流。這主要是受到re模塊的限制。
* lexer支持用Unicode字符描述標記的匹配規則,也支持輸入字串包含Unicode
* 如果你想要向`re.compile()`方法提供flag,使用reflags選項:lex.lex(reflags=re.UNICODE)
* 由于lexer是全部用Python寫的,性能很大程度上取決于Python的re模塊,即使已經盡可能的高效了。當接收極其大量的輸入文件時表現并不盡人意。如果擔憂性能,你可以升級到最新的Python,或者手工創建分析器,或者用C語言寫lexer并做成擴展模塊。
如果你要創建一個手寫的詞法分析器并計劃用在yacc.py中,只需要滿足下面的要求:
* 需要提供一個token()方法來返回下一個標記,如果沒有可用的標記了,則返回None。
* token()方法必須返回一個tok對象,具有type和value屬性。如果行號需要跟蹤的話,標記還需要定義lineno屬性。
- 0 一些翻譯約定
- 1 前言和預備
- 2 介紹
- 3 PLY概要
- 4 Lex
- 4.1 Lex的例子
- 4.2 標記列表
- 4.3 標記的規則
- 4.4 標記的值
- 4.5 丟棄標記
- 4.6 行號和位置信息
- 4.7 忽略字符
- 4.8 字面字符
- 4.9 錯誤處理
- 4.10 構建和使用lexer
- 4.11 @TOKEN裝飾器
- 4.12 優化模式
- 4.13 調試
- 4.14 其他方式定義詞法規則
- 4.15 額外狀態維護
- 4.16 Lexer克隆
- 4.17 Lexer的內部狀態
- 4.18 基于條件的掃描和啟動條件
- 4.19 其他問題
- 5 語法分析基礎
- 6 Yacc
- 6.1 一個例子
- 6.2 將語法規則合并
- 6.3 字面字符
- 6.4 空產生式
- 6.5 改變起始符號
- 6.6 處理二義文法
- 6.7 parser.out調試文件
- 6.8 處理語法錯誤
- 6.9 行號和位置的跟蹤
- 6.10 構造抽象語法樹
- 6.11 嵌入式動作
- 6.12 Yacc的其他
- 7 多個語法和詞法分析器
- 8 使用Python的優化模式
- 9 高級調試
- 9.1 調試lex()和yacc()命令
- 9.2 運行時調試
- 10 如何繼續