2016-04-13 2 views
0

Я хочу написать заводной DSL с синтаксисом:Составление настройщик не вызывается во время компиляции заводной DSL сценария

returnValue when booleanCondition 

Я хочу использовать компиляции настройщиков, чтобы преобразовать это выражение к типичным, если оператор возврата с использованием AST преобразований ,

Для этого сценария:

2 when 1 == 1 

Я получаю сообщение об исключении:

MultipleCompilationErrorsException: startup failed: 
Script1.groovy: 1: expecting EOF, found '1' @ line 1, column 8. 

Я не понимаю, почему мой сборник настройщик не называется вообще? Мне нужно, чтобы он был вызван перед компиляцией, поэтому я могу превратить его в действительный код groovy.

Если скрипт содержит действительный код groovy, то вызывается мой компилятор.

Мой код:

class MyDslTest { 

    public static void main(String[] args) { 
     String script = '''2 when 1 == 1 
''' 
     def compilerConfig = new CompilerConfiguration() 
     compilerConfig.addCompilationCustomizers(new MyCompilationCustomizer()) 
     GroovyShell groovyShell = new GroovyShell(compilerConfig) 
     groovyShell.evaluate(script) 
    } 
} 

class MyCompilationCustomizer extends CompilationCustomizer { 

    MyCompilationCustomizer() { 
     super(CompilePhase.CONVERSION) 
    } 

    @Override 
    void call(SourceUnit source, GeneratorContext context, ClassNode classNode) throws CompilationFailedException { 
     println 'in compilation customizer' 
    } 
} 

ответ

2

Проблема заключается в том, что ваш код не является синтаксически правильным. Настройщик компиляции не будет работать так: чтобы иметь возможность получить AST, на котором будет работать customizer, вы должны создать синтаксически правильный код. Один из вариантов заключается в использовании другого AntlrParserPlugin, но в целом я не рекомендую это делать, потому что он будет модифицировать источники до синтаксического анализа и, следовательно, создать несоответствие между AST и фактическим источником.