ANTLR4规则优先级

时间:2018-11-30 09:20:33

标签: antlr4

我正在尝试使用ANTLR4获得一个简单的语法。基本上是由;分隔的关键字列表,可以使用Not否定关键字。像这样的东西,例如:

Not negative keyword;positive

我写了以下语法:

grammar input;

input               : clauses;
keyword             : NOT? WORD;
clauses             : keyword (SEPARATOR clauses)?;

fragment N          : ('N'|'n') ;
fragment O          : ('O'|'o') ;
fragment T          : ('T'|'t') ;
fragment SPACE      : ' ' ;

SEPARATOR           : ';';
NOT                 : N O T SPACE;
WORD                : ~[;]+;

我的问题是,在keyword规则中,WORD似乎比NOT具有更高的优先级。 Not something被识别为Not something单词,而不是否定的something

例如,我得到的解析树就是这个

this

我想要达到的目标是这样的

like this

如何在ANTLR4上给表达式赋予更高的优先级?有什么技巧可以解决这个问题吗?

请注意,尽管此语法非常简单,并且在这里ANTLR4似乎没有必要,但我想制作的真实语法更加复杂,在这里我只是对其进行了简化以说明我的问题。

谢谢您的时间!

1 个答案:

答案 0 :(得分:0)

您没有明确的空格规则,并且在WORD规则中包括了空格。但是,您希望单词之间用空格分隔。那行不通。不要在单词中包含空格(无论如何这与单词的通常含义背道而驰)。相反,请确切说明一个单词的真正含义(通常是字母和数字的组合,而不是字母开头)。另外,我将重组语法,以使positivenegative不是keyword的一部分,而是单独的实体。在这里,我将它们定义为自己的关键字,但是如果那不是您想要的,只需将其替换为WORD

grammar input;

input               : clauses EOF;
keyword             : NOT? (POSITIVE | NEGATIVE) WORD?;
clauses             : keyword (SEPARATOR keyword)*;

fragment A: [aA];
fragment B: [bB];
fragment C: [cC];
fragment D: [dD];
fragment E: [eE];
fragment F: [fF];
fragment G: [gG];
fragment H: [hH];
fragment I: [iI];
fragment J: [jJ];
fragment K: [kK];
fragment L: [lL];
fragment M: [mM];
fragment N: [nN];
fragment O: [oO];
fragment P: [pP];
fragment Q: [qQ];
fragment R: [rR];
fragment S: [sS];
fragment T: [tT];
fragment U: [uU];
fragment V: [vV];
fragment W: [wW];
fragment X: [xX];
fragment Y: [yY];
fragment Z: [zZ];

SEPARATOR : ';';
NOT       : N O T;
POSITIVE  : P O S I T I V E;
NEGATIVE  : N E G A T I V E;

fragment LETTER: DIGIT | LETTER_NO_DIGIT;
fragment LETTER_NO_DIGIT: [a-zA-Z_$\u0080-\uffff];
WORD: LETTER_NO_DIGIT LETTER*;
WHITESPACE: [ \t\f\r\n] -> channel(HIDDEN);
fragment DIGIT:    [0-9];
fragment DIGITS: DIGIT+;

为您的输入提供此解析树:

enter image description here