相关疑难解决方法(0)

任何基于libclang的C/C++重构工具?(即使是最简单的"玩具示例")

正如我已经指出的那样 - 在这里 - 似乎clang的libclang应该非常适合实现C/C++代码分析和修改(查看视频演示和幻灯片)这样的艰巨任务.

你知道任何基于libclang的C/C++重构工具吗?

"任何"包括甚至简单的alpha状态项目,支持一种重构技术.它可以没有预处理器支持.作为功​​能上我正在谈论的一个例子:更改方法名称,它是否支持多个文件或一次只支持一个文件.您可能想知道要求甚至是小工作示例的目标是什么我的想法是创建一个代码示例列表和一个位置的小工具将提供更好的资源来学习如何使用libclang实现重构.我相信,从简单的项目可能会以适当的开源方式成长更大的项目:).

c++ refactoring llvm clang

47
推荐指数
6
解决办法
1万
查看次数

将AST编译回源代码

我目前正在构建一个用PHP编写的PHP解析器,因为在我之前的问题中没有出现现有的解析器.该分析器本身运作得相当好.

现在很明显,解析器本身没什么用(除了静态分析).我想将转换应用于AST,然后将其编译回源代码.应用转换不是一个问题,普通的访客模式应该这样做.

我目前的问题是如何将AST编译回源代码.我看到基本上有两种可能性:

  1. 使用某种预定义方案编译代码
  2. 保留原始代码的格式并仅在已更改的节点上应用1.

现在我想专注于1.因为2.似乎很难完成(但如果你有相关的提示,我想听听它们).

但我不确定哪种设计模式可用于编译代码.我看到实现这一点的最简单方法是->compile向所有节点添加一个方法.我在这里看到的缺点是,更改生成的输出的格式非常困难.人们需要更改节点本身才能做到这一点.因此,我正在寻找一个不同的解决方案.

我听说访客模式也可以用于此,但我无法想象它应该如何工作.据我了解访问者模式,你有一些NodeTraverser在所有节点上递归迭代并调用一个->visit方法Visitor.对于节点操作来说这听起来非常有前景,其中该Visitor->visit方法可以简单地更改它传递的Node,但我不知道它如何用于编译.一个显而易见的想法是将节点树从叶子迭代到根,并用源代码替换访问的节点.但这在某种程度上似乎不是一个非常干净的解决方案?

php compiler-construction abstract-syntax-tree

30
推荐指数
1
解决办法
9053
查看次数

从c ++代码中获取人类可读的AST

为了更好地理解C++语言和语法的一些细节,我希望能够编写一个小的C++程序,并查看编译器从中生成的AST.

看起来clang过去有这个功能(-emit-asm),但它已经删除了.

今天有一个简单的方法吗?

c++ abstract-syntax-tree

20
推荐指数
3
解决办法
1万
查看次数

如何使用Clang从C++字符串生成AST?

我正在尝试使用Clang来操作C++源代码,但是我在发现API时遇到了问题.

我想取一串C++源代码并从中生成一个AST; 就像是:

auto myAst = clang::parse("auto x = 1 + 1;"); 
Run Code Online (Sandbox Code Playgroud)

这有一个最小的工作示例吗?

c++ parsing clang abstract-syntax-tree

10
推荐指数
1
解决办法
1063
查看次数