최종 사용자를 위해 groovy 위에 구축 된 표현 엔진을 노출하려고합니다. 나는 어떤 스타일 키워드를 능가하고 사용자는 평가를 위해 그 키워드 (런타임에 대체 될 필요가 있음) 내에서 변수를 사용할 수 있습니다. 예를 들어 정적 키워드 FIRSTCHAR (varName)은 문자열의 첫 번째 문자를 반환합니다. 나는이 일을 어떤 식 으로든 할 수있다.그루비를 사용하는 표현 엔진
현재 구현 나는
class MyGroovyClassLoader extends GroovyClassLoader {
protected CompilationUnit createCompilationUnit(
CompilerConfiguration config, CodeSource source) {
CompilationUnit cu = super.createCompilationUnit(config, source);
cu.addPhaseOperation(new PrimaryClassNodeOperation(){
@Override
public void call(SourceUnit source, GeneratorContext context, ClassNode classNode)
throws CompilationFailedException {
source.getAST().getStatementBlock().visit(visitor);
}
}, Phases.SEMANTIC_ANALYSIS);
return cu;
}
}
방문자가 다음 정적 표현과 변수 표현을 인식 같은 오버라이드 (override) PrimaryClassNodeOperation 뭔가로 컴파일 단위를 만들 수 그루비 클래스 로더를 무시했다. 그러나이 방법을 사용하면 어려움을 겪고 있습니다
1) 점이 속성 식으로 간주되기 때문에 점 (.)으로 변수 이름을 지원합니다. 이 단계에서 속성 식을 변수 식으로 유지할 수 있습니까?
2) 또한, 같은 식의 (좌측 (이름, 1) == 'S'& & 오른쪽 (이름, 1) == 'N')의 이름의 첫 문자가 S이고, n은 마지막] - equal을 double equals가 아닌 single equals로 확인하고 & & 또는 .and() 대신에/AND를 확인하여 (left (name, 1) = 'S'및 right (name, 1) = 'n')
이러한 맞춤 설정을 얻는 가장 좋은 방법은 무엇입니까? 아주 나타내는, 구현은 다를 수 :
[parboiled] (https :// /github.com/sirthias/parboiled) 또는 [antlr] (http://www.antlr.org/)? Groovy DSL로 할 수있는 일이 너무 많아서 자신 만의 연산자를 정의하려고 할 때 느낌이 있습니다. –
antlr의 AntlrParserPlugin은 AST를 작성하는 데 사용됩니다. 방문자 노드에서 무언가를 할 수 있는지 궁금 해서요. 속성 노드를 방문했을 때 또는 아마도 인수 목록 표현식을 방문했을 때 속성 표현식을 변수 표현식으로 바꿉니 까? 나는 이것이 주어진 유스 케이스에 특정하게 만들 것이라는 것을 안다. 그러나 나는 그것에 대해 괜찮다. – Scorpion