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

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

高級(jí)調(diào)試

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

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

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

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

正常情況下,調(diào)試不僅輸出標(biāo)準(zhǔn)錯(cuò)誤,對(duì)于 yacc(),還會(huì)給出 parser.out 文件。這些輸出可以通過提供 logging 對(duì)象來精細(xì)的控制。下面這個(gè)例子增加了對(duì)調(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)

如果你提供一個(gè)自定義的 logger,大量的調(diào)試信息可以通過分級(jí)來控制。典型的是將調(diào)試信息分為 DEBUG,INFO,或者 WARNING 三個(gè)級(jí)別。

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

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

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

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

運(yùn)行時(shí)調(diào)試

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

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

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

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