責任編集: (inoue@ist.osaka-u.ac.jp)
言語処理工学A 中間テスト 解答
1 今、古い仕様のあるプログラミング言語Xのコンパイラがある。
このコンパイラは、計算機P6で稼働し、P6の機械語プログラムを出力する。た
だし、その出力されたプログラムの実行効率は低い。
今、Xの新しい言語仕様X’が決められたのを機会に、効率の良いP6の機械語プ
ログラムを出力するセルフコンパイラを作成したい。ただし、X’はXの拡張で、
Xの仕様は完全に含んでいる。
できる限り手で書く部分を容易にかつ少なくして、効率良く開発したい。
(1) 既存のコンパイラをT図式で示せ。ただし、効率の悪いプログラムは、*
をつけて陽に示せ。
X → P6*
P6
(2)目的のコンパイラのT図式を書け。
X’ → P6
P6
(3)手で書くコンパイラのT図式を書け。
X’→ P6
X
(4) 上記(3)から(1)を使って(2)が生成される過程をT図式で示せ。
X’→ P6 X’→ P6
X’→ P6 X X'→ P6 P6
X X → P6* P6*
P6
2 加算 +、 乗算 * 、冪乗 ↑、括弧 ( )、そして数 i を含む式Eを生成する
文法Gが以下のように定められている。
[G]
E → E + E | E * E | E ↑ E | ( E ) | i
常識的な演算の優先順位を持った構文解析結果を得るための、順位関係表を以
下のように作成した。番号の部分に順位の記号 <<、 >>、 ==、 空白( エラー)、
受理のいずれかを入れよ。
i, +, *, ↑, (, ), $
i, >> >> >> >> >>
+, << >> << << << >> >>
*, << >> >> << << >> >>
↑,<< >> >> << << >> >>
(, << << << << << ==
), >> >> >> >> >>
$ << << << << << 受理
i, +, *, ↑, (, ), $
i, 1 >> >> >> >>
+, << >> 2 << << >> >>
*, << >> 3 4 << >> >>
↑,<< >> >> 5 << >> >>
(, << << << << 6 7
), >> >> >> 8 >> >>
$ << << << << << 受理
3 前述2の文法Gと順位関係表を用いて
i + i ↑ i ↑ i
を演算子順位構文解析法で解析する様子を表に示せ。表の形式は、
右文型式 記号列 ハンドル
ステップ0 $i + i ↑ i ↑ i$ $<>+<>↑<>↑<>$ i
ステップ1 $E + i ↑ i ↑ i$ $<<+<>↑<>↑<>$ i
…
とする。
右文型式 記号列 ハンドル
ステップ0 $i + i ↑ i ↑ i$ $<>+<>↑<>↑<>$ i
ステップ1 $E + i ↑ i ↑ i$ $<<+<>↑<>↑<>$ i
ステップ2 $E + E ↑ i ↑ i$ $<<+<<↑<>↑<>$ i
ステップ3 $E + E ↑ E ↑ i$ $<<+<<↑<<↑<>$ i
ステップ4 $E + E ↑ E ↑ E$ $<<+<<↑<<↑>>$ E↑E
ステップ5 $E + E ↑ E$ $<<+<<↑>>$ E↑E
ステップ6 $E + E$ $<<+>>$ E+E
ステップ7 $E$ $$ 受理
4 次の拡張文法Gにたいして、Follow集合と構文解析表を求めよ。
文法G
(0) E'-> E
(1) E -> E + i
(2) E -> E * i
(3) E -> i
また、i+i の構文解析の過程を示せ。
○Follow集合
Follow(E') ={$}
Follow(E) = {$,+,*}
○正準LR(0)集成
I0 E' -> .E
E -> .E + i
E -> .E * i
E -> .i
I1 E' -> E. I0/E
E -> E. + i
E -> E. * i
I2 E -> i. I0/i
I3 E -> E +. i I1/+
I4 E -> E *. i I1/*
I5 E -> E + i. I3/i
I6 E -> E * i. I4/i
○LR(0)オートマトン
E i + *
I0 I1 I2
I1 I3 I4
I2
I3 I5
I4 I6
I5
I6
○構文解析表
action goto
i + * $ E
I0 s2 1
I1 s3 s4 acpt
I2 r3 r3 r3
I3 s5
I4 s6
I5 r1 r1 r1
I6 r2 r2 r2
○構文解析過程
stack input action
initialize
0 i+i+i$
shift 2
0i2 +i+i$
shift 3
0i2+3 i+i$
shift 5
0i2+3i5 +i$
reduce 1,1
0E1 +i$
shift 3
0E1+3 i$
shift 5
0E1+3i5 $
reduce 1,1
0E1 $
accept