當語法錯誤發生時,是否有已知方法生成「預期代幣」列表?我使用檸檬作爲解析器生成器。使用檸檬分析器生成器的「預期代幣」
5
A
回答
9
這似乎工作:
%syntax_error {
int n = sizeof(yyTokenName)/sizeof(yyTokenName[0]);
for (int i = 0; i < n; ++i) {
int a = yy_find_shift_action(yypParser, (YYCODETYPE)i);
if (a < YYNSTATE + YYNRULE) {
printf("possible token: %s\n", yyTokenName[i]);
}
}
}
它會嘗試所有可能的令牌,並打印那些適用於當前的解析器的狀態。
請注意,當不正確的令牌到來時,解析器不會立即調用syntax_error,但會嘗試減少堆棧上的內容,希望該令牌可以在之後進行移位。只有當沒有其他東西可以減少並且當前令牌不能移動時,解析器纔會調用syntax_error。這種減少會改變語法分析器的狀態,這意味着您可能會看到更少的令牌比減少之前的適用值更小。儘管錯誤報告應該足夠了。
1
沒有直接的方法可以在檸檬中生成這樣的列表。但是您可以嘗試使用Lemon工具的調試輸出以及生成的解析器的調試跟蹤來執行此操作。在調用ParseTrace函數後,生成的解析器將打印出Shifts和Reduce列表,並將其應用於輸入流。語法錯誤之前的最後一個Shift包含錯誤之前的當前狀態的編號。在* .out文件中爲您的解析器查找此狀態,並查看它的預期記號列表。
相關問題
- 1. 從檸檬語法分析器生成器生成LR分析表
- 2. 檸檬分析器解析0令牌
- 3. Flex和檸檬解析器
- 4. 檸檬解析器生成器:非終端不被評估?
- 5. 使用檸檬分析器和自定義令牌值
- 6. 在檸檬分析器中使用變量?
- 7. 使用檸檬解析器(LALR)生成一個調用器,如何從表達式中獲取參數
- 8. 檸檬LALR解析器的簡單語法
- 9. 檸檬解析器LALR(1)還是SLR(1)?
- 10. 使用STL容器,檸檬圖形庫初始化圖形
- 11. 使用Dijkstra算法和檸檬圖庫
- 12. 使用檸檬(和核心基金會)解析JSON
- 13. 如何處理用於兩件事情的相同符號檸檬解析器
- 14. 檸檬水消費量預測 - 哪種機器學習方法最適合?
- 15. 來自Omnet ++網絡的檸檬圖
- 16. 檸檬圖形遍歷邊緣
- 17. 檸檬圖庫C++ - 定向圖
- 18. CMake:包含檸檬圖書館
- 19. 檸檬語法問題(優先級?)
- 20. 使用Rcpp的R上的檸檬圖庫
- 21. 在解析(檸檬)中恢復錯誤標記
- 22. 檸檬圖庫C++ - 使用循環的addNode
- 23. ANTLR:如何用python生成詞法分析器和分析器?
- 24. ANTLR的解析器不產生所有預期的代碼
- 25. Univocity分析器 - 迭代器生成scala案例類的方式
- 26. Python3語法分析器生成器
- 27. 如何在Omnet ++項目上使用檸檬圖庫?
- 28. Common Lisp的詞法分析器和解析器生成器
- 29. 預期':'在'之前'。'代幣
- 30. CPython使用什麼分析器生成器?
正是我所要求的!但是,您忘記了'yypParser'作爲yy_find_shift_action的第一個參數:) – 2012-10-30 15:58:13