我正在尝试构建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)
这是解析器中的错误吗?
我的问题是在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) 我正在使用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时如何排除标题?
我正在尝试使用JDT/AST生成Java源代码.我现在有了MethodDeclaration,并希望将代码片段(来自其他来源)添加到方法体.代码段可以包含任何Java代码,甚至是语法无效的代码.我只是找不到这样做的方法.
使用JCodeModel,您将使用JBlock#directStatement(String s)方法.
有没有办法用JDT/AST做到这一点?
我所知道的唯一方法不是"直接":
有关:
第二个链接建议调试向解析器添加隐式方法:
implicit def toLogged(name:String) = new {
def !! = log(p)(name)
}
Run Code Online (Sandbox Code Playgroud)
可能是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相同,但没有我已经找到了向下转换库似乎是能够做到这一点.
我想要的是什么,或者我应该完全不同地做到这一点?
目前是否可以将C#代码转换为抽象语法树?
编辑:一些澄清; 我不一定希望编译器能为我生成AST - 解析器会很好,尽管我想使用"官方"的东西.遗憾的是Lambda表达式不够,因为它们不允许我使用语句体,这正是我正在寻找的.
在c#中构建解析器以解析我自己的语言的最佳方法是什么?理想情况下,我想提供一个语法,并将抽象语法树作为输出.非常感谢,内斯特
我正在尝试根据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)