ANTLR4 规则优先级
ANTLR4 rules priority
我正在尝试使用 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
。
比如我得到的解析树是这样的
.
我想要实现的是这样的
如何在 ANTLR4 上赋予一个表达式比另一个表达式更高的优先级?有关解决此问题的任何提示吗?
请注意,虽然这个语法非常简单,而且 ANTLR4 在这里似乎没有必要,但我想要制作的真正语法更复杂,我只是在这里简化它来演示我的问题。
感谢您的宝贵时间!
您没有明确的空格规则,并且您在 WORD 规则中包含了空格。然而你想要用空格分隔单词。那行不通。不要在单词中包含空格(无论如何这都违反单词的通常含义)。而是准确地指定一个词的真正含义(通常是字母和数字的组合,而不是以字母开头)。此外,我将重组语法,使 positive
和 negative
不是 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+;
这会为您提供此解析树供您输入:
我正在尝试使用 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
。
比如我得到的解析树是这样的
我想要实现的是这样的
如何在 ANTLR4 上赋予一个表达式比另一个表达式更高的优先级?有关解决此问题的任何提示吗?
请注意,虽然这个语法非常简单,而且 ANTLR4 在这里似乎没有必要,但我想要制作的真正语法更复杂,我只是在这里简化它来演示我的问题。
感谢您的宝贵时间!
您没有明确的空格规则,并且您在 WORD 规则中包含了空格。然而你想要用空格分隔单词。那行不通。不要在单词中包含空格(无论如何这都违反单词的通常含义)。而是准确地指定一个词的真正含义(通常是字母和数字的组合,而不是以字母开头)。此外,我将重组语法,使 positive
和 negative
不是 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+;
这会为您提供此解析树供您输入: