【问题标题】:ANTLR: Lexer does not recognize tokenANTLR:Lexer 无法识别令牌
【发布时间】:2012-09-26 13:52:26
【问题描述】:

给定以下 Lexer 语法:

lexer grammar CodeTableLexer;

CodeTabHeader   : '[code table 1.0]';
Code            : 'code';
Table           : 'table';
End             : 'end';
Row             : 'row';
Naming          : 'naming';
Dfltlang        : 'dfltlang';
Language        : 'english' | 'german' | 'french' | 'italian' | 'spanish';
Null            : 'null';

Number
    : Int ('.' Digit*)?
    ;

Identifier
    : ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '$' | '.' | Digit)*
    ;

String
@after {
    setText(getText().substring(1, getText().length() - 1).replaceAll("\\\\(.)", "$1"));
}
    : '"' (~('"'))* '"'
    ;

Comment
    : '--' ~('\r' | '\n')* { skip(); }
    | '/*' .* '*/'         { skip(); }
    ;

Space
    : (' ' | '\t' | '\r' | '\n' | '\u000C') { skip(); }
    ;

fragment Int
    : '1'..'9'
    | '0'
    ;

fragment Digit
    : '0'..'9'
    ;

...下面的解析器语法:

parser grammar CodeTableParser;

parse
    : header^ begin (row)* end EOF
    ;

header
    : CodeTabHeader
    ;

begin
    : Code Table Identifier row
    ;

row
    : Row (Number | Identifier) value
    ;

value
    : (Identifier (Number | Identifier | String))+
        (Naming Dfltlang String (Language String)*)?
    ;

end
    : End Code Table
    ;

...最后是以下要解析的源:

[code table 1.0]

code table my_table
row 1
    id              "my_id_1"
    name            "my_name_1"
    descn           "my_description_1"
    naming
        dfltlang    "My description 1"
        english     "My description 1"
        german      "Meine Beschreibung 1"

row 2
    id              "my_id_2"
    name            "my_name_2"
    descn           "my_description_2"
    naming
        dfltlang    "My description 2"
        english     "My description 2"
        german      "Meine Beschreibung 2"

end code table

我总是收到错误消息

line 1:0 extraneous input '[code table 1.0]' expecting CodeTabHeader

我有点困惑……令牌 CodeTabHeader 在我的词法分析器中被定义为“[code table 1.0]”;我错过了什么吗?任何帮助将不胜感激。

谢谢, J3d

【问题讨论】:

  • 尝试更改CodeTabHeader : '[code table 1.0]';在 CodeTabHeader 上:'[代码表 1.0]\n';
  • @CAMOBAP,不,不可能。 \n 被词法分析器丢弃。

标签: antlr antlr3 lexer parser-generator


【解决方案1】:

如果您将词法分析器和解析器拆分为两个不同的文件,请在解析器的options-block 中明确指出它应该使用哪些标记:

options {
  tokenVocab=CodeTableLexer;
}

【讨论】:

  • 对不起...但是缺少的“表格”只是一个错字(我刚刚在我的帖子中修复了它)。不管怎样,原来的语法文件是正确的。您得到的错误是因为代码表名称是“my_table”,其中包含单词“table”(这是我的示例中的另一个问题:如果标识符包含保留字,则解析器会抱怨)。如果您将其重命名为“mystuff”,您将收到与我完全相同的错误消息。
  • Found... 如果我将词法分析器和解析器放在同一个文件中,一切正常;一旦我使用两个单独的文件(CodeTableLexer.g 和 CodeTableParser.g),我就会收到我在帖子中提到的错误。在处理单独的文件(一个用于词法分析器,另一个用于解析器)时,我应该注意什么?
  • 非常感谢!我还阅读了您的教程......很棒的工作 - 我认为这是最好的教程。再次感谢。
  • 有没有办法遍历生成的 StringTemplate?我需要做的是解析同一来源的两个不同版本并重新排列它们,以便公共部分在前,其余部分在最后。我在您的教程中看到了 walker 示例......但我想知道是否有更简单的方法来操作内存中的源。 [我正在尝试做的是一个旨在促进合并活动的工具]。
  • @j3d,抱歉,错过了您的评论。我对 StringTemplate 没有太多经验:最好为此创建一个单独的问题,并用antlrstringtemplate 标记它。祝你好运!
猜你喜欢
  • 1970-01-01
  • 2018-10-29
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多