ANTLR4:正确匹配公共前缀

时间:2014-11-25 15:04:25

标签: antlr4

我有以下ANTLR4语法:

grammar test;

start_symbol: '(FILE' line* ')' EOF ;
line: '(' ID ')' ;
ID: [a-zA-Z_] [a-zA-Z0-9_]* ;
White_space : [ \t\n\r]+ -> skip ;

...它完全适用于此示例输入文件:

(FILE
  (LINE)
)

但我也希望它可以继续:

(FILE
  (FILELINE)
)

这不起作用。显然,词法分析器生成了一个隐含的'(FILE'标记,它也会匹配第二行中的'(FILELINE'),这会导致错误。

我该如何解决这个问题?

奖金:我也想解析一下:

(FILE
  (FILE)
)

谢谢:)

1 个答案:

答案 0 :(得分:0)

这样的事情可以做到:

start  : '(' FILE line* ')' EOF;
line   : '(' id ')';
id     : ID | FILE;

FILE  : 'FILE';
ID    : [a-zA-Z_] [a-zA-Z0-9_]*;
SPACE : [ \t\n\r]+ -> skip;