2010-02-15 1 views
0

트리 문법을 조정하기 위해 두 개의 파일로 문법을 재구성합니다. Lua.g 및 LuaGrammar.g. Lua.g에는 모든 렉서 규칙이 적용되며 LuaGrammar.g에는 모든 트리 문법과 구문 분석 규칙이 적용됩니다. 나는 다음과 같은 오류를 받고 있어요,문법을 두 파일로 재구성하려고 시도 할 때 비정상적인 ANTLR 오류가 발생했습니다.

[00:28:37] error(10): internal error: C:\Users\RCIX\Desktop\AguaLua\Project\trunk\AguaLua\AguaLua\ANTLR Data\LuaGrammar.g : java.lang.IllegalArgumentException: Can't find template ruleRefBang.st; group hierarchy is [CSharp2] 
org.antlr.stringtemplate.StringTemplateGroup.lookupTemplate(StringTemplateGroup.java:507) 
org.antlr.stringtemplate.StringTemplateGroup.getInstanceOf(StringTemplateGroup.java:392) 
org.antlr.stringtemplate.StringTemplateGroup.getInstanceOf(StringTemplateGroup.java:404) 
org.antlr.stringtemplate.StringTemplateGroup.lookupTemplate(StringTemplateGroup.java:484) 
org.antlr.stringtemplate.StringTemplateGroup.getInstanceOf(StringTemplateGroup.java:392) 
org.antlr.stringtemplate.StringTemplateGroup.getInstanceOf(StringTemplateGroup.java:404) 
org.antlr.stringtemplate.StringTemplateGroup.lookupTemplate(StringTemplateGroup.java:484) 
org.antlr.stringtemplate.StringTemplateGroup.getInstanceOf(StringTemplateGroup.java:392) 
org.antlr.stringtemplate.StringTemplateGroup.getInstanceOf(StringTemplateGroup.java:404) 
org.antlr.grammar.v2.CodeGenTreeWalker.getRuleElementST(CodeGenTreeWalker.java:152) 
org.antlr.grammar.v2.CodeGenTreeWalker.atom(CodeGenTreeWalker.java:1986) 
org.antlr.grammar.v2.CodeGenTreeWalker.element(CodeGenTreeWalker.java:1708) 
org.antlr.grammar.v2.CodeGenTreeWalker.element(CodeGenTreeWalker.java:1556) 
org.antlr.grammar.v2.CodeGenTreeWalker.alternative(CodeGenTreeWalker.java:1306) 
org.antlr.grammar.v2.CodeGenTreeWalker.block(CodeGenTreeWalker.java:1081) 
org.antlr.grammar.v2.CodeGenTreeWalker.ebnf(CodeGenTreeWalker.java:1871) 
org.antlr.grammar.v2.CodeGenTreeWalker.element(CodeGenTreeWalker.java:1704) 
org.antlr.grammar.v2.CodeGenTreeWalker.alternative(CodeGenTreeWalker.java:1306) 
org.antlr.grammar.v2.CodeGenTreeWalker.block(CodeGenTreeWalker.java:1081) 
org.antlr.grammar.v2.CodeGenTreeWalker.rule(CodeGenTreeWalker.java:797) 
org.antlr.grammar.v2.CodeGenTreeWalker.rules(CodeGenTreeWalker.java:588) 
org.antlr.grammar.v2.CodeGenTreeWalker.grammarSpec(CodeGenTreeWalker.java:530) 
org.antlr.grammar.v2.CodeGenTreeWalker.grammar(CodeGenTreeWalker.java:336) 
org.antlr.codegen.CodeGenerator.genRecognizer(CodeGenerator.java:432) 
org.antlr.Tool.generateRecognizer(Tool.java:641) 
org.antlr.Tool.process(Tool.java:454) 
org.antlr.works.generate.CodeGenerate.generate(CodeGenerate.java:104) 
org.antlr.works.generate.CodeGenerate.run(CodeGenerate.java:185) 
java.lang.Thread.run(Unknown Source) 

