Я пытаюсь написать 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, чтобы обрабатывать нестрочные. Но никаких скобок не требуется.
Почему не будет работать без взлома? И как я могу это исправить?
Кстати, на данный момент (и, возможно, навсегда) я собираюсь обойти это, написав класс препроцессора, который преобразует входной скрипт во что-то, что Groovy может обрабатывать с комфортом. См. Https://github.com/mcmenaminadrian/BINSIC – adrianmcmenamin