在高級的分析器程序中,你可能同時需要多個語法和詞法分析器。
依照規則行事不會有問題。不過,你需要小心確定所有東西都正確的綁定(hooked up)了。首先,保證將lex()和yacc()返回的對象保存起來:
~~~
lexer = lex.lex() # Return lexer object
parser = yacc.yacc() # Return parser object
~~~
接著,在解析時,確保給parse()方法一個正確的lexer引用:
~~~
parser.parse(text,lexer=lexer)
~~~
如果遺漏這一步,分析器會使用最新創建的lexer對象,這可能不是你希望的。
詞法器和語法器的方法中也可以訪問這些對象。在詞法器中,標記的lexer屬性指代的是當前觸發規則的詞法器對象:
~~~
def t_NUMBER(t):
r'\d+'
...
print t.lexer # Show lexer object
~~~
在語法器中,lexer和parser屬性指代的是對應的詞法器對象和語法器對象
~~~
def p_expr_plus(p):
'expr : expr PLUS expr'
...
print p.parser # Show parser object
print p.lexer # Show lexer object
~~~
如果有必要,lexer對象和parser對象都可以附加其他屬性。例如,你想要有不同的解析器狀態,可以為為parser對象附加更多的屬性,并在后面用到它們。
- 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 如何繼續