Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将ANTLR生成的AST转换为源代码

如何将ANTLR生成的AST转换为源代码
EN

Stack Overflow用户
提问于 2012-07-31 19:26:12
回答 2查看 1.2K关注 0票数 4

我正在为PL/SQL编写一个简单的解析器和重写工具,我已经完成了解析器并获得了AST,但现在我遇到了两个问题:

  1. 如何获得AST的某些节点,从而更改它们的值?
  2. 更改节点后,如何从更新的AST中重新生成SQL -- ANTLR AST是否提供了类似的接口?

示例SQL:select a,b from t where a=2

在解析了sql并获得ast之后,我想将sql更改为

代码语言:javascript
运行
AI代码解释
复制
select fun(a),b from t where a = fun1(2);

顺便说一句,我用ANTLR为C生成AST,

谢谢你的建议!

EN

回答 2

Stack Overflow用户

发布于 2012-07-31 20:01:46

请看我在how to regenerate source code from an AST上的回答。

工作比你想象的要多。

ANTLR以字符串模板的形式提供了一些帮助,但您可能会发现这些都是喜忧参半的:虽然它们可以生成代码文本,但它们将精确地生成模板中的内容,并且您可能希望根据其原始布局重新生成代码,而字符串模板的布局希望重写该布局。

票数 3
EN

Stack Overflow用户

发布于 2013-03-22 12:17:06

下面的代码将遍历AST并将所有AST节点打印到stderr。相同的树遍历器是可以替换树节点的树转换器的基础。

使用:(pANTLR3_BASE_TREE)(psr->adaptor->nilNode(psr->adaptor));分配新的树节点

删除带有:parentASTnode>删除子节点(parentASTnode,nodeIndex)的AST节点;deleteChild不释放删除的节点

将节点替换为:parentASTnode>replaceChildren(parentASTnode、nStartChildIndex、nStopChildIndex、newASTnode);不能在AST树级别的中间插入节点,只能替换节点或添加到父节点子列表的末尾

代码语言:javascript
运行
AI代码解释
复制
void  printTree(pANTLR3_BASE_TREE t, int indent) 
{
    pANTLR3_BASE_TREE child = NULL;
    int     children = 0;
    char *  tokenText = NULL;
    string  ind = "";
    int     i = 0;

    if ( t != NULL ) 
      {
        children = t->getChildCount(t);
        for ( i = 0; i < indent; i++ )
          ind += "   ";

        for ( i = 0; i < children; i++ )
          {
            child = (pANTLR3_BASE_TREE)(t->getChild(t, i));
            tokenText = (char *)child->toString(child)->chars;
            fprintf(stderr, "%s%s\n", ind.c_str(), tokenText);
            if (tokenText == "<EOF>")
              break;
            printTree(child, indent+1);
          }
      }
}


// Run the parser
pANTLR3_BASE_TREE langAST = (psr->start_rule(psr)).tree; 

// Print the AST
printTree(langAST, 0);

// Get the Parser Errors
int nErrors = psr->pParser->rec->state->errorCount;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11752166

复制
相关文章
位、字节、字的区别
字(Word)代表计算机处理指令或数据的二进制数位数,是计算机进行数据存储和数据处理的运算的单位。
Lokinli
2023/03/09
6740
原子操作和互斥锁的区别
这个系列的文章里介绍了很多并发编程里经常用到的技术,除了Context、计时器、互斥锁还有通道外还有一种技术--原子操作在一些同步算法中会被用到。今天的文章里我们会简单了解一下Go语言里对原子操作的支持,然后探讨一下原子操作和互斥锁的区别。
KevinYan
2020/06/16
4.6K0
Jquery的属性操作和DOM操作
       3 val()    :     获取或设置表单内容    (原生JS使用value)
