2012-02-06 10 views
2

私はlexとyaccを使って命令型言語のコンパイラを開発していましたが、今日は文法を終えました。いくつかのシフト/リダクションの競合があります。特にif/elseステートメントがある場合、それはしばしばdangling if-elseと呼ばれ、mineには/ elsif/elseステートメントがありますが、コンパイル時に競合が発生しません。elsif else文の構文解析

¿doesは、この文法には、シフト/リダクションの競合が発生しないという理由だけで瑕疵があることを意味しますか?私は多くの経験、これを行うに持っていけないが、あなたはこの文法にいくつかのより多くの情報にもし/ ELSIF/else文のために制作をしたい場合、私はそれ

に問題を見つけることができないこのようなものです:

statement -> ... 
------------| initial_conditional_stmt 

initial_conditional_stmt: conditional_stmt 
-----------------------| conditional_stmt 'else' block 


conditional_stmt -> 'if' '(' expression ')' block 
------------------| conditional_stmt elsif '(' expression ')' block 

ブロックは、競合を減らす/いいえシフト括弧{}

+0

FlexとBisonを使ってこのIF-ELSE Parserをチェックしてください。http://c-madeeasy.blogspot.in/2012/05/if-else-statement-is-commonly-used-in.html – techno

答えて

3

内のステートメントのリストだけではありませんあなたは言語設計の本当に良い仕事をしたし、それがあいまいなことはないことを意味します。

よくやって、背中を軽くたたき、リラックスして、冷蔵庫からビールを掴んでください。

+0

読んで、私は平和的にASTで働くことができます、ありがとう! – Alb3rt

+0

これは非常に不完全な答えです。 Dervallの答えには、なぜ矛盾がないのかという、より有用な推論が含まれています。 – Lii

2

あなたがここで他のものを抱えていない理由は、通常のステートメントの代わりにブロックを使用しているためです。あなたの文法については

あなたは

if (cond) 
    if (cond) { 
     [stuff] 
    } 
    else 
    { 
    }  

を行うことができないあなたは、文は内部のマッチングでなければならない場合は、すべてのネストされたこの

if (cond) 
{ 
    if (cond) { 
     [stuff] 
    } 
    else 
    { 
    } 
} 

{}を行う必要があります。これはあなたのケースでは、少し見知らぬ構文を犠牲にして、他のものを取り除きます。 「通常の」文法と比較して、「ブロック」は「文」であり、これは別のif文でもあり得るため、古典的なシフト/縮小の競合が生じる。

+0

最初から私は、最初の例のような条件文を書くことは悪い習慣だと教えられていたので、私は本当にその特定のケースでは考えていませんでしたが、それは良いことだと思います。説明のおかげでブロックの中に! – Alb3rt

+0

「見知らぬ人」を意味しますか? Alb3rtの構文はより強かったようですが、{}と同等のものが構文的に必要なAdaのバックグラウンドから来ています。私はいつも{}をCやそれに類するもので書いています。 –

+0

私は、1つのライナーに対してブレイザーを省略できると期待している中bracers開発者には通常どんなものなのかという文脈では意味がありません。どちらの文法にも問題はありません。 – Dervall

0

方が良い、次のように、これらのコードを使用することがあります。

%nonassoc XIF 
%nonassoc ELSE 

    stmt: IF expr stmt %prec XIF 
     | IF expr stmt ELSE stmt 

あれば、他の間での優先順位の競合を変更するための方法であること。

希望します。