] > Tree(2)

第 8 回 木(2)

本日の内容


このドキュメントは http://edu.net.c.dendai.ac.jp/ 上で公開されています。

8-1. 構文解析

言語と文法

コンピュータで記号列を解釈するには、その記号列がどのようなルールで作ら れているかを知る必要があります。 記号列を生成するルールを文法と言います。 そして、生成される記号列すべての集合を言語と言います。 文法を記号 G で表す時、その文法で生成される言語を L(G) と書くことがあ ります。 なお、記号の集合をアルファベット と言います。 しばしばアルファベットはΣで表されます。 そして、そのアルファベットΣから作られる記号列全体の集合を Σ*で表します。 なお長さが0の記号列(空列)をεで表します。

アルファベット Σ
使用する記号の集合
Σ*
空列を含む生成可能な記号列すべての集合
文法 G
記号列を生成するルール
言語 L(G)
G にしたがって生成される記号列すべての集合

バッカス・ナウア記法

文法の与え方にはさまざまな方法がありますが、ここではバッカス・ナ ウア記法を取り上げます。 バッカス・ナウア記法では生成する文字列を作るアルファベットを終端 記号と言います。終端記号の集合を VT で表します。 一方、それに属さない記号を非終端記号と言います。 非終端記号の集合を VN で表します。 ルールは左辺に一つの非終端記号、右辺は非終端記号と終端記号の列で表しま す。通常は左辺と右辺は ::= や → という記号で結びます。 そして最後に一つ非終端記号を開始記号として指定します。 ルールの集合を P 、開始記号を S としたとき、文法の定義を G= ( VN, VT, P, S) と表します。

このように定義した文法において、つぎのような手順により記号列を生成しま す。

  1. 開始記号を左辺に含むルールを一つ選ぶ
  2. 開始記号をそのルールの右辺に置き換える
  3. 置き換えたものの中から非終端記号を一つ選ぶ
  4. その非終端記号を左辺に含むルールを一つ選ぶ
  5. その非終端記号を右辺に置き換える
  6. すべてが終端記号なら終了、そうでなければ 3 に戻る

簡単のため、左辺が同じルールは、右辺を |(縦棒) で区切って列挙すること で一つにまとめることにします。

文法の例

以下に簡単な文法の例を示します。

G=({文, 主語, 述語, 補語, 名詞句, 動詞, 代名詞, 冠詞, 名詞}, {This, is, a, pen}, P, 文)

P の定義

このようなルールから、 This is a pen という記号列が導けます。

構文解析木

バッカス・ナウア記法による記号列の生成では、一つの非終端記号が複数の 非終端、終端記号に対応します。そして、それに含まれる非終端記号がまた複 数の非終端、終端記号に対応します。 この導出の流れを図にすると、一つの非終端記号が複数の非終端、終端記号に 対応するので、木の構造になります。

A→bCD というルールの場合
ルールの図示

根は開始記号になり、葉は終端記号、葉以外の頂点は非終端記号になります。 与えられた記号列に対して、それの生成手順に対応した木を構文解析木 と言います。 例えば、上の This is a pen という記号列は次のような構文解析木を持ちま す。

This is a pen の構文解析木

一つの記号列について、複数の構文解析木を持つ文法をあいまい であると言います。あいまいな文法はコンピュータで機械的に処理することが できません。 因みに英語はあいまいです。 次の文章の解釈はなんと 4 通りあります。

Time flies like an arrow.

これは、動詞として Time, flies, like の三通りが考えられ、しかも Time が動詞の時は、 like an arrow の前が名詞になるので副詞句の他に形容詞句 になる可能性があるからです。

動詞 like an arrow 構文解析木
Time 副詞句 矢のように蝿の所要時間を計りなさい 矢のように蝿の所要時間を計りなさい
Time 形容詞句 矢に似ている蝿の所要時間を計りなさい 矢に似ている蝿の所要時間を計りなさい
flies 副詞句 時間は矢のように飛ぶ 時間は矢のように飛ぶ
like 副詞句 時間蝿は一本の矢が好きである 時間蝿は一本の矢が好きである

英語の場合、前後の文章や蝿、矢などに関する知識などを利用してふさわしい 訳を選ぶ必要があります。

数式を表す素朴な文法として次の文法 G0= ( { E } , { ( , ) , + , * , 数値 , } , P0, E) を考える。この導出規則 P0 は次の通りとする。

{ n! = n ( n - 1 )! 0! = 1

演習8-1

自然言語の構文解析はとても難しいです。 次の日本語の構文解析木を書きなさい。

  1. これはペンです
  2. すもももももももものうち
  3. きしゃのきしゃはきしゃできしゃした

演習8-2

次の日本語を、前後関係などで構文を意識して、英訳しなさい

  1. わたしはうなぎです。

    これは、料理屋で注文を確認された時に、発言した言葉です。

  2. 私の娘は男だった。

    これは孫の誕生を話題にしている人同士の会話です。

宿題

数式(+, *, カッコ)を処理する文法を定義しなさい。


坂本直志 <sakamoto@c.dendai.ac.jp>
東京電機大学工学部情報通信工学科