我目前正在尝试临时修改/修复别人创建的现有语法。
我们有自己的语言,我们为此创建了一个编辑器。我们正在使用Eclipse IDE。
一些语法示例,例如
calc : choice INTEGER INTEGER
choice : add|sub|div|mul
INTEGER : ('0'..'9')+
因此在我的编辑器中,如果我输入
calc add 2 aaa
因此,antlr的错误解析器将其识别为错误,因为它需要一个整数,因此我们键入了字符串并抛出了错误消息,例如
extraneous input 'aaa' expecting {'{', INTEGER}"
(我的课程扩展了BaseErrorListener,在其中我为这些错误创建了标记)
类似地,我为我的编辑器定义了这样的语法。
现在的问题是:对于所有这一切,它可以识别出语法中的某些错误并引发错误,但是对于不属于语法的语法(如
),该怎么办呢?如果我键入任何垃圾值,例如
abc add 2 3
或
just_type_junk_in_editor
由于‘abc’
或‘just_type_junk_in_editor‘
不在我的语法中,因此不会引发任何错误
对于不属于语法的关键字,有一种方法可以将antlr的错误解析器解析为错误。
答案 0 :(得分:0)
在没有看完整语法的情况下,我认为您的问题是主规则中缺少EOF令牌。 ANTLR4会尽可能多地消耗输入,但是如果至少在主规则中不匹配任何内容,它将忽略其余部分,这说明了为什么看不到错误。通过添加EOF,您可以告诉ANTLR4所有输入必须匹配:
MID