2013-02-16 6 views
0

Antlrworks의 초보자입니다. XML 파일을 구문 분석하기 위해 결합 된 문법 파일을 작성 중입니다. XML 파일은 꽤 크고 복잡합니다.코드가 너무 커서 specialStateTransition (int s, IntStream _input) antlrworks의 Lexer.java 메서드

문법에 정의 된 많은 렉서 규칙이 있습니다. 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 file name'은 '문법 파일 만들기'라는 수정 아이디어로 정의되지 않았습니다.

grammar SampleCDFXML; 

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

} 

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

'XMLBaseLexer'는 원래 결합 된 문법의 렉서 규칙 중 일부를 가지고있는 렉서 문법입니다.

많은 웹 사이트에서 가져 오기 문제를 검색했지만 답변을 얻지 못했습니다.

누군가가 문제를 해결할 수있는 아이디어를 제공해 주시기 바랍니다.

모든 도움을 주시면 대단히 감사하겠습니다.

감사합니다.

+0

안녕하세요 바트, 나는이 질문을해야하는 사람에게 알지 못합니다. 당신의 대답과 우리의 의견이 왜 여기에서 사라 졌는지 당신은 알고 있습니까? – Pan

답변

1

일부 업데이트가 있습니다. Antlrworks2에서 동일한 결합 문법을 실행하면 작동합니다. Antlrworks2에서 실행할 수 있도록 구문을 수정해야합니다. 예 : ->channel(99)으로 대체 될 {$channel=99;}

감사합니다.