2010-12-19 2 views
1

다음과 같은 문법을 만들었습니다. 자바에서 트리를 반환하는 인터프리터를 만드는 법을 알고 싶습니다. 나중에 화면에서 인쇄 할 때 사용할 수 있습니다. .ANTLR 표현 인터프리터

grammar myDSL; 

options { 
    language = Java; 
} 
@header { 
    package DSL; 
} 
@lexer::header { 
    package DSL; 
} 


program 
    : IDENT '={' components* '}' 
    ; 


components 
    : IDENT '=('(shape)(shape|connectors)* ')' 
    ; 

shape 
    : 'Box' '(' (INTEGER ','?)* ')' 
    | 'Cylinder' '(' (INTEGER ','?)* ')' 
    | 'Sphere' '(' (INTEGER ','?)* ')' 
    ; 

connectors 
    : type '(' (INTEGER ','?)* ')' 
    ;  

type 
    : 'MG' 
    | 'EL' 
    ; 

IDENT: ('a'..'z' | 'A'..'Z')('a'..'z' | 'A'..'Z' | '0'..'0')*; 

INTEGER: '0'..'9'+; 

// This if for the empty spaces between tokens and avoids them in the parser 
WS: (' ' | '\t' | '\n' | '\r' | '\f')+ {$channel=HIDDEN;}; 

COMMENT: '//' .* ('\n' | '\r') {$channel=HIDDEN;}; 

답변

3

발언의 몇 :

기본 대상 언어 자바의 언어를 설정할 필요가 없습니다. 그래서 당신은이를 제거 할 수 있습니다

options { 
    language = Java; 
} 

귀하의 IDENT에 오류가 다음 '0'..'0') 대부분의 아마 '0'..'9')을해야

IDENT: ('a'..'z' | 'A'..'Z')('a'..'z' | 'A'..'Z' | '0'..'0')*; 

.

하위 규칙 (INTEGER ','?)*1 2 3 4과 같은 출처와 일치합니다 (쉼표가 없습니다!). 아마 당신이 할 의미 : (INTEGER (',' INTEGER)*)?

자, 질문 : ANTLR 적절한 AST를 구성하는 방법? 이것은 옵션 블록에 output = AST;을 추가하여 수행 할 수 있습니다

options { 
    //language = Java; 
    output = AST; 
} 

그리고 그 중 하나 "나무 운영자"파서 규칙에 ^!을 추가하거나, 나무 재 작성 규칙을 사용하여 : rule: a b c -> ^(c b a).

"트리 연산자"^은 (하위) 트리의 루트를 정의하는 데 사용되고 !은 (하위) 트리에서 토큰을 제외하는 데 사용됩니다.

다시 쓰기 규칙은 ^(/* tokens here */)입니다. 첫 번째 토큰 (^( 바로 다음)은 (하위) 트리의 루트이고 모든 토큰은 루트의 하위 노드입니다.

예를 들어있을 수 있습니다. 의 첫 번째 규칙을 보자 :

program 
    : IDENT '={' components* '}' 
    ; 

당신은 IDENT 루트, components* 아이들이 될 수 있도록하려면 당신은 나무에서 ={}을 제외 할. 당신은 수행하여이 작업을 수행 할 수 있습니다

program 
    : IDENT^ '={'! components* '}'! 
    ; 

또는으로 일을 :

program 
    : IDENT '={' components* '}' -> ^(IDENT components*) 
    ;