lex()和yacc()命令都有調試模式,可以通過debug標識實現:
~~~
lex.lex(debug=True)
yacc.yacc(debug=True)
~~~
正常情況下,調試不僅輸出標準錯誤,對于yacc(),還會給出parser.out文件。這些輸出可以通過提供logging對象來精細的控制。下面這個例子增加了對調試信息來源的輸出:
~~~
# Set up a logging object
import logging
logging.basicConfig(
level = logging.DEBUG,
filename = "parselog.txt",
filemode = "w",
format = "%(filename)10s:%(lineno)4d:%(message)s"
)
log = logging.getLogger()
lex.lex(debug=True,debuglog=log)
yacc.yacc(debug=True,debuglog=log)
~~~
如果你提供一個自定義的logger,大量的調試信息可以通過分級來控制。典型的是將調試信息分為DEBUG,INFO,或者WARNING三個級別。
PLY的錯誤和警告信息通過日志接口提供,可以從errorlog參數中傳入日志對象
~~~
lex.lex(errorlog=log)
yacc.yacc(errorlog=log)
~~~
如果想完全過濾掉警告信息,你除了可以使用帶級別過濾功能的日志對象,也可以使用lex和yacc模塊都內建的Nulllogger對象。例如:
~~~
yacc.yacc(errorlog=yacc.NullLogger())
~~~
- 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 如何繼續