首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ANTLR -为AST编写树语法

ANTLR -为AST编写树语法
EN

Stack Overflow用户
提问于 2010-02-11 11:36:59
回答 2查看 3.1K关注 0票数 3

我的语法文件为一些Lua代码输出了一个AST,它目前为我做解析和词法分析。我想在其中添加一个树语法,但由于我使用的是C#,我不确定该如何做。在已经编写了解析器和词法分析器的情况下,生成树语法代码的基本过程是什么?

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

代码语言:javascript
复制
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=.) {};

放置在与我的主语法文件相同的目录中,它生成的结果很好。然而,当我尝试编译它时,我得到了以下错误:

代码语言:javascript
复制
[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

我是在正确的轨道上还是完全走错了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-02-13 00:02:32

我没有遇到这个错误,但我会尝试以下两种方法。

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

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

票数 1
EN

Stack Overflow用户

发布于 2010-02-12 00:05:17

现在回到我常用的计算器语法示例:)

下面是声明Tree Walker类的方法

代码语言:javascript
复制
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的树规则。树遍历器与解析器语法非常相似。

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

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

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

PLUSSTAR树也匹配2个expr规则。每个expr规则都被分配给一个名称,因此我们可以使用它来计算表达式。与解析器语法类似,我们可以将C#代码放入由{...}定义的块中。

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

要调用树遍历器,您可以创建它,然后调用它的顶级规则。我将从Antlr示例中复制以下代码:)

代码语言:javascript
复制
// 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);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2242089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档