2013-02-16 32 views
0

我是Antlrworks的新手。我正在编写组合语法文件来解析XML文件。 XML文件非常大且很复杂。antlrworks中的Lexer.java的specialStateTransition(int s,IntStream _input)方法中的代码太大了

在语法中定义了许多词法分析器规则。 Antlrworks 1.4.3正在生成代码没有任何问题。但是,当我调试使用它的代码正在生成以下错误。

[13:29:42] D:\Antlr\Grammer Files\output\OrigionalSampleCDFXMLLexer.java:6472: code too large 
[13:29:42]   public int specialStateTransition(int s, IntStream _input) throws NoViableAltException { 
[13:29:42]     ^
[13:29:42] 1 error. 

下面是我的语法合并文件中定义的词法规则:

DATEFORMATE : DIGIT DIGIT DIGIT DIGIT '-' DIGIT DIGIT '-' DIGIT DIGIT; 

TIMEFORMATE : 'T' (DIGIT DIGIT ':' DIGIT DIGIT ':' DIGIT DIGIT); 

CATEGORY_SW_CS_COLLECTION :  'FEATURE' | 'COLLECTION'; // These are fixed 


CATEGORY_SW_INSTANCE : 'VALUE' | 'DEPENDENT_VALUE' | 'BOOLEAN' |'ASCII' | 'VAL_BLK' | 'CURVE' | 
        'MAP' | 'STRUCTURE' | 'UNION' | 
        'VALUE_ARRAY' | 'CURVE_ARRAY' |'MAP_ARRAY' | 'STRUCTURE_ARRAY'; 

CATEGORY_SW_AXIS_CONT :  'FIX_AXIS' | 'STD_AXIS' ; 

CATEGORY_COMMON_IN_AXIS_INSTANCE 
    : 'CURVE_AXIS' |'RES_AXIS' | 'COM_AXIS' ; 

CATEGORY_SW_INSTANCE_TREE : 'VCD' | 'NO_VCD' ; 

CATEGORY_MSRSW : 'CDF20' ; 

FLAG_VALUES 
    : 'TRUE' | 'FALSE'; 

ATTR_EQ : {tagMode}? => '=' ; 

PCDATA : {!tagMode}? => (~'<')* ; 

//NMTOKENS: {tagMode}? => ('\"' (NMTOKEN ' ')* '\"' | '\''(NMTOKEN ' ')* '\'') ; 

NMTOKEN : {tagMode}? => ('\"' NMTOKEN_CHAR* '\"' | '\''NMTOKEN_CHAR* '\''); 


ID : {tagMode}? => ('\"' LETTER (LETTER | DIGIT | '_')* '\"' 
       | '\'' LETTER (LETTER | DIGIT | '_')* '\'' 
       ) 
      ; 

CDATA : 
     {tagMode}? => ('\"' (~('\"\'&<>'))* '\"' 
     | '\'' (~('\"\'&<>'))* '\'' 
     ) 
    ; 


TAG_START_OPEN : '<' {tagMode = true;}; 

TAG_END_OPEN : '</' {tagMode = true;}; 

TAG_CLOSE : {tagMode}? => '>' {tagMode = false;}; 

TAG_EMPTY_CLOSE : {tagMode}? => '/>' {tagMode = false;}; 

fragment NMTOKEN_CHAR: (LETTER | DIGIT | '_' | '-' | '.' | ':'); 

fragment LETTER : 'A'..'Z' | 'a'..'z' | 'ü'; 

//fragment Exponent : ('e'|'E') ('+'|'-')? (DIGIT)+ ; 

fragment DIGIT : '0'..'9'; 

WS : {tagMode}? => (' ' | '\t'| '\r' | '\n')+ {$channel=99;} ; 

和关闭过程我都在同一个文件;-)语法规则。

通过用'*'替换大多数'+'来纠正词法分析规则并不行。

词法分析器规则有问题吗?

另一个问题:

尝试将部分从合并语法文件中的词法规则,另一条词法语法文件。在这种情况下,将词法分析器语法导入组合语法就成了问题。它说'Lexer文件名'是未定义的修复想法'创建语法文件'。

grammar SampleCDFXML; 

options { 
language = Java; 
output=AST; 
tokenVocab=XMLBaseLexer; 

} 

import XMLBaseLexer ; // Here it says undefined import "XMLBaseLexer" 

'XMLBaseLexer'是词法分析器语法,它有一些来自原始组合语法的词法分析器规则。

我在许多网站搜索导入问题,但没有得到答案。

请有人提出解决问题的想法。

任何帮助,非常感谢。

谢谢!

+0

嗨巴特,我不知道我应该问这个问题。你有什么想法,为什么你的回答和我们的意见在这里消失了? – Pan 2013-02-19 05:56:51

回答

1

有一些更新。如果我在Antlrworks2中运行相同的组合语法,它就可以工作。 为了使它在Antlrworks2上可运行,需要进行一些语法修改。例如:{$channel=99;}将被替换为->channel(99)

谢谢!