首页 文章

对DSL中字符串的Groovy评估

提问于
浏览
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这个工作(即它为此打印内存引用) . 但是不需要括号 .

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

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/的问题提出来 .

  • 1

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

相关问题