1

我正在尝试使用 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 @ line 3 ,第 7 列。打印“Hello World”^

1 个错误

但是,如果我将语句更改为 PRINT ("Hello World") 它就可以了...

同样,如果我调整 PRINT 代码来处理非字符串,我可以让 PRINT this 工作(即它打印内存引用)。但不需要括号。

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

4

2 回答 2

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/上将其作为一个问题提出。

于 2012-06-04T00:37:03.573 回答
1

它似乎与大写的 PRINT 方法有关。将它从“打印”更改为“foo”,它就可以工作了。将其更改为“FOO”,它不起作用。

于 2012-06-04T00:47:59.330 回答