尝试将语法重新组织为两个文件时出现异常的ANTLR错误

时间:2010-02-15 07:32:59

标签: lua antlr3

我正在将我的语法重新组织成两个文件以容纳树语法; Lua.g和LuaGrammar.g。 Lua.g将拥有我的所有词法规则,LuaGrammar.g将拥有我的所有树语法和解析器规则。但是,当我尝试编译LuaGrammar.g时,我收到以下错误:

[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();};

(两者均基于Nicolai Mainero制作的语法,可在ANTLR的网站上获得,Lua 5.1语法) 如果我取消注释不止于此,则会出现上述错误。

1 个答案:

答案 0 :(得分:1)

好的,'Can't find template ruleRefBang.st'与非法使用“树排除”运算符有关:!。通常,这是一个矛盾的重写规则:某处你有一个!,然后用->重写它,但无论如何都要使用那个被忽略的标记。因为我在你的语法中看不到->,所以情况并非如此(除非你简化树语法在这里发布并删除了一些重写规则?)。

无论如何,我首先要删除树语法中的所有!运算符,如果你的语法然后工作,则将它们一个接一个地重新插入。然后你应该能够指出你的语法中包含非法!的地方。

祝你好运!