标签: abstract-syntax-tree

从包的给定路径中提取类型名称的最简单的工作示例

我是 golang AST 包和相关 go 工具(如 astutils)的新手。目前,我有点困于理解 Stringer 示例并根据自己的目的对其进行修改。

https://github.com/golang/tools/blob/master/cmd/stringer/stringer.go

是否有一个简单地提取包路径中所有已定义类型名称的列表的工作示例?

abstract-syntax-tree go

4
推荐指数
1
解决办法
2651
查看次数

创建一个 codemod 以向数组添加新元素

我一直在努力将新对象添加到对象数组中jscodeshift。我的问题是我无法弄清楚在获得VariableDeclarator. 我需要获取数组中的最后一个元素,然后才能插入新节点。这是代码:

export default function transformer(file, api) {

    const j = api.jscodeshift;
    const root = j(file.source);
    const changeList = root.find(j.VariableDeclarator, {
        id: {name: 'list'},
    }).closest(j.ArrayExpression, {
        elements: [""]
    }).replaceWith(p => {
        console.log(p);
    }).toSource();

};
Run Code Online (Sandbox Code Playgroud)

我正在AST 浏览器上玩它

javascript abstract-syntax-tree jscodeshift

4
推荐指数
1
解决办法
1291
查看次数

如何在 R 中获取 AST 作为列表

我有字符串,它描述数学公式,我想将其转换为有意义部分的列表。该函数ast_确实知道如何解析它,将其显示为抽象语法树,但不返回 AST。我正在寻找一个返回树的函数。

