标签: abstract-syntax-tree

为什么我不能在Groovy脚本中的@Grab声明后进行方法调用?

我正在尝试构建DSL并使用全局AST变换来完成它.该脚本编译得groovyc很好,但我希望能够让用户使用Grab/Grape来拉取JAR并让它立即执行作为一个常规脚本.

然后我发现我无法正确执行,因为如果在@Grab调用之后没有方法声明或import语句,脚本中会出现解析错误.

这是一个例子:

@Grab(group='mysql', module='mysql-connector-java', version='5.1.6')

println "Hello World!"
Run Code Online (Sandbox Code Playgroud)

它看起来应该工作,但它抱怨(这是GroovyConsole脚本的输出):

startup failed:
Script1.groovy: 4: unexpected token: println @ line 4, column 1.
   println "hello"
   ^

1 error
Run Code Online (Sandbox Code Playgroud)

尝试不同的东西使它工作,就像一个import语句:

@Grab(group='mysql', module='mysql-connector-java', version='5.1.6')
import groovy.lang.Object
println "Hello World!" ?
Run Code Online (Sandbox Code Playgroud)

或者方法缩小:

@Grab(group='mysql', module='mysql-connector-java', version='5.1.6')
def hello() {}
println "Hello World!"
Run Code Online (Sandbox Code Playgroud)

这是解析器中的错误吗?

syntax groovy abstract-syntax-tree

17
推荐指数
1
解决办法
1582
查看次数

在R中解析" - >"赋值运算符

我的问题是在R语言中解析表达式.让我跳到一个例子中:

