言語理論とコンパイラ

第七回: 下向き構文解析の原理

2015 年 5月 22日

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

Martin J. Dürst

AGU

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

目次

前回のまとめ

文法の記述の種類

単純な文法

BNF

文法規則と BNF

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

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

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

BNF の書き換え

M → a {N} b

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

文法の作成手順

  1. 言語の簡単な実例を記述
  2. 実例をトークンの種類に変更 (字句解析の結果)
  3. 実例の現象を命名 (例: ...式、...文など)
  4. 書き換え規則の案
  5. もうちょっと複雑な例で使えるかどうかを検討、修正

文法作成の例

 
 
 
 

構文解析の目的

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

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

解析木と構文木の例


 
 
 
 
 

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

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

構文解析の難しさ

一般的な構文解析の方法

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

宿題

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

形式: A4 一枚 (裏も使用可)

下記の問題で、n, +, -, *, / が終端記号、残りが非終端記号。n が任意の数値で、残りの終端記号がそれぞれ四則演算を表す。

  1. 次の三つの文法でそれぞれ長さ 5 の作成可能な語全ての解析木を作成しなさい。三つ文法の内、正しい計算結果に結びつく解析木しか作れない文法を特定しなさい。
    1. E → n | E - E
    2. E → n | n - E
    3. E → n | E - n
  2. 次の四つの文法で問題 1. と同様
    1. E → n | E + E | E * E
    2. E → n | E + n | E * n
    3. E → n | T + T; T → n * n
    4. E → T | T + T; T → n | n * n
  3. (発展問題) 問題 1. と 2. で得た知見を使って、(括弧なしの) 四則演算を正しい計算に乗るように構文解析できる文法を作ってみて、長さ 5 の語で検収しなさい。
  4. ノートパソコンを次回の需要に持参しなさい。