: 그리고 내가 LuaGrammar.g을 시도하고 컴파일 할 때, 나는 다음과 같은 오류가

[00:34:58] error(100): C:\Users\RCIX\Desktop\AguaLua\Project\trunk\AguaLua\AguaLua\ANTLR Data\Lua.g:0:0: syntax error: codegen: <AST>:0:0: unexpected end of subtree 

Lua.g.를 생성하기 위해 시도 왜 이러한 오류가 발생합니까? 어떻게 해결할 수 있습니까? (ANTLR V3 사용, 문법 파일 제공 가능)

업데이트 : 여기 컴파일하려는 문법 파일이 있습니다.

tree grammar LuaGrammar; 

options { 
    backtrack=true; 
    language=CSharp2; 
    output=AST; 
    tokenVocab=Lua; 
    filter=true; 
    ASTLabelType=CommonTree; 
} 


assignment 
    : 
    ^('=' left=NAME right=NAME) {Ast. }; 
/* 



chunk : (stat (';'!)?)* (laststat (';'!)?)?; 

block : chunk; 

stat : varlist1 '='^ explist1 | 
    functioncall | 
    doblock | 
    'while'^ exp doblock | 
    'repeat'^ block untilrule | 
    'if'^ exp thenchunk elseifchunk* elsechunk? 'end'! | 
    'for'^ forinitializer doblock | 
    'for'^ namelist inlist doblock | 
    'function'^ funcname funcbody | 
    'local' 'function' NAME funcbody | 
    'local'^ namelist localstat? ; 

localstat 
    : '='^ explist1; 

untilrule 
    : 'until'^ exp; 

elseifchunk 
    : 'elseif'^ exp thenchunk; 

thenchunk 
    : 'then'^ block; 

elsechunk 
    : 'else'^ block; 

forinitializer 
    : NAME '='^ exp ','! exp (','! exp)?; 

doblock 
    : 'do'^ block 'end'!; 

inlist 
    : 'in'^ explist1; 

laststat : 'return'^ (explist1)? | 'break'; 




dotname : '.'! funcname; 

colonname 
    : ':' NAME; 

funcname : NAME^ (dotname | colonname)?; 




varlist1 : var (','! var)*; 


namelist : NAME (','! NAME)*; 

explist1 : (exp ','!)* exp; 
*/ 
/* 
exp : expelement (binop^ exp)* ; 

expelement 
    : ('nil' | 'false' | 'true' | number | stringrule | '...' | /*function |*\ prefixexp | tableconstructor | unop exp); 
var: (namevar | dotvar | expvar | arrayvar)?; 

namevar 
    : NAME^ var; 

dotvar 
    : '.'! var; 

expvar 
    : '('^ exp ')'! var; 

arrayvar 
    : '['^ var ']'! var; 

varSuffix: nameAndArgs* ('[' exp ']' | '.' NAME); 

prefixexp: varOrExp nameAndArgs*; 

functioncall: varOrExp nameAndArgs+; 

varOrExp: var | '('! exp ')'!; 


nameAndArgs: (':' NAME)? argsrule; 

argsrule : '(' (explist1)? ')' | tableconstructor | stringrule ; 

function : 'function' funcbody; 

funcbody : funcparams funcblock; 

funcblock 
    : ')'^ block 'end'!; 

funcparams 
    : '('^ parlist1? ; 

parlist1 : namelist (','! '...')? | '...'; 

tableconstructor : '{'^ (fieldlist)? '}'!; 

fieldlist : field (fieldsep! field)* (fieldsep!)?; 

field : '['! exp ']'! '='^ exp | NAME '='^ exp | exp; 
*/ 
fieldsep : ',' | ';'; 

binop : '+' | '-' | '*' | '/' | '^' | '%' | '..' | 
     '<' | '<=' | '>' | '>=' | '==' | '~=' | 
     'and' | 'or'; 

