我通过ANTLR4解析文件。我正在为所有可能的关键词编写语法。所以,我想记录总数。输入文件中存在的行数和总数。成功解析的行,以便我能够记录正在解析的文件的整体百分比,并且我还想记录我还没准备好语法的剩余关键字。我的问题是是否可以这样做?如果可能,我想知道如何以编程方式执行此操作? 我相信我们必须在我的案例访问者中记录访问者/听众,但我无法提出任何逻辑。
答案 0 :(得分:0)
ANTLR4尝试解析整个文件,如果发生错误则恢复。因此,在大多数情况下,每行都会被解析 - 即使在解析过程中发生错误。问题是:您想要显示的是什么号码?
您可能对第一个错误的行感兴趣。您可以通过在Parser类上使用Parser.setErrorHandler
设置ErrorHandler来完成此操作。必须实现ANTLRErrorStrategy
,使用包含错误位置的reportError
调用方法RecognitionException
。 获取此错误的行并减去一行以查找没有错误的行。
如果您只想跳过有错误的行,则策略是相同的。而不是显示第一个错误,计算具有错误的不同行,并从所有行的数量中减去它们以获得可解析行的数量(这是启发式的,有时错误是稍后恢复的行,比这个启发式失败了。)
最好不要尝试与访客/听众一起做。错误恢复有时可能导致修剪的解析树而不是包含错误节点的解析树。如果你想快速失败,则不需要遍历解析树。