文法と優先順位の多くの説明は、事業者が優先順位を持つというのショートカットを取るので、あなたは混乱になってきました。彼らはしません。それは文法の中で優先順位がついているプロダクションであり、他のプロダクションと比較して優先順位があります。文法があいまいである(同じ入力に対して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
他のパーズツリーは使用できません。 +
プロダクションとメッセージ送信プロダクションの間に優先順位の関係を指定する必要はありません。文法は他の方法でこの入力を解析できないため、それらの間に優先順位の関係を指定しても効果はありません。
ObjC言語仕様(公開されています)はありません。そのための書類はありません。その答えは、コンパイラが何をしていても同じです。 –
これを知りたいと思う特別な理由はありますか? –
メッセージ送信構文は、最初は演算子ではないため、演算子のテーブルに配置しようとするのは無意味です。 –