C# 如何告诉C语言中的ANTLR4解析器如何处理解析器错误?

C# 如何告诉C语言中的ANTLR4解析器如何处理解析器错误?,c#,antlr4,C#,Antlr4,我正在使用ANTLR4,C#Target对数据结构执行有效性检查。 基本上,我已经创建了一个EBNF语法来描述某些元素中允许出现的序列。 文件本身确实包含很多元素,我使用ANTLR检查单个操作中的每个元素(它们是不同的、独立的和不同的元素,因此我无法切实地解析整个文件)。 通常,我可以有一个包含大约5000个元素的文件,其中大约1000个元素是无效的 在我的机器上使用ANTLR从文件中提取单个元素只需要大约半秒钟,但是当我尝试检查每个元素时,我从生成的解析器中抛出了很多NoviableExcep

我正在使用ANTLR4,C#Target对数据结构执行有效性检查。 基本上,我已经创建了一个EBNF语法来描述某些元素中允许出现的序列。 文件本身确实包含很多元素,我使用ANTLR检查单个操作中的每个元素(它们是不同的、独立的和不同的元素,因此我无法切实地解析整个文件)。 通常,我可以有一个包含大约5000个元素的文件,其中大约1000个元素是无效的

在我的机器上使用ANTLR从文件中提取单个元素只需要大约半秒钟,但是当我尝试检查每个元素时,我从生成的解析器中抛出了很多NoviableException或RecognitionException,它们会导致性能大幅下降。一个没有任何无效对象的文件可以在不到一秒钟的时间内解析,但是当我有大约1000个错误时,可能需要一分钟的时间

基本上,我只想让ANTLR告诉我输入是否与给定的规则匹配,如果不匹配,我想让ANTLR只报告错误,中止解析过程(因为我只想得到正确或错误的答案),而不抛出异常

我已经修改了BaseErrorListener、DefaultErrorStrategy和解析器本身的重写/继承,并在某种程度上改变了生成的解析器的行为,但我还有一个问题:

自动生成的文件本身获取以下行:

默认值:
抛出新的NoviableException(此);
有没有办法告诉ANTLR4如何处理自动生成的代码中的错误,因为重写框架类无法解决这个问题


谢谢

有多种方法可以控制错误的处理方式,但从这个问题上还不清楚您希望如何处理错误。如果您添加这些信息,我可能会提出解决方案。你好,山姆,谢谢您的回复。理想情况下,解析器会在遇到错误时立即停止解析。我只需要解析器告诉我它是否遇到了一个规则(以及它的哪个子规则)。对于解析器,这是可能的吗?你能为此提出一个问题吗?否则我可能会忘记回来回答这个问题。是的,我将在github上对此提交一个问题。更简单地说:我想根据EBNF描述验证给定的项目安排。现在,我只是依靠lexer“解决”了它,这意味着,我将只为输入生成一个令牌流,并将我的EBNF序列指定为lexer规则。在下一步中,我可以检查是否找到令牌,然后检查令牌名称。这确实允许我执行真/假检查,但是当结果为负数时,我没有得到任何信息。我知道这是ANTLR的一个非常特殊(可能不常见)的用法,但是这个解决方法现在对我来说很有效。我不会将此作为答案发布,因为这不是我最初问题的真正解决方案。