2011-08-18 1 views
2

XText에서 자체 DSL을 개발 중입니다. 내 현재 .xtext 파일 여기XText로 DSL을 소유하십시오. 무제한 대괄호 ("(", ")") 문제

1 AND (2 OR (3 OR 4)) 

:

내가 같은 것을 할 원하는

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals 

generate myDsl "http://www.xtext.org/example/mydsl/MyDsl" 

Model: 
    (greetings+=CONDITION_LEVEL) 
; 

terminal NUMBER : 
    ('1'..'9') ('0'..'9')* 
; 

AND: 
    ' AND ' 
; 

OR: 
    ' OR ' 
; 

OPERATOR : 
    AND | OR 
; 

CONDITION_LEVEL: 
    ('('* NUMBER (=>')')* OPERATOR)+ NUMBER ')'* 
; 

오전 데 문제가 DSL 무제한 브래킷을 할 수있는 가능성을 가지고 있어야한다는 것입니다, 프로그래머가 열려있는 대괄호를 모두 닫지 않으면 오류가 표시됩니다.

예 :

1 AND (2 OR (3 OR 4) 

하나 브래킷이 누락 -> 오류를 확인해야합니다.

나는 이것이 XText에서 어떻게 실현되는지 모른다. 아무도 도와 줄 수 있니?

thx

답변

3

을이 시도 : 나는 아무 경험이

CONDITION_LEVEL 
    : ATOM ((AND | OR) ATOM)* 
    ; 

ATOM 
    : NUMBER 
    | '(' CONDITION_LEVEL ')' 
    ; 

주 XText로 (그래서 나는 이것을 테스트하지 않았다.) 그러나 이것은 XText가 만들어 졌거나 (아마도 ANTLR 만 사용하는) ANTLR에서 작동한다.

끄트머리는, 당신은 아마 공간으로 운영자 토큰을 포위하기를 원하지만 숨겨진 파서 채널에 넣어하지 않습니다

grammar org.xtext.example.mydsl.MyDsl hidden(SPACE) 

... 

terminal SPACE : (' '|'\t'|'\r'|'\n')+; 

... 
이 같은

그렇지 않으면 소스가 실패 :

1 AND(2 OR 3) 

자세한 내용은 XText 사용자 가이드의 Hidden Terminal Symbols을 참조하십시오.

+0

@SCBoy 또한 '숨겨진 터미널 기호'에 대한 내 발언을 참조하십시오. –

3

구문을 재귀 적으로 만들어야합니다. 기본 아이디어는 CONDITION_LEVEL이 예를 들어 OPERATOR으로 분리 된 두 개의 CONDITION_LEVEL 일 수 있다는 것입니다.

나는 당신이 할 수있는 xtext 구문의 세부 사항을 알고 있지만, BCNF와 같은 구문을 사용하지 않습니다

CONDITION_LEVEL: 
    NUMBER 
    '(' CONDITION_LEVEL OPERATOR CONDITION_LEVEL ')'