标签: abstract-syntax-tree

TypeScript:获取语法树

我读过"整个互联网",但找不到任何关于从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)

abstract-syntax-tree typescript

41
推荐指数
3
解决办法
9938
查看次数

如何在Python中获取"end-of-statement"的lineno

我正在尝试在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标准库获取此类信息?

python abstract-syntax-tree

39
推荐指数
4
解决办法
2196
查看次数

格式错误的字符串ValueError ast.literal_eval(),字符串表示为元组

我正在尝试从文件中读取元组的字符串表示,并将元组添加到列表中.这是相关的代码.

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

38
推荐指数
3
解决办法
7万
查看次数

如何查看clang AST?

我想抓住Clang.所以,我想在解析给定程序后查看Clang生成的AST.是否可以以.dot或.viz格式转储AST?那里有工具吗?

llvm clang abstract-syntax-tree

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

使用标记列表构造抽象语法树

我想从一个令牌列表中构造一个AST.我正在编写脚本语言,我已经完成了词法分析部分,但我不知道如何创建AST.所以问题是,我该怎么做这样的事情:

WORD, int
WORD, x
SYMBOL, =
NUMBER, 5
SYMBOL, ;
Run Code Online (Sandbox Code Playgroud)

并将其转换为抽象语法树?最好,我想在没有像ANTLR之类的库那样的情况下这样做,我宁愿自己尝试从头开始.但是,如果这是一项非常复杂的任务,我不介意使用库:)谢谢

java interpreter abstract-syntax-tree

36
推荐指数
1
解决办法
2万
查看次数

什么是AST转换?

什么是AST转换?我在阅读Groovy博客时遇到过这些话.但它一般是什么?

groovy abstract-syntax-tree program-transformation

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

Python 3,ast.literal_eval(node_or_string)中是否有任何已知的安全漏洞?

有没有已知的方法让ast.literal_eval(node_or_string)的评估实际上不安全?

如果是,是否可以使用补丁?

(我已经知道PyPy [沙盒],它可能更安全,但除非答案是肯定的,否则,我的需求很小,我不会走得那么远.)

python security abstract-syntax-tree

32
推荐指数
2
解决办法
4056
查看次数

Lambda Expression Compile()方法有什么作用?

我想在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.LambdaExpression.Call构建.我感兴趣的是Compile()方法.它以某种方式生成真正的MSIL?我能看到MSIL吗?

c# lambda compilation abstract-syntax-tree

31
推荐指数
3
解决办法
2万
查看次数

将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中表示抽象语法树

我正在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)

c compiler-construction tree struct abstract-syntax-tree

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