unop : '-' | 'not' | '#'; 

number : INT | FLOAT | EXP | HEX; 

stringrule : NORMALSTRING | CHARSTRING | LONGSTRING; 

Lua.g :

/* 
* Lua 5.1 grammar 
* 
* Nicolai Mainiero 
* May 2007 
* 
* This is a Lua (http://www.lua.org) grammar for the version 5.1 for ANTLR 3. 
* I tested it with basic and extended examples and it worked fine. It is also used 
* for LunarEclipse (http://lunareclipse.sf.net) a Lua editor based on Eclipse. 
* 
* Thanks to Johannes Luber and Gavin Lambert who helped me with some mutually left recursion. 
* 
*/ 

grammar Lua; 

options { 
    backtrack=true; 
    language=CSharp2; 
    //output=AST; 
    //ASTLabelType=CommonTree; 
} 
@lexer::namespace{AguaLua} 


chunk : (stat (';'!)?)* (laststat (';'!)?)?; 

block : chunk; 

stat : varlist1 '='^ explist1 | 
    functioncall | 
    doblock | 
    'while'^ exp doblock | 
    'repeat'^ block untilrule | 
    'if'^ exp thenchunk elseifchunk* elsechunk? 'end'! | 
    'for'^ forinitializer doblock | 
    'for'^ namelist inlist doblock | 
    'function'^ funcname funcbody | 
    'local' 'function' NAME funcbody | 
    'local'^ namelist localstat? ; 

localstat 
    : '='^ explist1; 

untilrule 
    : 'until'^ exp; 

elseifchunk 
    : 'elseif'^ exp thenchunk; 

thenchunk 
    : 'then'^ block; 

elsechunk 
    : 'else'^ block; 

forinitializer 
    : NAME '='^ exp ','! exp (','! exp)?; 

doblock 
    : 'do'^ block 'end'!; 

inlist 
    : 'in'^ explist1; 

laststat : 'return'^ (explist1)? | 'break'; 




dotname : '.'! funcname; 

colonname 
    : ':' NAME; 

funcname : NAME^ (dotname | colonname)?; 




varlist1 : var (','! var)*; 


namelist : NAME (','! NAME)*; 

explist1 : (exp ','!)* exp; 

exp : expelement (binop^ exp)* ; 

expelement 
    : ('nil' | 'false' | 'true' | number | stringrule | '...' | function | prefixexp | tableconstructor | unop exp); 

var: (namevar | dotvar | expvar | arrayvar)?; 

namevar 
    : NAME^ var; 

dotvar 
    : '.'! var; 
expvar 
    : '('^ exp ')'! var; 
arrayvar 
    : '['^ var ']'! var; 

varSuffix: nameAndArgs* ('[' exp ']' | '.' NAME); 

prefixexp: varOrExp nameAndArgs*; 

functioncall: varOrExp nameAndArgs+; 

varOrExp: var | '('! exp ')'!; 

nameAndArgs: (':' NAME)? argsrule; 

argsrule : '(' (explist1)? ')' | tableconstructor | stringrule ; 

function : 'function' funcbody; 

funcbody : funcparams funcblock; 

funcblock 
    : ')'^ block 'end'!; 

funcparams 
    : '('^ parlist1? ; 

parlist1 : namelist (','! '...')? | '...'; 

tableconstructor : '{'^ (fieldlist)? '}'!; 

fieldlist : field (fieldsep! field)* (fieldsep!)?; 

field : '['! exp ']'! '='^ exp | NAME '='^ exp | exp; 

fieldsep : ',' | ';'; 

binop : '+' | '-' | '*' | '/' | '^' | '%' | '..' | 
     '<' | '<=' | '>' | '>=' | '==' | '~=' | 
     'and' | 'or'; 

unop : '-' | 'not' | '#'; 

number : INT | FLOAT | EXP | HEX; 

stringrule : NORMALSTRING | CHARSTRING | LONGSTRING; 

