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

时间:2014-09-24 18:05:58

标签: parsing antlr token antlr4 lexer

我是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)?;

感谢您的反馈!

1 个答案:

答案 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];