\n\n
bb <- "(media.urin_A + media.urin_B)/2"\nlazyeval::ast_(rlang::parse_expr(bb))\n
Run Code Online (Sandbox Code Playgroud)\n\n
> lazyeval::ast_(rlang::parse_expr(bb))\n\xe2\x94\x97 ()\n \xe2\x94\x97 `/\n \xe2\x94\x97 ()\n  \xe2\x94\x97 `(\n  \xe2\x94\x97 ()\n   \xe2\x94\x97 `+\n   \xe2\x94\x97 `media.urin_A\n   \xe2\x94\x97 `media.urin_B\n \xe2\x94\x97  2 \n
Run Code Online (Sandbox Code Playgroud)\n

r list abstract-syntax-tree

4
推荐指数
1
解决办法
692
查看次数

Babel unshiftcontainer 不创建元素

尝试使用 babel 变换,我编写了这段代码以VariableDeclaration在我的之后插入一个path

export default function (babel) {
  const { types: t } = babel;

  return {
    name: "ast-transform", // not required
    visitor: {
      VariableDeclaration (path) {
        if (path.node.kind !== 'var') {
          return;
        }

        const _id = t.Identifier('qwe');
        const _init = t.numericLiteral(42);

        console.log(_id, _init);

        const _node = t.variableDeclaration('var', [
          t.variableDeclarator(
            t.identifier("uid"),
            t.numericLiteral(42)
          )
        ]);

        path
          .unshiftContainer(
            'body',
            _node
          )

      }
    }
  };
}
Run Code Online (Sandbox Code Playgroud)

得到以下错误,

未知:无法读取未定义的属性“body”

编辑:

如果我执行以下操作而不是unshiftContainer有效,

const _program = path.findParent(p => p.isProgram());
_program.node.body.unshift(_node);
Run Code Online (Sandbox Code Playgroud)

为什么不起作用 …

javascript abstract-syntax-tree babeljs

4
推荐指数
1
解决办法
737
查看次数

如何在python3中使用AST递归地简化数学表达式?

我有这个数学表达式:

\n
tree = ast.parse(\'1 + 2 + 3 + x\')\n
Run Code Online (Sandbox Code Playgroud)\n

对应于这个抽象语法树:

\n
Module(body=[Expr(value=BinOp(left=BinOp(left=BinOp(left=Num(n=1), op=Add(), right=Num(n=2)), op=Add(), right=Num(n=3)), op=Add(), right=Name(id=\'x\', ctx=Load())))])\n
Run Code Online (Sandbox Code Playgroud)\n

我想简化它 - 也就是说,得到这个:

\n
Module(body=[Expr(value=BinOp(left=Num(n=6), op=Add(), right=Name(id=\'x\', ctx=Load())))])\n
Run Code Online (Sandbox Code Playgroud)\n

根据文档,我应该使用 NodeTransformer 类。文档中的建议如下:

\n
\n

请记住,如果您正在操作的节点\xe2\x80\x99 有子节点,您必须自己转换子节点或首先调用该节点的generic_visit() 方法。

\n
\n

我尝试实现我自己的变压器:

\n
class Evaluator(ast.NodeTransformer):\n    def visit_BinOp(self, node):\n        print(\'Evaluating \', ast.dump(node))\n        for child in ast.iter_child_nodes(node):\n            self.visit(child)\n\n        if type(node.left) == ast.Num and type(node.right) == ast.Num:\n            print(ast.literal_eval(node))\n            return ast.copy_location(ast.Subscript(value=ast.literal_eval(node)), node)\n        else:\n            return node\n
Run Code Online (Sandbox Code Playgroud)\n

在这种特定情况下,它应该做的是将 1+2 简化为 3,然后将 3 …

recursion abstract-syntax-tree python-3.x

4
推荐指数
1
解决办法
1208
查看次数

使用 go ast 从位置获取周围的函数名称

仅通过源代码(无需运行时检查)从文件位置获取周围函数名称的最佳方法是什么?

例如说我有一些代码:

func MyFunc() {
    doSomething() // package/file.go:215:15
}
Run Code Online (Sandbox Code Playgroud)

而我有doSomething的位置,at package/file.go:215:15,有没有办法轻松获取MyFunc?

abstract-syntax-tree go

4
推荐指数
1
解决办法
1912
查看次数

如何让ANTLR输出分层AST?

我有一个Lua语法,(对C#进行输出的小修改,只是命名空间指令和几个选项更改),当我在一些示例输入上运行它时,它给了我一个根"nil"节点的树作为孩子们看起来是输入代码的标记化版本.看起来ANTLR的树语法在分层树上运行而不是"平"树,所以我认为我不能按原样使用输出.

是否有一个简单的语法修复方法,还是需要从头开始重写?

lua parsing antlr abstract-syntax-tree

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

HQL意外的AST节点:分钟

我正在尝试创建一个HQL查询,如下所示:

List<Task> results = session.createQuery("FROM Task where ProcessID = :procId " +
                "and Role = :role and completed = 0 " +
                "group by TaskID " +
                "having min(chronology)")
                .setParameter("procId", procId)
                .setParameter("role", role).list();
Run Code Online (Sandbox Code Playgroud)

发生以下错误:

<AST>:1:114: unexpected AST node: min
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1943)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.groupClause(HqlSqlBaseWalker.java:1521)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:618)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:299)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:247)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:248)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:105)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168)
    at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:219)
    at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:197)
    at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1736)
    at de.arvato.icssa.db.worker.TaskWorker.getTask(TaskWorker.java:90)
    at de.arvato.icssa.endpoints.TestServiceImpl.sendMail(TestServiceImpl.java:84)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597) …
Run Code Online (Sandbox Code Playgroud)

java hibernate hql abstract-syntax-tree

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

python ast vs json for str to dict translation

我有一段代码接收格式化为python字典的字符串

"{'a':'1','b':'2',...}"
Run Code Online (Sandbox Code Playgroud)

我需要转换为正确的字典.

我尝试了两种方法,使用json.loads(s)ast.literal_eval(s) ast似乎更健壮,接受字符串中的任何形式的引号和"只是工作",而json似乎对引用细节非常挑剔,并且不会仅在单个表单上失败报价格式.我真的希望尽可能灵活地使用输入,因此更喜欢使用ast,但是,我的一些同事声称它可能不是一个"安全"的模块和功能.

任何人都可以建议ast和ast.literal_eval()安全,特别是与json.loads()相比?

谢谢

python json abstract-syntax-tree

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

使用JDT将注释附加到类

我有一个包含以下内容的IFile:

package com.example;
//@SimpleAnnotation(Blab.ckass)
//@CustomAnnotation(arg1 = Blup.class , arg2 = Blup.Row.class)
public class SimpleClassWithAnnotation {

}
Run Code Online (Sandbox Code Playgroud)

如何在类中添加注释(注释的注释)?我试图使用这个线程的解决方案,但源不会改变.这是我使用的代码片段:

    final ASTParser parser = ASTParser.newParser(AST.JLS3);
    parser.setSource(this.cu);
    ICompilationUnit cu = JavaCore.createCompilationUnitFrom(this.ifile);
    final CompilationUnit astRoot = (CompilationUnit) parser.createAST(null);
    final AST ast = astRoot.getAST();
    astRoot.recordModifications();
    final NormalAnnotation newNormalAnnotation = astRoot.getAST().newNormalAnnotation();
    newNormalAnnotation.setTypeName(astRoot.getAST().newName("AnnotationTest"));
Run Code Online (Sandbox Code Playgroud)

这是尝试添加一个简单的注释@AnnotationTest.但是我需要这样的东西:@CustomAnnotation(arg1 = Blup.class , arg2 = Blup.Row.class)

提前致谢 !

java annotations eclipse-plugin abstract-syntax-tree eclipse-jdt

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