2016-11-10 20 views
0

文法は少し違っています。それは1つのルール(巨大なもの)を持つ文法です。 Xtextを使ってこの文法を表現する方法はわかりませんが、これは学問的な作業であり、要件を指定する言語です。文法の左回帰呼び出しエラーと翻訳

と私のイライラの試みを以下に示します:記事から得た元の文法は、ある

Relax: 
root+=General+; 

//nao tinha o tipo boleano 
terminal BOOLEAN returns ecore::EBoolean: 
    'true'|'false' 
; 

General: 
    root+=BOOLEAN|STRING|ShallOperator|MayOperator|EventuallyOperator|UntilOperator|BeforeOperator|AfterOperator|InOperator; 


ShallOperator: 
    'shall' elements=General; 


MayOperator: 
    "may" action1=General 'or' action2=General; 

EventuallyOperator: 
    'eventually' element=General; 

UntilOperator: 
// {General.left=current}'&' right=General; 
// ({General.left=current}) 'until' element2=General; 
left=General 'until' right=General; 

エラーがで起こる「このルールの呼び出しは、再帰呼び出しグラフの一部です」最後の行

このエラーの他に、文法の「正しい」部分であっても正しい結果が得られません。

が、私はエラーを探し、私は問題を理解することができませんでした、私はまだ初心者ですので、私は2つの質問があります:

が、それは私が文法を変換する方法は正しいですか?

この左回帰誤差を解決するにはどうすればよいですか?

ボーナスの質問:研究のための資料(私はすでに公式文書を読んでいます)。

助けを歓迎します。

ありがとうございます。

答えて

0

左ファクタリングの "デフォルト" XTEXTの方法が役立つはず

Relax: 
root+=General+; 

terminal BOOLEAN returns ecore::EBoolean: 
'true'|'false' 
; 

General: 

root=Rest =>({UntilOperator.left=current}'until' right=General)*; 

Rest: 
Primitive|ShallOperator|MayOperator|EventuallyOperator 
; 

Primitive: 
BooleanValue | StringValue 
; 

BooleanValue: 
value=BOOLEAN 
; 

StringValue: 
value=STRING 
; 


ShallOperator: 
'shall' elements=General; 

MayOperator: 
"may" action1=General 'or' action2=General; 

EventuallyOperator: 
'eventually' element=General; 
関連する問題