Parsing ANTLR将一行令牌作为单个令牌
我是ANTLR的新手,我试图编写一个简单的解析器。我使用了有效的规则,但当我在“var”规则上运行TestRig(grun)with-gui参数并输入以下内容时: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'|'.')*;
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];