【问题标题】:ANTLR Is takes one line of tokens as a single tokenANTLR Is 将一行标记作为单个标记
【发布时间】:2014-09-24 18:05:57
【问题描述】:

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

感谢您的反馈!

【问题讨论】:

    标签: parsing antlr token antlr4 lexer


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-18
      相关资源
      最近更新 更多