ANTLR - 编写 AST 的树语法
2010-2-11 9:54:46
收藏:0
阅读:244
评论:2
我已经通过我的语法文件为一些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
我没有遇到过这个错误,但我会尝试两件事。
1)删除@lexer和@parser命名空间行。
2)如果它们是必要的,请将它们移动到语法规则的Tokens {...}部分之后,即规则之前。
2010-02-12 16:02:31
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
回到我通常使用的计算器语法的例子:)
这是你声明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
规则中,我们可以看到它匹配任何具有标记PLUS
或STAR
或INT
的树。我们可以看到我们正在匹配树,因为我们使用的是Antlr的树语法
#(...)
。PLUS
和STAR
树也与两个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);