[英]ANTLR Is takes one line of tokens as a single token
我是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)?;
感謝您的反饋!
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];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.