我使用ANTLR4,C#-Target来对数据结构进行有效性检查。 基本上,我已经创建了一个EBNF语法,描述了某些元素中允许的出现顺序。 文件本身确实包含很多元素,我使用ANTLR检查单个操作的每个元素(它们是不同的,独立的和不同的元素,因此我无法解析整个文件)。 通常情况下,我可能有一个包含大约5000个元素的文件,其中大约1000个是无效的。
在我的机器上使用ANTLR从文件中提取单个元素只需要大约半秒钟,但是当我尝试检查每个元素时,我会从生成的解析器中抛出很多NoViableAltExceptions或RecognitionException,并且导致性能大幅下降。没有任何无效对象的文件可以在一秒钟内解析,但是当我有大约1000个错误时,可能需要一分钟。
基本上,我只是希望ANTLR告诉我输入是否与给定规则匹配,如果没有,我希望ANTLR只报告错误,中止解析过程(因为我只想要一个真或假的答案)而不是抛出例外。
我已经使用了BaseErrorListener,DefaultErrorStrategy和Parser本身的覆盖/继承,并且有点能够改变生成的解析器的行为,但我还有一个问题:
自动生成的文件本身得到以下行:
default:
throw new NoViableAltException(this);
有没有办法告诉ANTLR4如何处理自动生成的代码中的错误,因为重写框架类不能解决这个问题?
谢谢!