言語理論とコンパイラ

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

2014 年 5 月 30日

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

Martin J. Dürst

AGU

© 2005-14 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)

次回への準備