我是ANTLR的新手,我试着编写一个简单的解析器。我使用了一个有效的规则,但当我在' var'上运行带有-gui参数的TestRig(grun)时规则并输入:
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)?;
感谢您的反馈!
答案 0 :(得分:2)
ANTLR中的Lexer规则很贪婪。因此,规则STRING
:
STRING: ~('\r'|'\n'|'"')+;
消耗您的全部输入。
您需要做的是从value
解析器规则中删除双引号,并将它们包含在词法分析器规则中:
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];