对DSL中字符串的Groovy评估

时间:2012-06-03 23:23:44

标签: groovy dsl evaluate

我正在尝试使用Groovy编写类似BASIC的DSL,我现在处于初期阶段。我有一个简短的脚本(忽略包位,我会在适当的时候重构它):

package Binsic
PRINT "Hello World"

和这堂课:

package Binsic

abstract class BinsicInterpreter extends Script {

static def textArea

static def setTextArea(def window)
{
    textArea = window
}

def PRINT(def param) {
    textArea.append param
}

}

以这种方式打电话:

def engine = new BinsicEngine()
BinsicInterpreter.setTextArea(engine.binsicWindow.screenZX)
def conf = new CompilerConfiguration()
conf.setScriptBaseClass("BinsicInterpreter")
def shell = new GroovyShell(conf)
shell.evaluate(new File("./src/Binsic/test.bas"))

(BinsicEngine此刻只设置TextArea)

此代码失败......

org.codehaus.groovy.control.MultipleCompilationErrorsException:启动失败: /Users/adrian/Documents/workspace-sts-2.9.1.RELEASE/BINSIC/src/Binsic/test.bas:3:意外令牌:Hello World @第3行,第7列。    打印“Hello World”          ^

1错误

但是,如果我将语句更改为PRINT(“Hello World”),它可以正常工作......

类似地,如果我调整PRINT代码来处理非字符串,我可以让PRINT这个工作(即它为此打印内存引用)。但是不需要括号。

为什么不带括号的版本不起作用?我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

问题是大写的PRINT - 或大写的第一个字母(例如Print)。

在Groovy中,省略括号是语法糖,以提供更好的DSL支持。编译器将在允许和不允许的时候有一套规则。

在我的测试中

def Print(String arg) {
    println arg
}
def a = Print "Hello World"

有效,而

def Print(String arg) {
    println arg
}
Print "Hello World"
你发现

失败了。我建议将其作为问题在http://groovy.codehaus.org/上提出。

答案 1 :(得分:1)

似乎与PRINT方法有关。 将它从'PRINT'更改为'foo',它可以正常工作。将其更改为“FOO”,它不起作用。