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