第八回: 下向き構文解析の実例
2011 年 6 月 3日
http://www.sw.it.aoyama.ac.jp/2011/Compiler/lecture8.html
© 2005-11 Martin J. Dürst 青山学院大学
(A/E)BNF の書き方
{}
[]
[]
{}
nextToken
と比較5 + 3 * 7
は (5+3) * 7
か 5 +
(3*7)
か問題の例:
E → E '-' E | integer
入力 4 - 5 - 7
に対して複数の解析木が作れる
解析木によって計算結果が違う
解決方法: 文法の書き換え
E → E '-' integer | integer
左再帰の例:
E → E '-' integer | integer
間違った解消 (結合規則が違う):
E → integer '-' E | integer
解消の結果:
E → integer EE
EE → '-' integer EE | ε
これに相当する EBNF:
E → integer {'-' integer}
文法:
正規表現:
正規表現の (簡単な) 規則は文法の (複雑な) 規則一つに相当する
Factor → Functioncall | Variable | Arrayelement Functioncall → Identifier '(' Parameters ')' Variable → Identifier Arrayelement → Identifier '[' Expression ']'
Factor
でどこの規則を選べば良いのか不明⇒ 文法は言語を定義するだけでは不十分
→上向き構文解析 (bottom-up parsing)
bison
の演習のためノートパソコンを持参