我正在尝试使用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这个工作(即它为此打印内存引用)。但是不需要括号。
为什么不带括号的版本不起作用?我该如何解决这个问题?
答案 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”,它不起作用。