antlrworks中Lexer.java的specialStateTransition(int s,IntStream _input)方法中的代码太大

时间:2013-02-16 08:43:17

标签: antlr3 antlrworks

我是Antlrworks的新手。我正在编写组合语法文件来解析XML文件。 XML文件非常庞大和复杂。

语法中定义了许多词法规则。 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'是lexer语法,它有一些原始组合语法的词法规则。

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

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

非常感谢任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:1)

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

谢谢!