gl5_progのメモ

自分のためのメモとかまとめとか

文法規則の組み立て方と命名について

BNFあるいはyaccANTLRなどで文法を定義する際に初心者として困るのが、文法規則の組み立て方と命名。そこで、いくつかの言語での文法表記を比べてみた。

日本語訳は適当です。

基本的に各式は1つ下の段の式を含んでいます。

(C言語)

備考
式(exp)
代入式(assignment_exp)
条件式(conditional_exp) 条件演算子?:
OR式(logical_or_exp)
AND式(logical_and_exp) "&&"
排他的論理和式(inclusive_or_exp) "||"
排他的論理和式(exclusive_or_exp) "^"
論理積式(and_exp) "&"
等価式(equality_exp)
比較式(relational_exp)
シフト式(shift_expression)
加算式(additive_exp)
乗算式(mult_exp)
キャスト式(cast_exp)
単項式(unary_exp) "&"、"*"、"+"、"-"、"~"、"!"、前置き++など
末尾付加式(postfix_exp) 添字、関数コール()、メンバアクセス.->、後置き++など
1次式(primary_exp) 識別子、定数値、文字列、優先順位変更のカッコ( exp )

(Python)

備考
test 後置きifなど、testって名前だけど実質的に式のルート
or_test
and_test
not_test
comparison "=="、"<"など
expr "|"
xor_expr "^"
and_expr "&"
shift_expr ">>"など
arith_expr 2項"+"、2項"-"
term "*"、"/"、"%"など
factor 単項"+"、"単項"-"など
power **演算、関数コール()、添字、メンバアクセス.など
atom 識別子、数値、文字列、()、、{}囲みなど

(Lua)

  • exp
    • [noname] : 各種定数
    • [noname] : 単項演算
    • [noname] : 2項演算
    • prefixexp
      • [noname] : 優先順位変更()
      • var : 識別子、添字、メンバアクセス.
      • functioncall

実際のルールの適用順が分からなかったので、Luaソースコードを見てみる。

備考
expr
subexpr 単項演算子、2項演算子
simpleexp 各種定数
suffixedexp メンバアクセス.、添字[]など
primaryexp 識別子、優先順位変更()

ちなみLua演算子の優先順序は、各種パース関数の呼び出し順ではなく演算子ごとに優先値をテーブルに持っていて、それにより決まっているようだった。つまり優先順序を変えたい場合、テーブルの優先値の値を書き換えるだけで可能になってるようだ。すごい。

その他

http://en.wikipedia.org/wiki/Operand

  • 単項 : unary (1 operand)
  • 2項 : binary (2 operands)
  • 3項 : ternary (3 operands)