言語理論とコンパイラ

第七回: 文脈自由言語と構文解析

2012 年 6月 1日

http://www.sw.it.aoyama.ac.jp/2012/Compiler/lecture7.html

Martin J. Dürst

AGU

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

目次

前回のまとめ

第一回の宿題

(授業終了後に返却)

前々回からの宿題: Flex

正解例: c_tokens.l (発展問題: c_tokens_advanced.l)

注意点: 浮動小数の正規表現、コメントの正規表現

コメントの正規表現

読みやすさのため、コメントを /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,...

前回の宿題

C プログラム言語など知っている言語やデータ形式の文法を調べなさい (提出不要):

C プログラム言語の文法の例 (yacc 形式; typedef に要注意)

Java プログラム言語の文法 (BNF 形式)

Ruby プログラム言語の文法 (図)

文法の記述の種類

単純な文法

(A|E)BNF

文法規則と BNF

文法規則には色々な書き方がある:

  1. 一番単純な書き方: 書き換え規則の羅列
  2. 同じ左辺の書き換え規則の右辺を | で列挙
    ⇒ 根本的に 1. と変わらない (syntactic sugar/糖衣構文)
  3. 正規表現の ? に相当するもの (あり/無し) の追加 (よく [...] で書く)
    ⇒ 二つの構文規則に分けることが可能
  4. 正規表現の * に相当するもの (よく {...} で書く)
    ⇒ 書き換えが可能

上記の拡張を含む文法規則は BNF (Backus-Naur Form), EBNF (Extended...), ABNF (Augmented...) などという

EBNF の書き換え

M → a {N} b

M → a b | a NList b
NList → N | NList N

文法作成の例

 
 
 
 

文法の作成方法

構文解析の目的

構文解析の難しさ

一般的な構文解析の方法

(Cocke–Younger–Kasami アルゴリズム)

構文解析の結果: 解析木と構文木

解析木 (parse tree, concrete syntax tree):
構文木 (抽象構文木、abstract syntax tree):

解析木と構文木の例

文法:

E → T '+' T    (Expression, 式)

T → F '*' F    (Term, 項)

F → '(' E ')'    (Factor, 因子)

F → integer

入力の例:

5 + 3 * (7 + 2)

解析の実装: 下向き解析と上向き解析

下向き構文解析 (top-down parsing):
解析木を上から (初期記号から) 作る
上向き構文解析 (bottom-up parsing):
解析木を下から (終端記号から) 作る
途中に複数の (小さな) 解析木がある

来週への宿題

ノートパソコンを持参