2013-03-12 7 views
6

大括弧[]を使用するObjective-Cメッセージ式(メッセージ記法)演算子は、大括弧[]を使用する配列添字のC演算子と同じ優先順位を持ちますか?メッセージ式/表記として使用される角括弧のObjective-C演算子の優先順位?

私はthis table of C operatorsを参照しています。

また、「参照による要素選択」のC演算子と比較して、アクセサーメソッド呼び出しのObjective-C「ドット構文」演算子にも同様の質問が適用されます。彼らは同じ優先順位を持っていますか?

私はこの基本的な質問に対する簡単で決定的な答えを1時間探しました。驚いたことに、私は見つけませんでした。したがって、この質問。リンクは大歓迎です。

+0

ObjC言語仕様(公開されています)はありません。そのための書類はありません。その答えは、コンパイラが何をしていても同じです。 –

+0

これを知りたいと思う特別な理由はありますか? –

+2

メッセージ送信構文は、最初は演算子ではないため、演算子のテーブルに配置しようとするのは無意味です。 –

答えて

7

文法と優先順位の多くの説明は、事業者が優先順位を持つというのショートカットを取るので、あなたは混乱になってきました。彼らはしません。それは文法の中で優先順位がついているプロダクションであり、他のプロダクションと比較して優先順位があります。文法があいまいである(同じ入力に対して2つの異なる構文木を生成できることを意味する)場合には、2つのプロダクションが互いに優先順位を持つだけであり、一方のプロダクションの優先順位を他方のプロダクションよりも高く指定することによってあいまいさが解決される。

例を説明しましょう。

は、ここでおもちゃの文法です:

expression = 
    | IDENTIFIER 
    | NUMBER 
    | expression '+' expression 
    | expression '*' expression 
    | expression '(' expression ')' // function call 
    | '(' expression ')' // grouping 
    | expression '[' expression ']' // array subscript 
    | '[' expression IDENTIFIER ':' expression ']' // message send 
    ; 

さて、この文法で1 + 2 * 3を解析することを検討してください。 2本の有効な解析木があります。

+    * 
/\   /\ 
1 *   + 3 
/\  /\ 
    2 3  1 2 

*生産は、我々は代わりに右の木の左側のツリーを生成するパーサを必要とし、+生産よりも優先順位が高いことを指定します。したがって、+プロダクションと*プロダクションの間の優先順位関係の考え方は意味を成しています。パーザの出力に影響を与えます。だから、もう一度「+」生産と生産が理にかなっている関数呼び出しの間の優先順位関係のアイデアを

+    () 
/\   /\ 
1 ()   + 3 
/\  /\ 
foo 3  1 foo 

同様に、1 + foo(3)は2本の構文木を持っています。 1 + foo[3](関数呼び出しの代わりにサブスクリプトのプロダクションを使用する)の場合も同様です。したがって、 '+'プロダクションとサブスクリプトのプロダクションの間に優先順位の関係を指定することは理にかなっています。

1 + (2 * 3)を検討してください。この入力を解析する唯一の方法がありますので、

+ 
/\ 
1 () 
    | 
    * 
/\ 
    2 3 

+生産とグループ化生産との優先順位の関係のための必要はありません:文法は唯一の可能な構文解析ツリーを生成することができます。グループ化プロダクションが+プロダクションより高い優先度を持つことを指定することは意味がありません。そうすることによって生成できる他のパーズツリーがないためです。

最後に、1 + [2 add:3]と考えてください。これは、グループ化の例に似ています。可能な解析ツリーは1つだけです。

+ 
/\ 
/ \ 
1 [ ] 
/| \ 
/| \ 
2 add 3 

他のパーズツリーは使用できません。 +プロダクションとメッセージ送信プロダクションの間に優先順位の関係を指定する必要はありません。文法は他の方法でこの入力を解析できないため、それらの間に優先順位の関係を指定しても効果はありません。

+1

コンピューティングの科学、コンパイラの設計と解析を知っていた人が私の質問が無意味であった理由を説明してくれるのではないかと心配しました。あなたの答えは私の恐怖に直面することの苦労に値するものです。 – Jeff

+0

@robmayoff素敵な説明です。高槻 –

1

これらは同じ優先グループに属します。私は、send []メッセージは、()の場合と同等であると信じています。

http://www.techotopia.com/index.php/Objective-C_2.0_Operator_Precedence

+0

私はそのTechotopiaのページを見つけましたが、そのサイトはスパムですので、私はその情報を信頼しませんでした。 – Jeff

関連する問題