ANTLR - 编写 AST 的树语法

我已经通过我的语法文件为一些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

我是在正确的轨道上,还是完全偏离了正确方向?

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

点赞
stackoverflow用户25981
stackoverflow用户25981

回到我通常使用的计算器语法的例子:)

这是你声明Tree Walker类的方法

类CalcTreeShaker扩展TreeParser;

expr返回[浮点数 r]
{
浮点数 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树也与两个expr规则匹配。每个expr规则都被分配一个名称,以便我们可以将其用于计算表达式。与解析器语法相似,我们可以将C#代码放入由{...}定义的块中。

还要注意,在此示例中,我们显示了如何从Tree Walker规则返回值,我们使用语法return [...]

调用Tree Walker时,您应创建它,然后调用其顶级规则。我将从Antlr示例中复制此处?

// 从解析器获取ast。
CommonAST t = (CommonAST)parser.getAST();

// 创建Tree Shaker。
CalcTreeWalker walker = new CalcTreeWalker();
CalcParser.initializeASTFactory(walker.getASTFactory());

//将ast发送到walker并调用顶级规则。
float r = walker.expr(t);
2010-02-11 16:05:17
stackoverflow用户25981
stackoverflow用户25981

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

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

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

2010-02-12 16:02:31