在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ 高級調(diào)試
高級調(diào)試
PLY 概要
前言和預備
如何繼續(xù)
Yacc
使用Python的優(yōu)化模式
語法分析基礎
Lex
多個語法和詞法分析器
介紹
序言

高級調(diào)試

調(diào)試一個編譯器不是件容易的事情。PLY 提供了一些高級的調(diào)試能力,這是通過 Python 的l ogging 模塊實現(xiàn)的,下面兩節(jié)介紹這一主題:

調(diào)試 lex() 和 yacc() 命令

lex() 和 yacc() 命令都有調(diào)試模式,可以通過 debug 標識實現(xiàn):

lex.lex(debug=True)
yacc.yacc(debug=True)

正常情況下,調(diào)試不僅輸出標準錯誤,對于 yacc(),還會給出 parser.out 文件。這些輸出可以通過提供 logging 對象來精細的控制。下面這個例子增加了對調(diào)試信息來源的輸出:

# 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,大量的調(diào)試信息可以通過分級來控制。典型的是將調(diào)試信息分為 DEBUG,INFO,或者 WARNING 三個級別。

PLY 的錯誤和警告信息通過日志接口提供,可以從 errorlog 參數(shù)中傳入日志對象

lex.lex(errorlog=log)
yacc.yacc(errorlog=log)

如果想完全過濾掉警告信息,你除了可以使用帶級別過濾功能的日志對象,也可以使用 lex 和 yacc 模塊都內(nèi)建的 Nulllogger 對象。例如:

yacc.yacc(errorlog=yacc.NullLogger())

運行時調(diào)試

為分析器指定 debug 選項,可以激活語法分析器的運行時調(diào)試功能。這個選項可以是整數(shù)(表示對調(diào)試功能是開還是關),也可以是 logger 對象。例如:

log = logging.getLogger()
parser.parse(input,debug=log)

如果傳入日志對象的話,你可以使用其級別過濾功能來控制內(nèi)容的輸出。INFO 級別用來產(chǎn)生歸約信息;DEBUG 級別會顯示分析棧的信息、移進的標記和其他詳細信息。ERROR 級別顯示分析過程中的錯誤相關信息。

對于每個復雜的問題,你應該用日志對象,以便輸出重定向到文件中,進而方便在執(zhí)行結(jié)束后檢查。