是否可以通过编程方式访问javac.exe中的抽象语法树(AST)?你能提供一个例子吗?
我想将包含有效Erlang表达式的字符串转换为其抽象语法树表示,到目前为止没有任何成功.
以下是我想做的一个例子.编译后,alling z:z().生成模块zed,通过调用zed:zed().返回lists:reverse给定列表上的应用结果.
-module(z).
-export([z/0]).
z() ->
ModuleAST = erl_syntax:attribute(erl_syntax:atom(module),
[erl_syntax:atom("zed")]),
ExportAST = erl_syntax:attribute(erl_syntax:atom(export),
[erl_syntax:list(
[erl_syntax:arity_qualifier(
erl_syntax:atom("zed"),
erl_syntax:integer(0))])]),
%ListAST = ?(String), % This is where I would put my AST
ListAST = erl_syntax:list([erl_syntax:integer(1), erl_syntax:integer(2)]),
FunctionAST = erl_syntax:function(erl_syntax:atom("zed"),
[erl_syntax:clause(
[], none,
[erl_syntax:application(
erl_syntax:atom(lists),
erl_syntax:atom(reverse),
[ListAST]
)])]),
Forms = [erl_syntax:revert(AST) || AST <- [ModuleAST, ExportAST, FunctionAST]],
case compile:forms(Forms) of
{ok,ModuleName,Binary} -> code:load_binary(ModuleName, "z", Binary);
{ok,ModuleName,Binary,_Warnings} -> code:load_binary(ModuleName, "z", Binary)
end.
Run Code Online (Sandbox Code Playgroud)
String可能是"[1,2,3].",或"begin …
是什么意思
x AND THEN y AND z
Run Code Online (Sandbox Code Playgroud)
是吗
x AND THEN (y AND z)
Run Code Online (Sandbox Code Playgroud)
(如果x为FALSE,则y,z永远不会被评估)或
(x AND THEN y) AND z
Run Code Online (Sandbox Code Playgroud)
(如果x为FALSE,y被跳过,但可能是z被评估)在ada中?
嗨,我是编译器开发的新手,我想知道AST是怎样的.我有一小段代码,我使用Clang生成AST.我没有得到太多的信息.从它的外观来看,语法树与源完全相同,除了一个结构添加到我测试的几乎任何样本中.
资源:
class A {
public:
int *a, *b, *c;
int i;
void sum() {
a = new int[5];
b = new int[5];
c = new int[5];
for (i = 0; i < 5; i++) {
a[i] = i;
b[i] = i;
}
for (i = 0; i < 5; i++) {
c[i] = a[i] + b[i];
}
delete[] a; delete[] b; delete[] c;
}
};
class B : public A {
};
int main() {
B bclass;
bclass.sum();
return …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Clang来操作C++源代码,但是我在发现API时遇到了问题.
我想取一串C++源代码并从中生成一个AST; 就像是:
auto myAst = clang::parse("auto x = 1 + 1;");
Run Code Online (Sandbox Code Playgroud)
这有一个最小的工作示例吗?
Julia中有什么东西相当于literal_eval包ast(Abstract Syntax Tree)提供的Python 吗?
其(literal_eval)描述摘要:
此函数仅评估Python文字结构:字符串,字节,数字,元组,列表,字符串,集合,布尔值,以及
None可用于安全地评估来自不受信任来源的字符串,而无需自行解析值.它无法评估任意复杂的表达式,例如涉及运算符或索引.
当引用符合语法的文本的解析结果时,术语AST(抽象语法树),解析树和派生树由不同的人围绕.假设我们正在谈论解析计算机语言,他们的差异是否足够小,我们可以互换使用这些术语?如果没有,我们如何正确使用这些条款?
如何从gcc C代码构建AST(抽象语法树)以进行一些修改,比如将一些int变量转换为float,然后再将代码重新生成(生成)到C语法.
实际上,目前,我真正需要的唯一功能是从包含几行的ac程序中提取变量及其类型的表...我认为有一个简单的解析器就是这样做的.
我有一些变量,如:
int var_bss ;
float var_f_bss;
int var_data = 4;
float var_f_data = 5;
Run Code Online (Sandbox Code Playgroud)
功能:
int Foo(){
some local variables;
}
Run Code Online (Sandbox Code Playgroud)
代码位于单个c文件中.
我想向最终用户介绍所有变量,让他选择特定内存段中的源类型,例如.data中的int变量.然后用户可以将这些变量转换为浮点数.最后,我为用户生成相同的代码,但使用他选择的新变量类型.
我试图定义使用ekmett的库抽象语法类型bound和free.我有一些工作,我可以删除到以下最小的例子:
{-# LANGUAGE DeriveFunctor #-}
import Bound
import Control.Monad.Free
type Id = String
data TermF f ? =
AppF ? ?
| BindF Id (Scope () f ?)
deriving Functor
newtype Term' ? = T {unT :: Free (TermF Term) ?}
type Term = Free (TermF Term')
Run Code Online (Sandbox Code Playgroud)
最后两行是,呃,不是我所希望的.它们使得PITA实际上可以利用注释(或其他)的开放递归.
是否有更好的方法将这两个库一起使用,和/或我应该放弃尝试制作Term一个免费的monad?
如何找到属性是从语法的产生中合成还是继承?
我想因为必须在问题中预定义属性 - 如果它的值取决于子节点或父节点.但有没有办法分析属性是从语法产生继承还是合成.
compiler-construction parsing abstract-syntax-tree context-free-grammar semantic-analysis