0

我是 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' 是词法分析器语法,它具有原始组合语法中的一些词法分析器规则。

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

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

很感谢任何形式的帮助。

谢谢!

4

1 回答 1

1

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

谢谢!!

于 2013-02-19T14:53:31.687 回答