2012-06-03 3 views
1

Я пытаюсь написать BASIC-подобную DSL, используя Groovy, и я нахожусь на очень ранней стадии. У меня есть небольшой сценарий (игнорировать бит пакета, я рефакторинг, что далеко в свое время):Оценка Groovy строк в 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. PRINT "Hello World" ^

1 ошибка

Но если я изменяю заявление Print ("Hello World") он работает ...

Аналогично, я n получите ПЕЧАТАТЬ это, чтобы работать (т. он печатает ссылку на память для этого), если я отредактирую код PRINT, чтобы обрабатывать нестрочные. Но никаких скобок не требуется.

Почему не будет работать без взлома? И как я могу это исправить?

+0

Кстати, на данный момент (и, возможно, навсегда) я собираюсь обойти это, написав класс препроцессора, который преобразует входной скрипт во что-то, что Groovy может обрабатывать с комфортом. См. Https://github.com/mcmenaminadrian/BINSIC – adrianmcmenamin

ответ

1

Проблема заключается в том, что первая буква ПЕЧАТИ - или в верхнем регистре - любая (например, Печать).

В 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/.

+0

Спасибо, я подниму его в списке пользователей Groovy как потенциальную ошибку/особенность языка. – adrianmcmenamin

1

Кажется, что это связано с тем, что метод PRINT является верхним. Измените его с 'PRINT' на 'foo', и он работает. Измените его на «FOO», и он не работает.

Смежные вопросы