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'는 원래 결합 된 문법의 렉서 규칙 중 일부를 가지고있는 렉서 문법입니다.
많은 웹 사이트에서 가져 오기 문제를 검색했지만 답변을 얻지 못했습니다.
누군가가 문제를 해결할 수있는 아이디어를 제공해 주시기 바랍니다.
모든 도움을 주시면 대단히 감사하겠습니다.
감사합니다.
안녕하세요 바트, 나는이 질문을해야하는 사람에게 알지 못합니다. 당신의 대답과 우리의 의견이 왜 여기에서 사라 졌는지 당신은 알고 있습니까? – Pan