2017-03-13 2 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は中括弧で囲まれたサブクラスを持つことができるため、中括弧の後にカンマは必須ではありません。

これは、私は次のように表現する文法を必要とする意味:

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

私は含むルールを参照することはできませんので、クラスの内部クラスルールの参照が機能しません。私はこの問題のための単純な解決策があると私は確信しています。

編集:私はlookbehindが解決策であると信じます。しかし、これはXTextで支持されていないように思えます。

答えて

2

あなたは `適切ではない、以下の(+非常に最後のコンマの検証)あなたの場合

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

' {B {}} I'が許可されているが、 'A {}のような何かを試すことができます? –

+0

私はちょうど 'ClassAtEnd'をオプションとして使用し、もう一つの時間は使用しないことを言いたいと思います。 –

+0

良いキャッチ、あなたは正しいです –

関連する問題