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;} ;

もちろん、同じファイルにパーサー規則があります;-)。

「+」の大部分を「*」に置き換えてレクサー規則を修正しても機能しませんでした。

レクサー規則に何か問題がありますか????

別の質問:

レクサー規則の一部を結合文法ファイルから別のレクサー文法ファイルに移動しようとしました。この場合、レクサー文法を複合文法にインポートすると問題が発生します。「文法ファイルを作成する」という修正案で「レクサーファイル名」が未定義であると表示されます。

grammar SampleCDFXML;

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

}

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

「XMLBaseLexer」は、オリジナルの複合文法の字句解析規則の一部を持つ字句解析文法です。

多くの Web サイトでインポートの問題を検索しましたが、回答がありませんでした。

誰か問題を解決するためのアイデアをください。

どんな助けでも大歓迎です。

ありがとうございました!

4

1 に答える 1

1

一部更新あり。Antlrworks2 で同じ組み合わせ文法を実行すると動作します。Antlrworks2 で実行できるようにするには、いくつかの構文変更が必要です。例:{$channel=99;}に置き換えられ->channel(99)ます。

ありがとう!!

于 2013-02-19T14:53:31.687 に答える