// LEXER 

NAME :('a'..'z'|'A'..'Z'|'_')(options{greedy=true;}: 'a'..'z'|'A'..'Z'|'_'|'0'..'9')* 
    ; 

INT : ('0'..'9')+; 

FLOAT :INT '.' INT ; 

EXP : (INT| FLOAT) ('E'|'e') ('-')? INT; 

HEX :'0x' ('0'..'9'| 'a'..'f')+ ; 

NORMALSTRING 
    : '"' (EscapeSequence | ~('\\'|'"'))* '"' 
    ; 

CHARSTRING 
    : '\'' (EscapeSequence | ~('\''|'\\'))* '\'' 
    ; 

LONGSTRING 
    : '['('=')*'[' (EscapeSequence | ~('\\'|']'))* ']'('=')*']' 
    ; 

fragment 
EscapeSequence 
    : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') 
    | UnicodeEscape 
    | OctalEscape 
    ; 

fragment 
OctalEscape 
    : '\\' ('0'..'3') ('0'..'7') ('0'..'7') 
    | '\\' ('0'..'7') ('0'..'7') 
    | '\\' ('0'..'7') 
    ; 

fragment 
UnicodeEscape 
    : '\\' 'u' HexDigit HexDigit HexDigit HexDigit 
    ; 

fragment 
HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ; 


COMMENT 
    : '--[[' (options {greedy=false;} : .)* ']]' {Skip();} 
    ; 

LINE_COMMENT : '--' (~ NEWLINE)* {Skip();}; 
fragment NEWLINE : '\r'|'\n' | '\r\n' ; 

WS : (' '|'\t'|'\u000C') {Skip();}; 

내가 이것보다 더 이상 주석을 제거하면 (모두 ANTLR 사이트, 루아 5.1 문법에서 니콜라이 Mainero 가능한 의해 생성 문법의 기반으로하고 있습니다), 온다 위의 오류와 함께.

+0

"컴파일하는 LuaGrammar.g"을 사용하여 파서와 렉서를 생성한다고 가정합니다. 'ruleRefBang.st'에 대한 오류는 언제 나타 납니까? 당신이 게시 한 문법에 (모든 설명과 함께) 나타 납니까? 그렇지 않다면 'ruleRefBang.st'에 대한이 오류를 발생시키는 문법을 게시 하시겠습니까? –

+0

제공된 문법의 섹션의 주석 처리를 제거하고 코드를 생성하려고 시도하면 (동일한 디렉토리에 Lua.g을 사용하여 해당 파일을 편집합니다) 오류가 발생합니다. 그러나, 그것 같이 논평 된대로, 그것은 과료를 생성한다. lexer 부분도 괜찮아요, 거기에 아무런 문제가 발생합니다. – RCIX

답변

1

좋아요, 'Can't find template ruleRefBang.st'은 "트리 제외"연산자의 잘못된 사용과 관련이 있습니다 : !. 보통 대립하는 재 작성 규칙입니다 : !이 있고 ->을 사용하여 다시 작성하지만 무시 된 토큰을 사용하십시오. 문법에 ->을 볼 수 없기 때문에 (트리 문법을 단순화하여 여기에 게시하고 일부 재 작성 규칙을 제거하지 않는 한) 그럴 수 없습니다.

어쨌든, 모든 ! 연산자를 트리 문법에서 제거하고 문법이 작동하면 하나씩 다시 삽입합니다. 그런 다음 불법적 인 문법을 사용하는 곳을 가리킬 수 있어야합니다. !.

행운을 빈다.

+0

도움을 주셔서 감사합니다. 다행이 나보다이 물건에 대해 더 많이 알고있는 누군가를 가지고있어 라. – RCIX

+0

그것은 일했다! 문제는 규칙 자체 대신에 다른 규칙에 사용 된'fieldsep' 파서 규칙의 트리 주석에있었습니다. – RCIX

+0

잘 듣고 싶습니다! –

관련 문제