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

我将我的语法重新组织为两个文件,以适应树状语法: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)

并且,当尝试生成Lua.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

为什么会出现这些错误,我该如何修复它们?(使用ANTLR V3,可以提供语法文件)

更新:这是我尝试编译的语法文件。

``` 树形语法LuaGrammar;

选项{ 回溯=true; 语言=CSharp2; 输出=AST; TokenVocab=Lua; 过滤器=真; ASTLabelType=CommonTree; }

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

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

块 : 块;

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; */

原文链接 https://stackoverflow.com/questions/2264500

点赞
stackoverflow用户50476
stackoverflow用户50476

好的,“无法找到模板规则RefBang.st”与非法使用"树排除"运算符有关。通常情况下,它是一种矛盾的重写规则:有些地方你有一个,然后使用->进行重写,但是仍然使用被忽略的令牌。由于我在你的语法中看不到->,除非你简化了树语法以在此处发布并删除了一些重写规则,否则不能是这种情况。

无论如何,我会从树语法中删除所有的!运算符,如果您的语法能够正常工作,再逐个将它们放回去。然后您应该能够确定您的语法中存在非法的的位置。

祝好运!

2010-02-18 09:04:40