我读过"整个互联网",但找不到任何关于从TypeScrypt源获取语法树(就像在Esprima中一样)的例子.我的意思是我怎样才能得到这样的对象(Esprima Parser示例)
{
"type": "Program",
"body": [
{
"type": "VariableDeclaration",
"declarations": [
{
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "answer"
},
"init": {
"type": "BinaryExpression",
"operator": "*",
"left": {
"type": "Literal",
"value": 6,
"raw": "6"
},
"right": {
"type": "Literal",
"value": 7,
"raw": "7"
}
}
}
],
"kind": "var"
}
]
}
Run Code Online (Sandbox Code Playgroud)
来自javascript代码
var answer = 6 * 7;
Run Code Online (Sandbox Code Playgroud)
仅适用于TypeScript源文本?
PS我非常希望得到你的帮助,因为我不想写你自己糟糕的自行车)
PPS我认为lib文件typescript.ts(.js)和typescriptServices.ts(.js)帮助我,但我不知道如何:(
解决了
非常感谢用户Steve Fenton.这是我的代码,如果有人对此感兴趣:
// uses
var typeScriptLS = new Harness.TypeScriptLS();
var ServicesFactory = new …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Python中操作另一个脚本的脚本,要修改的脚本具有如下结构:
class SomethingRecord(Record):
description = 'This records something'
author = 'john smith'
Run Code Online (Sandbox Code Playgroud)
我ast用来找到description行号,并使用一些代码来更改原始文件,其中新的描述字符串基于行号.到现在为止还挺好.
现在唯一的问题description偶尔是一个多行字符串,例如
description = ('line 1'
'line 2'
'line 3')
Run Code Online (Sandbox Code Playgroud)
要么
description = 'line 1' \
'line 2' \
'line 3'
Run Code Online (Sandbox Code Playgroud)
我只有第一行的行号,而不是以下行.所以我的单行替代品会这样做
description = 'new value'
'line 2' \
'line 3'
Run Code Online (Sandbox Code Playgroud)
并且代码被破坏了.我想如果我知道开始和结束的行号/ description赋值行数我可以修复我的代码来处理这种情况.如何使用Python标准库获取此类信息?
我正在尝试从文件中读取元组的字符串表示,并将元组添加到列表中.这是相关的代码.
raw_data = userfile.read().split('\n')
for a in raw_data :
print a
btc_history.append(ast.literal_eval(a))
Run Code Online (Sandbox Code Playgroud)
这是输出:
(Decimal('11.66985'), Decimal('0E-8'))
Traceback (most recent call last):
File "./goxnotify.py", line 74, in <module>
main()
File "./goxnotify.py", line 68, in main
local.load_user_file(username,btc_history)
File "/home/unix-dude/Code/GoxNotify/local_functions.py", line 53, in load_user_file
btc_history.append(ast.literal_eval(a))
File "/usr/lib/python2.7/ast.py", line 80, in literal_eval
return _convert(node_or_string)
`File "/usr/lib/python2.7/ast.py", line 58, in _convert
return tuple(map(_convert, node.elts))
File "/usr/lib/python2.7/ast.py", line 79, in _convert
raise ValueError('malformed string')
ValueError: malformed string
Run Code Online (Sandbox Code Playgroud) python parsing representation python-2.x abstract-syntax-tree
我想抓住Clang.所以,我想在解析给定程序后查看Clang生成的AST.是否可以以.dot或.viz格式转储AST?那里有工具吗?
我想从一个令牌列表中构造一个AST.我正在编写脚本语言,我已经完成了词法分析部分,但我不知道如何创建AST.所以问题是,我该怎么做这样的事情:
WORD, int
WORD, x
SYMBOL, =
NUMBER, 5
SYMBOL, ;
Run Code Online (Sandbox Code Playgroud)
并将其转换为抽象语法树?最好,我想在没有像ANTLR之类的库那样的情况下这样做,我宁愿自己尝试从头开始.但是,如果这是一项非常复杂的任务,我不介意使用库:)谢谢
有没有已知的方法让ast.literal_eval(node_or_string)的评估实际上不安全?
如果是,是否可以使用补丁?
(我已经知道PyPy [沙盒],它可能更安全,但除非答案是肯定的,否则,我的需求很小,我不会走得那么远.)
我想在C#中理解AST.我想知道,Compile()这个例子的确切方法是什么.
// Some code skipped
Expression<Func<string, int, int, string>> data = Expression.Lambda<Func<string, int, int, string>>(
Expression.Call(s, typeof(string).GetMethod(“Substring”, new Type[] { typeof(int), typeof(int) }), a, b),
s, a, b
);
Func<string, int, int, string> fun = data.Compile();
Run Code Online (Sandbox Code Playgroud)
为了防止误解,我理解Expression.Lambda和Expression.Call构建.我感兴趣的是Compile()方法.它以某种方式生成真正的MSIL?我能看到MSIL吗?
我目前正在构建一个用PHP编写的PHP解析器,因为在我之前的问题中没有出现现有的解析器.该分析器本身运作得相当好.
现在很明显,解析器本身没什么用(除了静态分析).我想将转换应用于AST,然后将其编译回源代码.应用转换不是一个问题,普通的访客模式应该这样做.
我目前的问题是如何将AST编译回源代码.我看到基本上有两种可能性:
现在我想专注于1.因为2.似乎很难完成(但如果你有相关的提示,我想听听它们).
但我不确定哪种设计模式可用于编译代码.我看到实现这一点的最简单方法是->compile向所有节点添加一个方法.我在这里看到的缺点是,更改生成的输出的格式非常困难.人们需要更改节点本身才能做到这一点.因此,我正在寻找一个不同的解决方案.
我听说访客模式也可以用于此,但我无法想象它应该如何工作.据我了解访问者模式,你有一些NodeTraverser在所有节点上递归迭代并调用一个->visit方法Visitor.对于节点操作来说这听起来非常有前景,其中该Visitor->visit方法可以简单地更改它传递的Node,但我不知道它如何用于编译.一个显而易见的想法是将节点树从叶子迭代到根,并用源代码替换访问的节点.但这在某种程度上似乎不是一个非常干净的解决方案?
我正在C中为一个简单的玩具语言实现一个编译器.我有一个工作的扫描器和解析器,以及关于AST的概念功能/构造的合理背景.我的问题与在C中表示AST的具体方式有关.我在网上不同的文本/资源中经常遇到三种风格:
每种类型的节点一个结构.
它有一个基节点"class"(struct),它是所有子结构中的第一个字段.基节点包含一个存储节点类型的枚举(常量,二元运算符,赋值等).使用一组宏访问结构的成员,每个结构一个集.它看起来像这样:
struct ast_node_base {
enum {CONSTANT, ADD, SUB, ASSIGNMENT} class;
};
struct ast_node_constant {
struct ast_node_base *base;
int value;
};
struct ast_node_add {
struct ast_node_base *base;
struct ast_node_base *left;
struct ast_node_base *right;
};
struct ast_node_assign {
struct ast_node_base *base;
struct ast_node_base *left;
struct ast_node_base *right;
};
#define CLASS(node) ((ast_node_base*)node)->class;
#define ADD_LEFT(node) ((ast_node_add*)node)->left;
#define ADD_RIGHT(node) ((ast_node_add*)node)->right;
#define ASSIGN_LEFT(node) ((ast_node_assign*)node)->left;
#define ASSIGN_RIGHT(node) ((ast_node_assign*)node)->right;
Run Code Online (Sandbox Code Playgroud)
每个节点布局一个结构.
这似乎与上面的布局大致相同,除了没有ast_node_add和ast_node_assign它将有一个ast_node_binary来表示两者,因为两个结构的布局是相同的,它们只是由base-> class的内容不同.这样做的好处似乎是一组更加统一的宏(左侧和右侧所有节点的LEFT(节点),而不是每对一对宏),但缺点似乎是C类型检查不会有用(例如,没有办法检测到只有ast_node_add的ast_node_assign).
一个结构总数,带有用于保存不同类型节点数据的联合.
可以在这里找到比我能给出的更好的解释.使用上一个示例中的类型,它看起来像:
struct ast_node {
enum { CONSTANT, ADD, SUB, ASSIGNMENT } …Run Code Online (Sandbox Code Playgroud) python ×3
c ×1
c# ×1
clang ×1
compilation ×1
groovy ×1
interpreter ×1
java ×1
lambda ×1
llvm ×1
parsing ×1
php ×1
python-2.x ×1
security ×1
struct ×1
tree ×1
typescript ×1