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