我是Antlrworks的新手。我正在编写组合语法文件来解析XML文件。 XML文件非常大且很复杂。antlrworks中的Lexer.java的specialStateTransition(int s,IntStream _input)方法中的代码太大了
在语法中定义了许多词法分析器规则。 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'是词法分析器语法,它有一些来自原始组合语法的词法分析器规则。
我在许多网站搜索导入问题,但没有得到答案。
请有人提出解决问题的想法。
任何帮助,非常感谢。
谢谢!
嗨巴特,我不知道我应该问这个问题。你有什么想法,为什么你的回答和我们的意见在这里消失了? – Pan 2013-02-19 05:56:51