2016-09-07 17 views
1

저는 Xtext를 사용하고 있으며 다음 두 가지 문제에 대한 제안이 필요합니다.이 xtext 문법을 가장 잘 쓰는 방법

문제 # 1

내가 세 A, B 및 C 규칙이 있다고 할 수 있습니다. 그리고 b와 c가 한 번만 나타나야 만한다는 것을 제외하고는 이러한 규칙의 순서를 허용하려고합니다. 그런 문법을 쓰는 가장 좋은 방법은 무엇입니까?

root: 
    a+=a* 
    b=b 
    a+=a* 
    c=c 
    a+=a* 
; 
a: 'a'; 
b: 'b'; 
c: 'c'; 

루트 문법을 쓸 수있는 더 나은 방법이 있나요 : 여기

내가 생각 해낸 무엇인가? b와 c는 여전히 엄격한 순서로 이루어져야하는데 이상적인 것은 아닙니다.

문제 # 2

가지고이 문법을 살펴 그러나

a { 
    b { 

    } 

    c { 
     y { 

     } 
    } 
} 

x { 
    y { 
     z { 
      the_end {} 
     } 
    } 
} 

: 같은 아래 언어를 쓸 수 있도록 내가 예상이 문법을 사용

root: 
    any+=any* 
    x=x 
    any+=any* 
; 

any: 
    name=ID 
    '{' 
     any+=any* 
    '}' 
; 

x: 
    name='x' '{' y=y '}' 
; 

y: 
    name='y' '{' z=z '}' 
; 

z: 
    name='z' '{' any+=any* '}' 
; 

, 노드 "y"가 "c"아래에 나타나는 오류가 발생합니다. 왜 그런가요? 이제는 "y"가 규칙 중 하나에서 터미널로 사용 되었기 때문에 문법의 다른 곳에서는 사용할 수 없기 때문입니까?

이 문법을 수정하는 방법은 무엇입니까? 문제 # 1

답변

1

:

root: a+=a* (b=b a+=a* & c=c a+=a*); 

문제 # 2의 경우는이 같은 datatype rule 필요

IdOrABC: ID | 'a' | 'b' | 'c' ; 

을 당신은 name=IdOrABC 대신 name=ID처럼 any 규칙에서 사용합니다.

+0

예 답변을 게시 한 후에도 그렇게 생각했지만 더 이상 추구하지 않고 vaildators를 사용하기로 결정했습니다.그것은 더 나은 선택 같았다. 나는 그것을 시도 할 수 없을지라도 나는 옳은 것처럼 보이기 때문에 대답을 받아 들일 것입니다. –

0

, 우리는 다음과 같은 문법을 조정할 수 있습니다

root: 
    a+=a* 
    (
    b=b a+=a* c=c 
    | 
    c=c a+=a* b=b 
) 
    a+=a* 
; 
a: 'a'; 
b: 'b'; 
c: 'c'; 

을 다른 한편으로는 문제 # 2는 정말 파서가 ID와 구별 할 수 없다으로 문법을 통해 해결 될 수 없습니다 특수 키워드 "x", "y"또는 "z". 아마도 문법을 아래와 같이 단순하게 유지하는 것이 더 나은 전략 일 것입니다. 루트 : any + = any + ;

any: 
    name=ID 
    '{' 
    any+=any+ 
    '}' 
; 

유효성 검사기를 통해 특수 x/y/z 계층 구조를 적용합니다. 문제 # 1

+1

문제 1의 경우, 순서가 "... b ... c"인 결과가 나오는 순서가 "특수한 경우"가 2 개이며 "b"와 "c"만 있기 때문에 해결할 수 있습니다. ..''과''... c ... b ...''. "n"특수한 경우가 있으면 "n!"가능한 순서가있어서 문법을 크게 만듭니다. 따라서 3 ~ 4 가지 특별한 경우에도 정렬되지 않은 그룹을 기반으로 다른 솔루션이 필요합니다. –

+0

정렬되지 않은 그룹을 통해이 작업을 수행하는 방법에 대한 제안 사항이 있습니까? –

+0

물론. 나는 내 대답을 고칠 것이다. –