ANTLR - 为AST编写树语法

时间:2010-02-11 03:36:59

标签: c# lua antlr tree-grammar

我的语法文件为一些Lua代码输出了一个AST,它目前正在为我解析和删除。我想为此添加一个树语法,但由于我正在使用C#,我不知道该怎么做。当你已经编写了解析器和词法分析器时,生成树语法代码的基本过程是什么?

更新:我有以下语法文件:

tree grammar LuaGrammar;

options {
  backtrack=true;
  language=CSharp2;
  //output=AST;
  tokenVocab=Lua;
  filter=true;
  ASTLabelType=CommonTree;
}
@lexer::namespace{/*my namespace*/}
@parser::namespace{/*my namespace*/}

dummyRule
    :   ^('=' x=. y=.) {};

放在与我的主语法文件相同的目录中,生成正常。但是,在尝试编译时,我会收到以下错误:

[02:54:06] error(143): C:\Users\RCIX\Desktop\AguaLua\Project\trunk\AguaLua\AguaLua\ANTLR Data\LuaGrammar.g:12:18: unknown or invalid action scope for tree grammar: lexer
[02:54:06] error(143): C:\Users\RCIX\Desktop\AguaLua\Project\trunk\AguaLua\AguaLua\ANTLR Data\LuaGrammar.g:13:19: unknown or invalid action scope for tree grammar: parser

我是在正确的轨道还是完全离开?

2 个答案:

答案 0 :(得分:2)

回到我惯常的计算器语法示例:)

这就是你如何声明你的Tree Walker类

class CalcTreeShaker extends TreeParser;

expr returns [float r]
{
float a,b;
r=0;
}
:   #(PLUS a=expr b=expr)   {r = a+b;}
|   #(STAR a=expr b=expr)   {r = a*b;}
|   i:INT           {r = Convert.ToSingle(i.getText());}
;

这里有一个名为expr的树规则。 Tree walker与解析器语法非常相似。

最大的区别在于,虽然解析器语法必须完全匹配树语法,但只需匹配树的一部分。

expr规则中,我们可以看到它匹配任何包含令牌PLUSSTARINT的树。

我们可以看到我们匹配树,因为我们使用的是Antlr的树语法#(...)

PLUSSTAR树也匹配2个expr规则。每个expr规则都分配给一个名称,以便我们可以使用它来评估表达式。与解析器语法类似,我们可以通过{...}将C#代码放入块中。

另请注意,在此示例中,我们将展示如何从TreeWalker规则返回值,我们使用语法return [...]

要调用树步行者,请创建它,然后调用它的顶级规则。我将从Antlr示例中复制此内容:)

// Get the ast from your parser.
CommonAST t = (CommonAST)parser.getAST();

// Create the Tree Shaker
CalcTreeWalker walker = new CalcTreeWalker();
CalcParser.initializeASTFactory(walker.getASTFactory());

// pass the ast to the walker and call the top level rule.
float r = walker.expr(t);

答案 1 :(得分:1)

我没有遇到过这个错误,但我会尝试两件事。

1)删除@lexer和@parser命名空间行。

2)如果有必要,则将它们移动到语法的Tokens {...}部分之后,即在规则之前。

相关问题