2017-03-23 15 views
1

プログラミング言語クラスでは、演算子の優先順位と結合性を学びました。下には、上記の文脈自由文法を使用することにより文脈自由文法プログラミング言語の演算子優先度

<expr> -> <expr> + <term> | <term> 
<term> -> <term> * <fact> | <fact> 
<fact> -> (<expr>) | a 

シンプルで、我々は

a+a+(a+a) 

は、私が思うの文を作ることができ、操作の順序は次のように行われるべきです次のようにしてください:(a + a) - > a + a、次にプラス。しかし、講義では、教授は(a + a) - > a + aと a + a - >(a + a)の順序が正しいと言いました。学生は慌てている。でも以下の文章では、

(a+a)+((a+a)) 

両方の順序が((A + A)) - >(A + A)をプラスと(A + A) - >((A + A))が正しいです。 彼は、構文解析ツリーを作成した後、アセンブリ言語 に変換したので、順序はコンパイラによって異なります。

私は彼の説明を理解していません。 誰かがなぜ2つの可能な順序があるのか​​説明できますか?

+1

与えられた文法はあいまいであることに注意してください。 ' + 'はおそらく ' * 'であるべきです。 –

+0

@MichaelDyckが正しい。私のタイプミス –

答えて

1

評価の順序はグループ化とは関係ありません。 X + YXYはサブ式です)を計算する必要がある場合は、最初にtemp2 = Yを計算してからtemp1 = Xを計算するかどうかは関係ありません。最後にtemp1 + temp2に同じ値があります。

右側の引数を最初に計算する方が便利な場合があります。 (たぶん、あなたはすでに、たとえば、以前の計算からそれを知っている。)

XまたはYの計算を考慮することが必要になる場合があります副作用がある場合。いくつかの言語は、副作用が左から右に起こることを主張している。他のものは任意の順序を許す。しかし、括弧のグループ化は、計算ののに影響しません。それは計算されるものだけを決定します。

関連する問題