2017-03-13 15 views
0

XText를 사용하여 DSL을 작성하는 데 어려움이 있습니다. 우리는이 같은 뭔가를 구문 분석한다고 가정하자XText 룩어 힌드가있는 DSL

A { 
    B, //this comma is needed 
    C, 
    D {E}, //comma is optional after a closing curly brace 
    F {G} 
    H 
} 
I, 
J 

그것은 모델 클래스의 목록이 들어있는 유형 모델 및 클래스로 표현되어야한다.

는 내가 현재 가지고 할 것은 :

Model: (classes += Class)* 
Class: name = ID ('{' (subclasses += Class) (',' subclasses += Class)* '}')? 

이 클래스는 쉼표로 구분해야하는 경우, 그들로부터 독립적 인 서브 클래스를 가지고 여부를 작동합니다. 그러나 클래스는 중괄호로 묶인 하위 클래스를 가질 수 있으므로 닫는 중괄호 뒤에 쉼표는 필수 항목이 아닙니다. 내가 포함하는 규칙을 참조 할 수없는 생각 때문에, 클래스 내부 클래스 규칙 참조가 작동하지 않습니다

Class: ID (',' Class | '{' subclasses += Class '}' ','? Class)? 

:

이 나는 ​​다음과 같은 표현 문법이 필요 의미합니다. 내가 볼 수없는이 문제에 대한 간단한 해결책이 있다고 나는 믿는다.

편집 : 나는 lookbehind가 해결책이 될 것이라고 믿습니다. 그러나 XText에서 지원되지 않는 것 같습니다.

답변

2

당신은 당신의 사건의`{B는 {}} I`이 허용되지만,의`{}`옳지 않다에서 다음 (맨 마지막 쉼표에 대한 + 검증) 같은

Model: 
    ((classes+=ClassWithBraces|classes+=ClassWithComma)* classes+=ClassAtEnd?); 

ClassWithComma returns Class: 
    name=ID "," 
; 

ClassWithBraces returns Class: 
    name=ID =>("{" ((classes+=ClassWithBraces|classes+=ClassWithComma)* classes+=ClassAtEnd?) "}") ","? 
; 

ClassAtEnd returns Class: 
    name=ID 
; 
+0

을 시도 할 수 있습니다 ? –

+0

방금 ​​한 번만 'ClassAtEnd'를 옵션으로 사용하고 다른 시간은 사용하지 말라고 말씀 드리고 싶습니다. –

+0

좋은 캐치, 당신은 맞습니다 –