Java ANTLR4如何进行否定连词

Java ANTLR4如何进行否定连词,java,antlr4,Java,Antlr4,首先,我对antlr4、DSL和EBNF完全陌生,所以可能是这样,我没有以正确的方式使用antlr4,但目前我还不知道我要做的事情还有什么替代方法。这是: 我想有一个规则,它应该由三个大写字母组成,但不允许因此而有一个保留字符串 例如: parse:三个大写字母 三大写:大写 上:[A-Z] 我想避免三个大写匹配“ABC”和“DEF”(允许使用BCA、CAB、BAC、FED、EDF等)。有办法做到这一点吗 您不应该在解析器规则中匹配这些标记。将其设置为lexer规则,并将其放置在与关键字匹配的规

首先,我对antlr4、DSL和EBNF完全陌生,所以可能是这样,我没有以正确的方式使用antlr4,但目前我还不知道我要做的事情还有什么替代方法。这是:

我想有一个规则,它应该由三个大写字母组成,但不允许因此而有一个保留字符串

例如:

parse:三个大写字母

三大写:大写

上:[A-Z]


我想避免三个大写匹配“ABC”和“DEF”(允许使用BCA、CAB、BAC、FED、EDF等)。有办法做到这一点吗

您不应该在解析器规则中匹配这些标记。将其设置为lexer规则,并将其放置在与关键字匹配的规则之后,应生成适当的标记:

KEYWORD          : 'ABC' | 'DEF';
THREE_UPPER_CASE : [A-Z] [A-Z] [A-Z];
或:


我本以为会有类似于(ABC-DEF)的东西,但在将我的语法重新安排到这个结构之后,您的解决方案似乎适合我。我真的不明白为什么会这样,但是谢谢你的快速回复@user3041315,否定,无论是在解析器规则还是lexer规则中,都只能在集合(包含单个字符或标记)上使用。不可能尝试对两个或多个标记(如
~(ABC DEF)
(或超过1个字符)求反。您还必须认识到,lexer不是由解析器驱动的:无论解析器在特定时间“需要”什么,lexer都只是根据自己的规则优先级构造令牌。更多信息:和:
K_ABC            : 'ABC';
K_DEF            : 'DEF';
THREE_UPPER_CASE : [A-Z] [A-Z] [A-Z];