次: 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