ANTLR4空白区导致问题

时间:2014-07-27 04:23:03

标签: c# whitespace grammar antlr4

我已经使用CoCoR很长一段时间了,我想我会看看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给:行:1个无关输入' B'期待{,','}

A,B给:行:1个无关输入',B'期待{,','}

我可能在我对白色空间处理的理解中遗漏了一些东西,但我认为WS规则应该扔掉所有白色空间,所以任何输入都等同于A,B输入有效。另外,如果我注释掉WS规则,它就没有区别。好像WS规则什么都不做。

1 个答案:

答案 0 :(得分:1)

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

不要这样做:

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

但请改为:

fragment A_Z_: [A-Za-z_];