我正在尝试在ANTLR4中编写一个简单的语法并将其用于我的项目,但我无法解决这个问题。我们说我得到了语法:
parser grammar GrammarParser;
ranks : RANKS COLON entry* ;
entry : rank who SEMICOLON ;
rank : RANK_HIGH | RANK_LOW ;
who : ID ;
lexer grammar GrammarLexer;
RANKS : 'ranks' ;
RANK_HIGH : 'high' ;
RANK_LOW : 'low' ;
ID : [a-zA-Z]+ ;
COLON : ':' ;
SEMICOLON : ';' ;
WS : [ \t\r\n]+ -> skip ;
问题在于,使用这些语法,这个简单的例子摧毁了整个想法:
ranks: low ranks; high high; ranks ranks;
首先,词法分析器会为它返回以下标记流:
RANKS COLON ID RANKS SEMICOLON ID ID SEMICOLON RANKS RANKS SEMICOLON
显示问题。 RANKS应该只是一个起始点的关键字 - 而是它遍及我定义的地方(至少在规则中)RANKS和ID应该是(第一和第三个条目)。类似地,由于RANKS在其他任何事情之前被定义,词法分析器在RANK_HIGH / RANK_LOW / ID之前选择(当它和任何一个匹配来自流的相同符号序列时)。类似地,ID超过RANK_HIGH / RANK_LOW。
总而言之,我可以使用'排名'无处不在,但它总是被用作RANKS,我不能使用' high' low',因为它们将始终被识别为ID。此外,由于优先级原因,ID也不能排名等。
这里的模式看起来并不那么有用,因为语法并不表示排名真的何时结束,所以在到达之后它不能弹出模式(考虑到它可能只是解析整个文件的一小部分)。
有没有解决方案?
答案 0 :(得分:1)
移动
ID : [a-zA-Z]+ ;
关键字规则后:)