第八回: yacc 系ツールの使い方
2005 年 6月 16日
© 2006 Martin J. Dürst 青山学院大学
提出: 6月16日 (金) 10:45 までに O 棟 529 号室の前; A4 一枚
次の文法の曖昧性を除去し、曖昧性のない文法を提出しなさい。曖昧性がないことを複数の例で確認してください。
E → E '+' E
(Expression, 式)
E → E '*' E
E → '(' E ')'
E → integer
ヒント: 非終端記号の追加が必要
ヒント: 高校とかで覚えた「項」と「因子」を思い出してください。
バックトラックは時間がかかる上、避けた方がいいとされた
次のトーケンしか見なくて良い文法に限定したい
A → variable '=' A |
integer
左再帰の例:
E → E '+' integer | integer
間違った解消 (結合規則が違う):
E → integer '+' E | integer
解消の結果:
E → integer EE
EE → '+' integer EE | ε
文法規則には色々な書き方がある:
上記の拡張を含む文法規則の書き方は BNF (Backus-Naur Form), EBNF (Extended...), ABNF (Augmented...) などという
D → a E* b
⇒
D → a F b
F → F E | ε
プログラム: scanner.h, scanner.c, parser.c
factor → functioncall | variable | arrayelement functioncall → identifier '(' parameters ')' variable → identifier arrayelement → identifier '[' expression ']'
factor
でどこの規則を選べば良いのか分からない簡単な例:
E → F '+' F
F → integer
最左導出の場合にはいつもできるだけ左の終端記号が置き換えられている
スタックを使って読んだトーケンや途中の非終端記号を蓄積
オートマトンを使って出来るだけ簡単な操作で次のステップを決める
(LA)LR 構文解析の二つのオペレーション
(attribute(d) grammar(s)