簡體   English   中英

ANTLR Is將一行令牌作為單個令牌

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM