次: Parser States, 前: Precedence, 上: Algorithm
しばしば、演算子の優先順位は文脈に依存します。 これは、最初は奇異に感じるかもしれませんが、 実際によく起きていることなのです。 たとえば、通常、減算演算子(`-')は、 単項演算子としては非常に高い優先順位を持ちますが、 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