Transcript PPT

コンパイラ
2012年10月15日
酒居敬一@A468([email protected])
http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/COMP/2012/index.html
1
字句解析(Lexical Analysis)
文字や文字の並びを、意味の有る字句として認識する。


自然言語では単語に分解することに相当する。
文法に基づき、予約語・識別子・演算子などに分解する。


識別子が関数名なのか変数名なのかは区別しない。


あくまで、単語に分解するだけである。
分解されたものは、文法上の構成単位である。
構文解析器の要求により動作する。



字句の要求に対する、字句への分解と字句の出力。
ソースプログラムからの文字の読み取り。


2
ファイルからのソースプログラムの読み込み。
読み込んだソースプログラムのバッファリング。
[条件式]
式
式
==
[加減演算子]
!=
>
>=
<
<=
[乗除演算子]
+
-
[返戻型]
*
/
[数字]と[英字]は非終端記号なので、
本来はそれらも終端記号に至るまでの
定義が必要。しかし、省略されている。
前回のBNFの例でも省略されている。
要素型
void
英字
[識別子]
英字
数字
[整数]
3
数字
[要素型]
int
バッカス記法(Backus Naur Form, BNF)
<>で囲まれたものを構文要素と呼ぶ。



例では字句を定義しているが、字句解析済みの場合もある。
Javaのように名前に日本語文字集合が使える場合は、
こんなに単純に記述できない。ASCII文字集合なら簡単。
→の左側の要素は右側で構成される。
|は「または」を意味する。


<数字>→0|1|2|3|4|5|6|7|8|9
<英字>→a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z
|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z
<名前>→<英字>|<名前><英字>|<名前><数字>
4
有限オートマトン
名前などの字句は正規表現で定義できる。
つまり、正規言語で表せる。
入力の文字列が正規言語に含まれるかどうか?



それを判定する仮想機械を有限状態オートマトンと呼んでいる。
[定義 3 . 3 ]有限状態オートマトン
1 状態の集合 S
 2 入力文字の集合
3 状態と記号の対を、次
 4 S の特定の要素である開
5 S の部分集合である最終

5
の要素
の状態の集合へ遷移す
る状態遷移関数
始状態 S 0
状態 F
開始状態から出発し、文字列を1文字ずつ読んでいきながら、
状態遷移関数によって状態を変化させていく。
最終的に最終状態に到達すれば、受理された、ということになる。
非決定性有限オートマトン(NFA)
ある状態で、ある入力に対して、複数の遷移先がある。


入力によらない遷移もある。

遷移してもしなくてもいい。ε遷移
正規表現からNFAを作る例。

(3)a|b
(1)ε空列記号
a
ε
b
(2)アルファベットの集合Aの要素a
a
(4)ab
a
ε
(5)a*
ε
a
ε
6
ε
b
a(b|c)* の例
ε
1
ε
2
a
3
ε
4
ε
0
a
1
a
2
3
b
これら3つを合成する。
ε
0
a
1
ε
2
b
c
ε
7
3
ε
4
決定性有限オートマトン(DFA)


NFAではε遷移など、考えうるすべての状態遷移を
考慮して字句解析するのは効率が悪い。
NFAから非決定的な遷移を取り除いたものがDFA。

ある状態から、入力によって遷移する先はたかだか一つ。
[定義 3 . 4 ]決定性有限オートマト
1 による遷移がない。
 2 ひとつの状態から同じ

8
ン
記号による異なった状
態への遷移はない。
NFAからDFAへ変換するアルゴリズムが存在する。
NFAからDFAへの変換
同じ状態から遷移する状態をまとめた状態集合を作成。
1.

0
εでたどれる先もまとめること。
a
1
ε
2
a
1,2
状態の集合からの遷移を作成。ここでも、同じ状態
からの遷移先が複数ある場合は、遷移先をまとめる。
2.
0
a
1
ε
2
b
c
4
b
3
9
0
0
a
1,2
c
4
b
5
3,5
a(b|c)*の、NFAからDFAへの変換例
ε
0
a
1
ε
b
2
ε
3
c
ε
b
b
0
a
1,2, 4
c
2,3,4
b
c
2,3,4
c
10
4
b
b
0
a
1,2, 4
c
2,3,4
b
c
2,3,4
c
b
0
a
1,2,3,4
c
詳しくは、参考文献を見ること。
「コンパイラの構成と最適化」
中田育男著 オーム社
院の講義で使う教科書なので、
図書館にある。
11
字句読み取りの例

簡単な浮動小数点数を定義する。
[浮動少数数点定数の構文規則]
〈浮動小数点定数〉
→
〈小数点定数〉(ε|〈指数部〉)|〈数字列〉〈指数部〉
〈小数点定数〉
→
(ε|〈数字列〉).〈数字列〉|〈数字列〉.
〈指数部〉
→
e(ε|〈符号〉)〈数字列〉
〈符号〉
→
+|-
〈数字列〉
→
〈数字〉|〈数字列〉〈数字〉
〈数字〉
→
0|1|2|3|4|5|6|7|8|9
[浮動小数点定数の正規表現]
〈浮動小数点数〉→
((ε|dd*).dd*|dd*.)(ε|e(ε|+|-|)dd*)|dd*e(ε|+|-)dd*
12
浮動小数点定数のNFA
d
1
ε
d
ε
2
.
3
d
ε
4
5
e
7
+
d
d
8
9
d
ε
.
ε
ε
d
d
0
6
f
d
ε
ε
d
10
e
11
+
-
13
d
12
d
13
浮動小数点定数のDFA
3
d
.
d
0,2
d
1,2, 6,10
.
3,5,f
d
4,5,f
e
-
7,8
e
e
-
d
12
d
d
8
d
+
11,12
14
+
d
d
13,f
d
9,f
状態数を最小にした浮動小数点定数のDFA
2
.
d
+
d
0
d
1
d
.
e
3
4
-
5
d
e
15
d
d
6