我正在尝试使用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这个工作(即它为此打印内存引用) . 但是不需要括号 .
为什么不带括号的版本不起作用?我该如何解决这个问题?
2 回答
问题是大写PRINT - 或大写首字母任何东西(如Print) .
在Groovy中,省略括号是语法糖,以提供更好的DSL支持 . 编译器将在允许的时间和不允许的时候有一组规则 .
在我的测试中
工作,而
你发现失败了 . 我建议将其作为http://groovy.codehaus.org/的问题提出来 .
它似乎与PRINT方法有关 . 将它从'PRINT'更改为'foo',它可以正常工作 . 将其更改为“FOO”,它不起作用 .