言語理論とコンパイラ

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

2013 年 6 月 7日

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

Martin J. Dürst

AGU

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

今日の内容

前回のまとめ

前々回からの宿題: Flex

    [ 削除 ]

追加: C のコメントの正規表現

読みやすさのため、コメントを /x x/ にし、スペースを使用

第一案: /x .* x/ 問題: /xx/ /xx/ をまとめて認識

第二案: /x [^x]* x/ 問題: /xxx/ を認識しない

第三案: /x ([^x]|x[^/])* x/ 問題: /x xx/ /x x/ をもとめて認識

第四案: /x ([^x]|x+[^/])* x/ 問題: 以前と同様

第五案: /x ([^x]|x+[^/x])* x/ 問題: /x xx/ を認識しない

第六案: /x ([^x]|x+[^/x])* x+/ 完成!

参考: Mastering Regular Expressions, Jeffrey E.F. Friedl, pp. 168,...

下向き解析の一般概要

バックトラックの要点

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

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

再帰的下向き構文解析

 

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

プログラム: 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)

次回への準備