2016-09-07 9 views
1

私はXtextを使用しており、次の2つの問題についての提案が必要です。このxtext文法を書ける最良の方法

問題#1

は、私は3は、b、cのルール考えてみましょう。そして、私はこれらの規則の任意のシーケンスを許可したいが、bとcは一度だけ現れなければならない。どのように文法を書くのが最善でしょうか?ルート文法を書くためのより良い方法はあり

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

:ここ

は私が思い付いたのですか? bとcは依然として厳密な順序でなければならず、理想的ではない。

問題#2

はこの文法を見てください:

私は以下のような言語を書くことができると期待この文法を使用
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* '}' 
; 

a { 
    b { 

    } 

    c { 
     y { 

     } 
    } 
} 

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

しかし、 "y"が "c"の下に表示されるため、エラーが発生します。何故ですか?それは "y"がルールの1つの端末として使用されたので、それは文法のどこにも現れないからですか?

この文法を修正するにはどうすればよいですか?問題#1の

答えて

1

:問題#2の

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

あなたはこのようなdatatype rule必要があります。

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

を、あなたはname=IdOrABC代わりのname=IDようなあなたのanyルールでそれを使用する必要があります。

+0

はい私は自分の答えを投稿した後もそれを考えましたが、それ以上追求しておらず、その代わりに美容師を使用することを決めました。それはより良い選択のように思えました。私はそれを試すことができなくても、正しいと思われるのであなたの答えを受け入れます。 –

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については、順序付けされていない2つの順序 "b ... c"をもたらす2つの順序付けられていない "特殊なケース" "b"および "c"のみがあるため、 .. ''と '' ... c ... b ... ''。 しかし、 '' n''という特殊なケースがあると、 '' n! ''の順序が可能になり、文法が巨大になります。したがって、3つまたは4つの特殊なケースでも、順序付けられていないグループに基づいて異なるソリューションが必要になります。 –

+0

順序付けられていないグループを使ってこれを行う方法について提案はありますか? –

+0

もちろん。私は私の答えを修正します。 –

関連する問題