fun_text <- c("
0 -> var
f1 <- function()
{
    0 -> sum_var
    sum_var2 = 0
    sum_var3 <- 0
}

(function()
{
    0 -> sum_var
    sum_var2 = 0
    sum_var3 <- 0
})->f2

f3 = function(x)
{
  0 -> sum_var
  sum_var2 = 0
  sum_var3 <- 0
}

")

fun_tree <- parse(text=fun_text)
fun_tree 
fun_tree[[1]]
fun_tree[[2]]
fun_tree[[3]]
fun_tree[[4]]
Run Code Online (Sandbox Code Playgroud)

之后,我们获得了这些结果:

expression(0 -> var, f1 <- function()
{
    0 -> sum_var
    sum_var2 = 0
    sum_var3 <- 0
}, (function()
{
    0 -> sum_var
    sum_var2 …
Run Code Online (Sandbox Code Playgroud)

parsing r abstract-syntax-tree assignment-operator

17
推荐指数
1
解决办法
493
查看次数

如何在clang中从AST中排除标题?

我正在使用clang生成AST.我有以下文件(lambda.cpp)来解析:

#include <iostream>

void my_lambda()
{
    auto lambda = [](auto x, auto y) {return x + y;};
    std::cout << "fabricati diem"; 
}
Run Code Online (Sandbox Code Playgroud)

我正在使用以下命令解析它:

clang -Xclang -ast-dump -fsyntax-only lambda.cpp
Run Code Online (Sandbox Code Playgroud)

问题是clang解析了标题内容.结果,我有相当大的(~3000行)文件与无用(对我来说)的内容.

生成AST时如何排除标题?

c++ clang abstract-syntax-tree

17
推荐指数
1
解决办法
5965
查看次数

如何使用JDT/AST将代码片段添加到方法体

我正在尝试使用JDT/AST生成Java源代码.我现在有了MethodDeclaration,并希望将代码片段(来自其他来源)添加到方法体.代码段可以包含任何Java代码,甚至是语法无效的代码.我只是找不到这样做的方法.

使用JCodeModel,您将使用JBlock#directStatement(String s)方法.

有没有办法用JDT/AST做到这一点?

java code-generation abstract-syntax-tree eclipse-jdt

16
推荐指数
1
解决办法
1284
查看次数

有没有合适的方法直接从Scala Parser Combinators生成[jpg,png等]语法图(和/或AST)?

我所知道的唯一方法不是"直接":

  • 转换为ANTLR格式并使用自己的可视化工具
  • VISUALLANGLAB,它似乎需要整个鼠标点击"重写"
  • 我自己实现转换器(这很有趣,但很耗时)
  • 第二个链接如下

有关:

第二个链接建议调试向解析器添加隐式方法:

implicit def toLogged(name:String) = new { 
  def !!![T](p:Parser[T]) = log(p)(name)
}
Run Code Online (Sandbox Code Playgroud)

可能是AST会更可行/有用; 但问题仍然相似.

scala dot abstract-syntax-tree parser-combinators

16
推荐指数
1
解决办法
337
查看次数

Rc内部的下行特征用于AST操作

我正试图在Rust中操纵AST.会有很多操作,我希望我的树是不可变的,所以为了节省时间,所有引用都将是Rcs.

我的树节点将如下所示:

enum Condition {
    Equals(Rc<Expression>, Rc<Expression>),
    LessThan(Rc<Expression>, Rc<Expression>),
    ...
}

enum Expression {
    Plus(Rc<Expression>, Rc<Expression>),
    ...
}
Run Code Online (Sandbox Code Playgroud)

我想用另一个相同类型的节点替换给定类型的随机节点.要在树上进行通用操作,我已经做了一个特性:

trait AstNode {
    fn children(&self) -> Vec<Rc<AstNode>>;
}
Run Code Online (Sandbox Code Playgroud)

所有节点都实现了这一点.这允许我通过简单地调用来遍历树而不必为每个操作解构每个节点类型children().

我还希望克隆一个节点,同时只更新其中一个子节点,并保留其他子节点.假设我已经能够生成正确的具体类型的节点(如果我错了,我很高兴程序会出现恐慌).我将在特征中添加以下方法:

trait AstNode {
    fn clone_with_children(&self, new_children: Vec<Rc<AstNode>>) -> Self
        where Self: Sized;
}
Run Code Online (Sandbox Code Playgroud)

我的计划是把孩子们带回来childen(),替换他们中的一个,然后调用clone_with_children()构建一个相同枚举变量的节点,但是替换了一个节点.

我的问题是如何写clone_with_children().

我需要向下转换Rc<AstNode>Rc<Expression>(或你有什么),同时保持内部的引用计数Rc相同,但没有我已经找到了向下转换库似乎是能够做到这一点.

我想要的是什么,或者我应该完全不同地做到这一点?

type-systems abstract-syntax-tree downcast rust

16
推荐指数
1
解决办法
591
查看次数

将C#代码翻译成AST?

目前是否可以将C#代码转换为抽象语法树?

编辑:一些澄清; 我不一定希望编译器能为我生成AST - 解析器会很好,尽管我想使用"官方"的东西.遗憾的是Lambda表达式不够,因为它们不允许我使用语句体,这正是我正在寻找的.

c# compiler-construction abstract-syntax-tree

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

在c#中编写解析器的最佳/最快方法

在c#中构建解析器以解析我自己的语言的最佳方法是什么?理想情况下,我想提供一个语法,并将抽象语法树作为输出.非常感谢,内斯特

c# parsing abstract-syntax-tree

15
推荐指数
2
解决办法
7480
查看次数

斯卡拉的Scala AST

是否有Scala库解析Scala并创建抽象语法树(AST)?

理想情况下,我对Scala库感兴趣.Plan B将是一个Java库.

(我知道我可以利用Scala语法摘要中的EBNF .)

scala abstract-syntax-tree

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

使用TreeTranslator重命名不适用于Kotlin的函数

我正在尝试根据AST(抽象语法树)重写在构建期间重命名Java接口中的方法和Kotlin接口中的函数.对于这个问题,我们忽略了重命名方法/函数给调用带来的影响.要找到要重命名的方法/函数,我正在使用自定义注释和注释处理器.我按照这些说明操作Java接口.

我用三个模块创建了一个新项目.app模块,注释模块和注释处理器模块.

该应用模块是一个Android应用程序,并包含与一个注释的方法/函数每两个独立的Java和科特林接口文件.

RenameJava.java

package nl.peperzaken.renametest;

import nl.peperzaken.renameannotation.Rename;

public interface RenameJava {
    @Rename
    void methodToRename();
}
Run Code Online (Sandbox Code Playgroud)

RenameKotlin.kt

package nl.peperzaken.renametest

import nl.peperzaken.renameannotation.Rename

interface RenameKotlin {
    @Rename
    fun functionToRename()
}
Run Code Online (Sandbox Code Playgroud)

注释模块是一个只包含@Rename注释的Java库,我们指定只在函数上允许它,我们说它只能在源代码中可见.

Rename.kt

package nl.peperzaken.renameannotation

@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.SOURCE)
annotation class Rename
Run Code Online (Sandbox Code Playgroud)

注释处理器模块是一个Java库,它只包含迭代具有注释的元素并对其进行转换的处理器.

RenameProcessor.kt

package nl.peperzaken.renameprocessor

import com.google.auto.service.AutoService
import com.sun.source.util.Trees
import com.sun.tools.javac.processing.JavacProcessingEnvironment
import com.sun.tools.javac.tree.JCTree
import com.sun.tools.javac.tree.TreeTranslator
import com.sun.tools.javac.util.Names
import nl.peperzaken.renameannotation.Rename
import javax.annotation.processing.*
import javax.lang.model.SourceVersion
import javax.lang.model.element.TypeElement
import javax.tools.Diagnostic

@AutoService(Processor::class)
@SupportedSourceVersion(SourceVersion.RELEASE_8)
@SupportedAnnotationTypes("nl.peperzaken.renameannotation.Rename")
class RenameProcessor : AbstractProcessor() {

    private lateinit var trees: Trees
    private lateinit …
Run Code Online (Sandbox Code Playgroud)

java android abstract-syntax-tree gradle kotlin

15
推荐指数
1
解决办法
374
查看次数