我有一个想同时用于Java和C++目标的语法。因此,我不能在语法中使用任何语义谓词,因为它消除了目标语言的独立性。
我有-
expr : SOME_FUNCTION '(' INT, INT ')'
现在我需要添加一张支票
INT > 2
。如果此条件失败,如何从visitExpr()
引发错误?我看到词法分析器/解析器有错误侦听器,但没有访问者。
最佳答案
错误侦听器用于报告错误。默认情况下,有一个控制台侦听器,它仅将错误输出到控制台。这发生在解析(语法)阶段。通过添加自己的错误侦听器,您可以将错误信息收集到应用程序结构中以供以后处理。
在语法阶段之后是检查语法分析树以确定逻辑错误的语义阶段。但是,仍然可以使用上述错误信息结构在访问解析树时接收更多错误。无需抛出异常或类似的东西。您要做的就是收集更多错误并将其直接存储。
完成两个阶段后,您便可以使用错误结构可视化所有错误(编辑器中的红色下划线,错误 Pane 中的显示,等等)。
关于error-handling - Antlr4-如何报告访问者的语义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53877542/