ANTLR4留白引起的问题

本文关键字:问题 留白 ANTLR4 | 更新日期: 2023-09-27 18:15:16

我已经使用coor很长一段时间了,我想我应该看看ANTLR4。我使用的是c#版本的ANTLR4。我把语法的开头放在一起,发现它不起作用。经过大量的实验,我发现这个问题归结为空白的问题。下面是一个小语法来演示这个问题:

grammar AB;
/*
 * Parser Rules
 */
parse: ab;

ab: IDENT ( ',' IDENT )*;
/*
 * Lexer Rules
*/
IDENT: A_Z_ ( A_Z_ | DIGIT )*;
fragment A_Z_: [A-Z,a-z,_];
fragment DIGIT: [0-9];
WS: [ 't'r'n]+ -> skip;

当给出语法输入时,我得到:

A,B无语法错误

A, B无语法错误

A, B给出:Line: 1多余的输入'B'期待{,','}

A,B给出:Line: 1多余输入',B'期待{,','}

我可能在我对空白处理的理解中遗漏了一些东西,但我认为WS规则应该扔掉所有的空白,所以任何输入都相当于A,B输入。此外,如果我评论掉WS规则,也没有什么区别。就好像WS规则什么都没做。

ANTLR4留白引起的问题

问题是在您的IDENT规则中使用了逗号。

不做:

fragment A_Z_: [A-Z,a-z,_];

但是这样做:

fragment A_Z_: [A-Za-z_];