2012-11-27 2 views
1

최종 사용자를 위해 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')

이러한 맞춤 설정을 얻는 가장 좋은 방법은 무엇입니까? 아주 나타내는, 구현은 다를 수 :

+2

[parboiled] (https :// /github.com/sirthias/parboiled) 또는 [antlr] (http://www.antlr.org/)? Groovy DSL로 할 수있는 일이 너무 많아서 자신 만의 연산자를 정의하려고 할 때 느낌이 있습니다. –

+0

antlr의 AntlrParserPlugin은 AST를 작성하는 데 사용됩니다. 방문자 노드에서 무언가를 할 수 있는지 궁금 해서요. 속성 노드를 방문했을 때 또는 아마도 인수 목록 표현식을 방문했을 때 속성 표현식을 변수 표현식으로 바꿉니 까? 나는 이것이 주어진 유스 케이스에 특정하게 만들 것이라는 것을 안다. 그러나 나는 그것에 대해 괜찮다. – Scorpion

답변

1

가장 좋은 방법은 예를 들어 실제로는 백 엔드

을 구현하려면 다음 그루비 사용 (당신이 사용자가 어떤 그루비를 쓰고 싶지 않는 때문에) 사용자 정의 파서를 사용하는 것 위의 snipet를 들어

(left(name,1)='S') 

, 토큰이 방법이 될 수는 : ((VAR : 이름), (발 : 1)), EXP : 같음 발 : 'S' 는 상기지도를 가지고, 인수를 왼쪽 토큰을 동등한 그루비와 동일시하는 백

구문 분석 된 클래스에 대해 구문 분석 된 토큰을 발생 시키십시오. 물론 메소드와 인자는 존재하지 않습니다. 실제 구현으로 변환하는 그루비 기법을 사용하십시오. 1

+0

당신은 당신의 대답에 고기를 추가 할 수 있습니까? 파서를 사용하여 (왼쪽 (이름, 1) = 'S') (왼쪽 (이름, 1) == 'S')로 바꾸라고 조언하고 있습니까? 내가 할 수있는 것은, 내가 한 것은 표현식을 AST로 변환 한 다음 다시 표현식으로 변환하는 쉽고 재사용 가능한 방법이 있는지 찾아내는 것입니다. – Scorpion

+0

네, AST에 연결하는 문제는 커스터마이징이 매우 해킹되고 확장되지 않는다는 것입니다. 사용자 정의 파서를 사용하여 클라이언트 DSL을 사전 처리하고 '='과 같은 특수 표현을 '=='및 기타 특수 기호를 그루비로 변환합니다. 그것을 실행하십시오. 이렇게하면 구문 분석 수준에서 향후 업그레이드를 처리 할 수 ​​있습니다. – winash

관련 문제