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

Phu*_*ong 17 syntax groovy abstract-syntax-tree

我正在尝试构建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)

这是解析器中的错误吗?

tim*_*tes 16

抓取只能作为注释应用于某些目标

@Target(value={CONSTRUCTOR,FIELD,LOCAL_VARIABLE,METHOD,PARAMETER,TYPE})
Run Code Online (Sandbox Code Playgroud)

所以你需要注释其中一个(就像你看到的那样)

遗憾的是,Java(以及Groovy)中的注释只是出现在代码中间.

  • 你说的是有道理的,但我想从一个常识的角度来看,上面的例子仍然有效,因为有很多隐含的东西被创造出来,包括一个类型和方法.它没有出现在代码中间,但我可以理解词汇有些问题. (2认同)