* 默認的分析方法是LALR,使用SLR請像這樣運行 yacc():yacc.yacc(method=”SLR”)注意:LRLR生成的分析表大約要比SLR的大兩倍。解析的性能沒有本質的區別,因為代碼是一樣的。由于LALR能力稍強,所以更多的用于復雜的語法。
* 默認情況下,yacc.py依賴lex.py產生的標記。不過,可以用一個等價的詞法標記生成器代替: yacc.parse(lexer=x) 這個例子中,x必須是一個Lexer對象,至少擁有x.token()方法用來獲取標記。如果將輸入字串提供給yacc.parse(),lexer還必須具有x.input()方法。
* 默認情況下,yacc在調試模式下生成分析表(會生成parser.out文件和其他東西),使用yacc.yacc(debug=0)禁用調試模式。
* 改變parsetab.py的文件名:yacc.yacc(tabmodule=”foo”)
* 改變parsetab.py的生成目錄:yacc.yacc(tabmodule=”foo”,outputdir=”somedirectory”)
* 不生成分析表:yacc.yacc(write_tables=0)。注意:如果禁用分析表生成,yacc()將在每次運行的時候重新構建分析表(這里耗費的時候取決于語法文件的規模)
* 想在分析過程中輸出豐富的調試信息,使用:yacc.parse(debug=1)
* yacc.yacc()方法會返回分析器對象,如果你想在一個程序中支持多個分析器:
~~~
p = yacc.yacc()
...
p.parse()
~~~
注意:yacc.parse()方法只綁定到最新創建的分析器對象上。
* 由于生成生成LALR分析表相對開銷較大,先前生成的分析表會被緩存和重用。判斷是否重新生成的依據是對所有的語法規則和優先級規則進行MD5校驗,只有不匹配時才會重新生成。生成分析表是合理有效的辦法,即使是面對上百個規則和狀態的語法。對于復雜的編程語言,像C語言,在一些慢的機器上生成分析表可能要花費30-60秒,請耐心。
* 由于LR分析過程是基于分析表的,分析器的性能很大程度上取決于語法的規模。最大的瓶頸可能是詞法分析器和語法規則的復雜度。
- 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 如何繼續