用户3159471
2018/09/13
1.4K0
Jquery的属性操作和DOM操作
SDRAM的操作和配置
在有的项目中我们需要扩展外扩SDRAM,所以需要操作SDRAM,以使用STM32H743主控芯片的FMC外设控制器为例子来说明,可以使用STM32CubeMX生成配置初始化代码,完了后需要添加一些代码才能保证SDRAM正常工作,本篇笔记主要介绍SDRAM的操作和读写。
用户1605515
2020/04/26
6920
比特、字节、字
计算机里的信息是以什么样的形式存在计算机里的呢?是不是说计算机里有一张纸,然后可以把信息写上去呢? 我想大家首先想到的硬盘……和内存。 这就是比特、字节和字的关系。
mwangblog
2018/07/04
3160
HTTP 1.0 和 HTTP 1.1 的主要区别是什么
HTTP 1.0 最早在网页中的使用是在 1996 年,那个时候只是使用一些较为简单的网页和网络请求上,而 HTTP 1.1 则在 1999 年才开始广泛应用于现在的各大浏览器网络请求中,同时 HTTP 1.1 也是当前使用最为广泛的 HTTP 协议。 两者的主要区别体现在:
happyJared
2019/06/20
4.1K0
常用的高防有哪几类?主要的区别是什么?
有一些用户受到DDOS攻击的时候,不知道自己该选择什么样的高防来防御攻击,墨者安全今天主要讲下常用的高防有哪几类?以及主要的区别?高防主要分为HTTPS高防、TCP高防、CDN高防、香港高防、海外高防。
墨者安全筱娜
2019/04/15
2.5K0
常用的高防有哪几类?主要的区别是什么?
NFS操作和部署
如果出现以上结果,表示服务端配置成功 最好在本地挂载一次,挂载成功在取消挂载,至少可以确认服务端配置正确,能够挂载 6) 设置开机自启动并检查
jackxiao
2021/11/16
5630
Cache 和 Buffer 都是缓存,主要区别是什么?
原文链接:https://www.zhihu.com/question/26190832/answer/830615125
业余草
2019/11/12
2750
Cache 和 Buffer 都是缓存,主要区别是什么?
提到这个问题,可能意味着题主意识到了两者的相关性。的确,他们确实有那么一些联系。
老钱
2019/09/25
1.6K0
Cache 和 Buffer 都是缓存,主要区别是什么?
Docker:镜像操作和容器操作
古时的风筝
2018/01/08
1K0
Cache 和 Buffer 都是缓存,主要区别是什么?
首先cache是缓存,buffer是缓冲,虽然翻译有那么一个字的不同,但这不是重点。
良月柒
2019/11/07
3610
css特殊操作和效果
(8) 渐变 background-image: repeating-linear-gradient(red, yellow 10%, green 20%);
前端小tips
2021/12/07
4250
css特殊操作和效果
java中的字节流和字符流的区别是什么?
java当中有两种流,一种是字节流(byte stream): 以1字节(8-bit)为单位进行读/写,一次处理一个字节。另一种是字符流(character stream):,以字符为单位,一次处理一个字符。
马克java社区
2021/05/06
4560
java中的字节流和字符流的区别是什么?
字节、字、bit、byte的关系
字 word 字节 byte 位 bit,来自英文bit,音译为“比特”,表示二进制位。 字长是指字的长度
全栈程序员站长
2022/09/01
3K0
Cache 和 Buffer 都是缓存,主要区别是什么?【转】
作者:Towser 链接:https://www.zhihu.com/question/26190832/answer/32387918 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 不知道为什么这问题突然火了,更新一个一句话总结:cache 是为了弥补高速设备和低速设备的鸿沟而引入的中间层,最终起到加快访问速度的作用。 而 buffer 的主要目的进行流量整形,把突发的大数量较小规模的 I/O 整理成平稳的小数量较大规模的 I/O,以减少响应次数(比如从网上下电影
233333
2018/07/04
2K0
Nilearn中的基本操作和查看
Rose小哥今天给大家介绍一款用于神经成像工具Nilearn以及它的基本操作和数据保存查看。
脑机接口社区
2020/06/30
1.4K0
Nilearn中的基本操作和查看
Clojure文件操作和惰性序列
数据一般都是存储在纯文本文件当中,存储的形式多种多样。本文,我会介绍如何在Clojure中读取和写入这些数据。
lambeta
2018/08/17
3.2K0
Python列表常见操作和注意
常见操作 列表很常用,每一个元素之间用 , 隔开。 列表中的每一个元素可以是任意类型的数据 数字,字符串,列表,元组,集合,字典 列表可进行的操作 索引(从0开始)、切片、加、成员检查(in,not in),for循环。 Python 表达式 结果 描述 len([1, 2, 3]) 3 长度 [1, 2, 3] + [4, 5, 6] [1, 2, 3, 4, 5, 6] 组合 ['Hi!'] * 4 ['Hi!', 'Hi!', 'Hi!', 'Hi!'] 重复 3 in [1, 2, 3] Tru
py3study
2020/01/19
4530
点击加载更多

相似问题

智能家居操作和DialogFlow操作之间的主要区别

10

伪操作和机器操作的区别?

12

Oozie >异步操作和同步操作之间的区别是什么?

16

Delphi字节操作和Java

11

增加虚拟字节的操作和函数

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档