Parsing ANTLR将一行令牌作为单个令牌

Parsing ANTLR将一行令牌作为单个令牌,parsing,antlr,token,antlr4,lexer,Parsing,Antlr,Token,Antlr4,Lexer,我是ANTLR的新手,我试图编写一个简单的解析器。我使用了有效的规则,但当我在“var”规则上运行TestRig(grun)with-gui参数并输入以下内容时: var myVar = 13 调试器告诉我:行1:0不匹配的输入'var myVar=13'应为'var' 我弄不懂它有什么毛病。。 代码如下: grammar Leaf; WS: (' '|'\t'|'\n'|'\r')+ -> skip; NUM: ('0'..'9') ('0'..'9'|'.')*;

我是ANTLR的新手,我试图编写一个简单的解析器。我使用了有效的规则,但当我在“var”规则上运行TestRig(grun)with-gui参数并输入以下内容时:

var myVar = 13
调试器告诉我:行1:0不匹配的输入'var myVar=13'应为'var'

我弄不懂它有什么毛病。。 代码如下:

grammar Leaf;

WS:     (' '|'\t'|'\n'|'\r')+ -> skip;

NUM:    ('0'..'9') ('0'..'9'|'.')*;
CHAR:   ('a'..'z'|'A'..'Z');

ID:     CHAR (CHAR|NUM)*;

BOOL:   ('true'|'false');

STRING: ~('\r'|'\n'|'"')+;

type:   'int'|'byte'|'float'|'double'|'decimal'|'char'|'bool'|'tuple'|'string'|'type';
value:  NUM|BOOL|('[' (value ',')+ ']')|('\'' CHAR '\'')|('"' STRING '"')|('(' (type ',')+ ')')|type;

var:    'var' ID('[]')? (':' type)? '=' (type|value)?;

感谢您的反馈

ANTLR中的Lexer规则是贪婪的。因此,规则
字符串

STRING: ~('\r'|'\n'|'"')+;
消耗您的全部输入

您需要做的是从
解析器规则中删除双引号,并将它们包括在lexer规则中:

grammar Leaf;

var
 : 'var' ID ('[' ']')? (':' type)? '=' (type | value)?
 ;

value
 : NUM
 | BOOL
 | '[' value (',' value)* ']'
 | CHAR
 | STRING
 | '(' type (',' type)* ')'
 | type
 ;

type
 : 'int'
 | 'byte'
 | 'float'
 | 'double'
 | 'decimal'
 | 'char'
 | 'bool'
 | 'tuple'
 | 'string'
 | 'type'
 ;

WS     : (' '|'\t'|'\n'|'\r')+ -> skip;

BOOL   : ('true' | 'false');

NUM    : DIGIT+ ('.' DIGIT*)?;

STRING : '"' ~('\r'|'\n'|'"')* '"';

CHAR   : '\'' LETTER '\'';

ID     : LETTER (LETTER | DIGIT)*;

fragment LETTER : [a-zA-Z];
fragment DIGIT  : [0-9];