我已经使用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规则什么都不做。
答案 0 :(得分:1)
问题是您的IDENT规则中使用了逗号。
不要这样做:
fragment A_Z_: [A-Z,a-z,_];
但请改为:
fragment A_Z_: [A-Za-z_];