t_error()函數用於處理檢測到非法字符時出現的lexing錯誤。我的問題是:我怎樣才能使用這個函數獲得更多關於錯誤的具體信息?類似錯誤類型,錯誤出現在哪個規則或段中,等等。詞法分析器錯誤處理PLY Python
回答
Ply在名爲cpp.py的文件中包含示例ANSI-C樣式詞法分析器。它有怎樣出t_error()中提取某些信息的示例:
def t_error(t):
t.type = t.value[0]
t.value = t.value[0]
t.lexer.skip(1)
return t
在此功能,您還可以訪問詞法分析器的公共屬性:
- LINENO - 當前行號
- lexpos - 輸入字符串中的當前位置
也有不列爲公開,但可以提供一些有用的診斷一些其他屬性:
- lexstate - 當前詞法狀態
- lexstatestack - 詞法分析器的棧規定
- lexstateinfo - 國家信息
- lexerrorf - 錯誤的規則(如果有的話)
一般情況下,只有提供給t_error()函數非常有限的信息。作爲輸入,它接收一個令牌對象,其中的值已被設置爲剩餘的輸入文本。該文本的分析完全取決於你。您可以使用t.lexer.skip(n)函數讓詞法分析器跳過一定數量的字符,這就是它。
除了輸入字符與任何已知標記的正則表達式不匹配之外,沒有「錯誤類型」的概念。由於詞法分析器與解析器分離,因此沒有直接的方法可以獲取有關解析引擎狀態的任何信息,或找出正在解析哪些語法規則。即使你可以獲得狀態(這將只是LALR狀態機的基本狀態號),但它的解釋可能會非常困難,因爲解析器可能處於匹配幾十個可能的語法規則的中間階段,尋找reduce動作。
我的建議如下:如果您需要t_error()函數中的其他信息,則應該設置某種在代碼的詞法分析器和分析器組件之間共享的對象。您應該明確地讓編譯器的不同部分根據需要更新該對象(例如,它可以根據特定的語法規則進行更新)。
正如一邊,對於壞的標記通常只有很少的行動路線。基本上,你得到的輸入文本不包含任何已知的語言字母部分(例如,沒有已知的符號)。因此,甚至沒有任何類型的標記值可以提供給解析器。通常情況下,唯一的行動方式是報告錯誤的輸入,並將其排除並繼續。
作爲Raymond答案的後續,我也不建議修改t_error()中的詞法分析器對象的任何屬性。
的確有PLY管理錯誤的方式,看看這個非常有趣的resentation:
http://www.slideshare.net/dabeaz/writing-parsers-and-compilers-with-ply
,並在章6.8.1的
- 1. 從解析器控制Python PLY詞法分析器狀態
- 2. 在詞法分析中處理錯誤
- 3. Python PLY語法分析器語法錯誤
- 4. 幾個詞法分析器與PLY的一個解析器?
- 5. PLY lex yacc:處理錯誤
- 6. Python PLY Yacc「語法錯誤」
- 7. 如何爲手寫詞法分析器編寫PLY界面?
- 8. PLY的詞法分析器是否支持「maximal munch」?
- 9. 錯誤編譯flex(詞法分析器)
- 10. 重複的詞法分析器,錯誤分段錯誤
- 11. ANTLRv4錯誤後重置詞法分析器和解析器
- 12. 解析器/詞法分析器規則的Antlr v3錯誤
- 13. 解析python與PLY
- 14. 詞法分析器
- 15. 如何處理語法分析器錯誤
- 16. 如何編寫Python詞法分析器?
- 17. C python中的詞法分析器
- 18. Python中的詞法分析器
- 19. ANTLR:如何用python生成詞法分析器和分析器?
- 20. ocaml分析器和詞法分析器
- 21. ANTLR詞法分析器中的特殊字符處理
- 22. 詞法分析器來處理與行號前綴線
- 23. 如何處理/轉義Python FLEX詞法分析器中的註釋?
- 24. 報告解析錯誤從PLY到解析器的調用者
- 25. 使用python和Ply解析器生成器時出錯
- 26. 是否有用PLY編寫的Python(或子集)的語法或詞法分析器?
- 27. PLY區分語法
- 28. 詞法分析
- 29. 錯誤處理python
- 30. 「Ad Hoc」詞法分析器