2010-02-15 5 views
0

Je réorganise ma grammaire en deux fichiers afin d'accommoder une grammaire d'arborescence; Lua.g et LuaGrammar.g. Lua.g aura toutes mes règles de lexer, et LuaGrammar.g aura toutes mes règles de grammaire et d'analyseur. Cependant, lorsque je tente de compiler LuaGrammar.g je reçois l'erreur suivante:Erreur ANTLR inhabituelle lors d'une tentative de réorganisation de la grammaire en deux fichiers

[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) 

Et, je reçois l'erreur suivante:

[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 

lors d'une tentative de générer Lua.g. Pourquoi suis-je obtenir ces erreurs, et comment puis-je les réparer? (En utilisant ANTLR V3, je suis capable de fournir des fichiers de grammaire)

Mise à jour: voici le fichier de grammaire que j'essaie de compiler.

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

(les deux sont basés hors d'une grammaire produite par Nicolai Mainero et disponible sur le site de ANTLR, Lua 5.1 grammaire) Si je décommenter plus que cela, il vient avec l'erreur ci-dessus.

+0

Avec "compiler LuaGrammar.g", je suppose que vous voulez dire générer un analyseur et un lexer? Quand l'erreur concernant le 'ruleRefBang.st' apparaît-elle? Apparaît-il sur la grammaire que vous avez postée (avec tous les commentaires)? Si non, pourriez-vous s'il vous plaît poster la grammaire qui jette cette erreur à propos de 'ruleRefBang.st'? –

+0

Si vous décommentez la section dans la grammaire fournie et tentez de générer du code (avec Lua.g dans le même répertoire, je modifierai ce fichier), l'erreur sera générée. Cependant, avec commenté comme il est, il génère bien. La partie lexer génère également très bien, je n'ai aucun problème là-bas. – RCIX

Répondre

1

Bon, un 'Can't find template ruleRefBang.st' a quelque chose à voir avec l'utilisation illégale d'un opérateur "arbre exclu": !. Habituellement, c'est une règle de réécriture contradictoire: quelque part vous avez un !, puis vous le réécrivez en utilisant -> mais utilisez quand même ce jeton ignoré. Puisque je ne peux pas voir un -> dans votre grammaire, cela ne peut pas être le cas (sauf si vous avez simplifié la grammaire de l'arbre pour poster ici et supprimé certaines règles de réécriture?).

De toute façon, je commencerais par supprimer tous les opérateurs ! dans votre grammaire de l'arbre et si votre grammaire fonctionne alors les remettre, un par un, à nouveau dans. Ensuite, vous devriez être en mesure de pointer l'endroit dans votre grammaire qui abrite le ! illégale.

Bonne chance!

+0

Je vais essayer, merci pour l'aide! Heureux d'avoir quelqu'un d'autre qui en sait plus sur ce truc que moi :) – RCIX

+0

Ça a marché! le problème était dans l'annotation d'arbre sur une règle d'analyseur 'fieldsep' utilisée dans une autre règle au lieu de dans la règle elle-même. – RCIX

+0

C'est bon d'entendre ça! –

Questions connexes