ANTLR和关键字/令牌

时间:2014-05-06 22:21:54

标签: antlr token keyword

我正在尝试在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也不能排名等。

这里的模式看起来并不那么有用,因为语法并不表示排名真的何时结束,所以在到达之后它不能弹出模式(考虑到它可能只是解析整个文件的一小部分)。

有没有解决方案?

1 个答案:

答案 0 :(得分:1)

移动

ID         : [a-zA-Z]+ ;

关键字规则后:)