C# ANTLR4空白导致问题

C# ANTLR4空白导致问题,c#,whitespace,grammar,antlr4,C#,Whitespace,Grammar,Antlr4,我已经使用CoCoR很长一段时间了,我想我应该看看ANTLR4。我使用的是ANTLR4的C版本。我把语法的开头放在一起,发现它不起作用。经过大量的实验,我发现问题最终归结为空白的问题。下面是一个小语法来演示这个问题: grammar AB; /* * Parser Rules */ parse: ab; ab: IDENT ( ',' IDENT )*; /* * Lexer Rules */ IDENT: A_Z_ ( A_Z_ | DIGIT )*; fragment A_

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

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-rule什么也没做一样。

问题在于,您的标识规则中使用了逗号

不要做:

fragment A_Z_: [A-Z,a-z,_];
但要这样做:

fragment A_Z_: [A-Za-z_];

非常感谢。令人惊讶的是一个人怎么能看啊看啊看啊看啊看啊看啊看啊看啊看啊看不见。我似乎把它们作为逗号分隔的条目输入,尽管我知道没有逗号。