2010-02-15 41 views
0

我正在將我的語法重組爲兩個文件以容納樹語法; Lua.g和LuaGrammar.g。 Lua.g將擁有我所有的詞法分析器規則,而LuaGrammar.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) 

而且,我發現了以下錯誤:

[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的網站,Lua的5.1語法由尼古拉Mainero和可用的生產的語法) 如果我不是這個取消註釋了,說到與上面的錯誤。

+0

隨着「編譯LuaGrammar.g」我假設你的意思是生成一個解析器和詞法分析器?什麼時候出現關於'ruleRefBang.st'的錯誤?它是否顯示在您發佈的語法上(包含所有評論)?如果不是的話,可否請你發佈拋出這個關於'ruleRefBang.st'錯誤的語法? –

+0

如果您取消註釋提供的語法中的部分並嘗試生成代碼(在同一個目錄中使用Lua.g,我將編輯該文件),它會拋出錯誤。但是,它的評論是這樣的,它會生成很好的結果。詞法分析器部分也生成很好,我在那裏沒有問題。 – RCIX

回答

1

好的,'Can't find template ruleRefBang.st'與非法使用「樹排除」運算符有關:!。通常,這是一個矛盾的重寫規則:某處您有!,然後使用->重寫它,但無論如何都使用該忽略的標記。既然我在你的語法中看不到->,那麼情況就不是這樣了(除非你簡化樹語法在這裏發佈並刪除一些重寫規則?)。

無論如何,我會先從您的樹語法中刪除所有!運算符,然後您的語法工作將它們一個接一個地重新輸入。然後,你應該能夠在你的語法中指出安置非法的地方!

祝你好運!

+0

我會盡力的,謝謝你的幫助!很高興有其他人知道更多關於這個東西比我:) – RCIX

+0

它的工作!問題在於另一個規則中使用的fieldsep解析器規則的樹註釋,而不是規則本身。 – RCIX

+0

很高興聽到! –

相關問題