記号の優先順位
記号とは演算子に限らない
例えば=や;なども含む
演算子の結合の強さを表す
下の行に書くほど優先される
code:y
%left '+' '-'
%left '*' '/' // ←こちらのほうが優先順位が高い
この例では1 + 2 * 3という式は、1 + (2 * 3)と解釈される
%left
左結合
ex. 1+2-3→(1+2)-3
%right
右結合
ex. 1^2^3 → 1^(2^3)
%nonassoc
結合しない
ex. 3<4<5←文法的にエラー
(とかはどうするの?演算子じゃないし
参考
2つの記号の優先順位を比べたいときにどう考えるのが良いか
例えば一般的な*と+を比較したい場合は、記号A,B,..とこれらの記号を並べた列を考えればいい
https://gyazo.com/34add1b0803b3e069c0e90dedb851753
左側の記号列がどの様に解釈されるべきかを、右側で赤の括弧で示している
この赤括弧は通常の(とは異なり、もっとメタな概念
なぜなら、ときに(と,と比べたいときもあるから
下の例より、+<*、ということがわかる
例えば,と[]の優先順位を考える
もし[]>,だとするとこのように解釈され、変になる
https://gyazo.com/a6878a0b177b9a9d51d690934d3e2d8b
なので[]<,であることがあわかる
https://gyazo.com/69987a2d869a8f0c99bfa22c32095f39
コツとしては、最初の列で文法的に意味のあるものにするということ
[と:を比較したいときに下図のように考えたとする
https://gyazo.com/9c357fdb5c83c589d40bfab0c259ba62
上側のA[B:C]Dは、今考えている言語の文法として成立していないので、そもそも正解がわからない
なので、下側のA:B:[]のように正解のわかる列で考えよう
Haskellの話
infixrやinfixlを用いる
ex. infixr 9
数値が大きいほど優先順位が大きい
結合度が強い
行末セミコロンの優先順位
leftとrightの違い
左結合か右結合か