2012-09-26 75 views
2

鉴于以下词法语法:ANTLR:词法不认令牌

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

+0

尝试改变_CodeTabHeader: '[code table 1.0]'_;在CodeTabHeader上:_'[code table 1.0] \ n'_; – CAMOBAP

+0

@CAMOBAP,不,那不可能。 '\ n'被词法分析器丢弃。 –

回答

0

如果拆分在两个不同的文件中的词法和语法分析器,明确指出在options - 阻塞解析器的令牌就应该使用:

options { 
    tokenVocab=CodeTableLexer; 
} 
+0

对不起...但缺少的“表”只是一个错字(我刚刚在我的文章中修复了它)。无论如何,原始语法文件是正确的。你得到的错误是因为代码表名是“my_table”,它包含单词“table”(这是我例子中的另一个问题:如果标识符包含保留字,则解析器抱怨)。如果您将其重命名为“mystuff”,您将得到与我一样的错误信息。 – j3d

+0

找到...如果我已经将词法分析器和解析器放入同一个文件中,那么一切正常;只要我使用两个单独的文件(CodeTableLexer.g和CodeTableParser.g),就会在我的帖子中看到我提到的错误。使用单独的文件(一个用于词法分析器,另一个用于解析器)有什么要注意的地方? – j3d

+0

@ j3d,看我编辑的答案。 –