言語理論とコンパイラ

第八回: 下向き構文解析の実装

2015 年 5 月 29日

http://www.sw.it.aoyama.ac.jp/2015/Compiler/lecture8.html

Martin J. Dürst

AGU

© 2005-15 Martin J. Dürst 青山学院大学

今日の内容

前回のまとめ

前回の残り

下向き解析の一般概要

バックトラックの要点

バックトラックの遅さへの対策:

次のトークンしか見なくてよい文法に限定した方が望ましい

再帰的下向き構文解析

(recursive decent parsing)

 

下向き構文解析の実装: 簡単な手作りコンパイラ

プログラム: scanner.h, scanner.c, parser1.c

コンパイルと実行: gcc scanner.c parser.c && ./a

再帰的下向き構文解析の詳細: 字句解析

(scanner.c 参照)

再帰的下向き構文解析の詳細: 構文解析

(parser1.c 参照)

 

再帰的下向き構文解析の詳細: 非終端記号

左再帰の問題と解決

(left recursion)

左再帰の例:

E → E '-' integer | integer

間違った解消 (結合規則が違う):

E → integer '-' E | integer

解消の結果:

E → integer EE

EE → '-' integer EE | ε

これに相当する EBNF:

E → integer {'-' integer}

文法と正規表現の違い

文法:

正規表現:

正規表現の (簡単な) 規則は文法の (複雑な) 規則一つに相当する

 

下向き構文解析の問題点

文法の追加条件

解析方法によって、文法への条件が増える:

⇒ 文法は言語を定義するだけでは不十分

結論

→上向き構文解析 (bottom-up parsing)

今週の宿題

提出期限と場所: 2015 年 6月 7日 (木) 19:00 まで O 棟 5 階の O-529 号室の前の箱に投入

形式: A4 一枚 (裏も使用可、数枚必要でしたら左上保知傷止め、表紙は不要、名前・学生番号はプログラムの最初のコメントに)

  1. 下向き構文解析の実装を拡張し、四則演算が正しいプログラムを作成しなさい (parser.c のみ提出)
  2. (発展問題) 他に可能な演算を考え、追加してください。(変更したファイルを全て提出; 1. と同じファイルでよい)

次回への準備