次: , 前: Precedence, 上: Algorithm


5.4 文脈依存優先順位

しばしば、演算子の優先順位は文脈に依存します。 これは、最初は奇異に感じるかもしれませんが、 実際によく起きていることなのです。 たとえば、通常、減算演算子(`-')は、 単項演算子としては非常に高い優先順位を持ちますが、 2項演算子としては乗除算よりも低い優先順位を持ちます。

Bisonの優先順位宣言、%left%right%nonassocは、 あるトークンに対して1回のみ使え、この方法では、 トークンは唯一の優先順位を宣言されます。 文脈に依存する優先順位のためには、別の方法、すなわち、 %precで規則を修飾する方法が必要になります。

%prec修飾子は、ある規則で使われるべき終端記号の優先順位を指定して、 その規則の優先順位を宣言します。 その記号がその規則の中以外に現れる必要はありません。 修飾子の記法は、次のようになっています。

     %prec terminal-symbol

これは、規則の構成要素の後に書かれます。 これによって、通常の方法で導かれる優先順位に代わって、 terminal-symbolの優先順位を規則に割り当てます。 規則の優先順位が変更されて、その規則が関係している衝突の解決に影響します (see Operator Precedence)。

%precがどのように単項負記号を解決するかを示します。 まず、UMINUSという名前の終端記号に対する優先順位を宣言します。 この型のトークンは存在しませんが、 この記号が優先順位を表現するために使われます。

     ...
     %left '+' '-'
     %left '*'
     %left UMINUS

さて、UNIMISの優先順位を、規則の中で使えます。

     exp:    ...
             | exp '-' exp
             ...
             | '-' exp %prec UMINUS