言語プロセッサ2014 -No.2平成26年9月29日 東京工科大学 コンピュータサイエンス学部 亀田弘之 Copyright© 2014 School of Computer Science, Tokyo University of Technology 復習から 2 Copyright© 2014 School of Computer Science, Tokyo University of Technology 数式の解析 • kingaku = teika + teika * shouhizei 3 Copyright© 2014 School of Computer Science, Tokyo University of Technology 数式の解析 1. 読み込み(文字列として) “kingaku = teika + teika * shouhizei” 2. 要素(token)の切り出し “kingaku”, “=“, “teika”, “+”, “*”, “shouhizei” 3. 要素の相互関係の分析 = kingaku + teika * teika shouhizei 4 Copyright© 2014 School of Computer Science, Tokyo University of Technology #include <stdio.h> main(){ float kingaku = 0, teika = 100; float shouhizei = 0.10; kingaku = teika + teika*shouhizei; printf("kingaku=%f\n", kingaku); } ソース言語 読み込み 字句解析 分析 構文解析 .file "test2.c" ___main; .scl .type 32; .section .rdata,"dr"LC3: "kingaku=%f\12\0" .text.globl _main _main; .scl .type 32; pushl %ebp %esp, %ebp andl subl $32, %esp ___main movl movl %eax, 28(%esp) $0x42c80000, %eax %eax, 24(%esp) movl movl %eax, 20(%esp) 24(%esp) fmuls fadds 24(%esp) 28(%esp) flds fstpl 4(%esp) $LC3, (%esp) call leave ret _printf; .scl .type 32; .endef .def 2; .endef .ascii .def 2; .endef_main: movl $-16, %esp call $0x00000000, %eax movl movl $0x3dcccccd, %eax flds 20(%esp) fstps 28(%esp) movl _printf .def 2; 中間語生成 合成 コード生成 目的言語 5 Copyright© 2014 School of Computer Science, Tokyo University of Technology ソース言語 読み込み 字句解析 分析 構文解析 中間語生成 合成 コード生成 目的言語 6 Copyright© 2014 School of Computer Science, Tokyo University of Technology 数式の解析 1. 読み込み(文字列として) “kingaku = teika + teika * shouhizei” 2. 要素(token)の切り出し “kingaku”, “=“, “teika”, “+”, “*”, “shouhizei” 3. 要素の相互関係の分析 = kingaku + teika * teika shouhizei 7 Copyright© 2014 School of Computer Science, Tokyo University of Technology 数式の解析 1. 読み込み(文字列として) “kingaku = teika + teika * shouhizei” 2. 要素(token)の切り出し “kingaku”, “=“, “teika”, “+”, “*”, “shouhizei” 3. 要素の相互関係の分析 = kingaku + teika * teika shouhizei 8 Copyright© 2014 School of Computer Science, Tokyo University of Technology 数式の解析 1. 読み込み(文字列として) “kingaku = teika + teika * shouhizei” 2. 要素(token)の切り出し “kingaku”, “=“, “teika”, “+”, “*”, “shouhizei” 3. 要素の相互関係の分析 = kingaku + teika * teika shouhizei 9 Copyright© 2014 School of Computer Science, Tokyo University of Technology 数式の解析 1. 読み込み(文字列として) 読み込み “kingaku = teika + teika * shouhizei” 2. 要素(token)の切り出し 語句解析 “kingaku”, “=“, “teika”, “+”, “*”, “shouhizei” 3. 要素の相互関係の分析 構文解析 = kingaku + teika * teika shouhizei 10 Copyright© 2014 School of Computer Science, Tokyo University of Technology 数式の解析 1. 読み込み – ファイルからの入力技法 2. 字句解析 – 有限オートマトンの理論 – 正規文法 – 正規表現 3. 構文解析 – 線形有界オートマトン理論 – 文脈自由文法 11 Copyright© 2014 School of Computer Science, Tokyo University of Technology 前提知識 • 言語理論とオートマトン – 前期科目「言語理論とオートマトン」 – 抽象的・論理的な思考への慣れ (特に、正規表現と有限オートマトン) • プログラミング技法 – 今までいろいろと習ってきましたよね! – 基本的な知識があれば一応OK – ファイルの入出力が難しい人もいるかも… 12 Copyright© 2014 School of Computer Science, Tokyo University of Technology 学んで得られるもの • 言語理論とオートマトン – 抽象的・論理的な思考への慣れ – ソフトウェア分野における基本的概念 • 正規表現 etc. • プログラミング言語へのより深い理解 • プログラミング技法 – プログラミング力(知識)アップ – 洗練されたアルゴリズムの理解 などなど 13 Copyright© 2014 School of Computer Science, Tokyo University of Technology • 言語プロセッサ関連は、コンピュータサイエン スの英知が集積されている! • この授業を取った人は先見の明がある! 14 Copyright© 2014 School of Computer Science, Tokyo University of Technology 今日の内容 1. 2. 3. 4. 5. 正規表現 (regular expressions; re) オートマトン (automaton, pl. automata) 正規表現とオートマトンとの関係 オートマトンのシミュレータ デモ 15 Copyright© 2014 School of Computer Science, Tokyo University of Technology 今日の学習目標 1. 正規表現が使える。 2. オートマトンを理解し,作れる。 16 Copyright© 2014 School of Computer Science, Tokyo University of Technology 1.正規表現 • 正規表現とは – 聞いたことのある人は? – 使ったことのある人は? – 使い方説明できる人は? ① ② ③ どんな時に正規表現を使うのか? 17 Copyright© 2014 School of Computer Science, Tokyo University of Technology 正規表現とは • 文字列のパターンを表現するためのもの – 例: 1. 2. 3. 4. { a, aa, aaa, aaaa, aaaaa, ...} { 1, 01, 001, 0001, 00001, ...} { aab, bab } { 2, 4, 6, 8, 10, ...} ( = 正の偶数全体の集合 ) など パターンが見つかりましたか? 18 Copyright© 2014 School of Computer Science, Tokyo University of Technology 練習 • いま current directory に以下のような (名前の)ファイルがあるとする。 program62 infile2010 procedure71 filedummy777 profileV7 prototype52 parser outfile777 file256 fixer8 • 問1 proで始まるファイル名のもの • 問2 fileを含むもの • 問3 末尾に数字がありそれが偶数のもの 19 Copyright© 2014 School of Computer Science, Tokyo University of Technology 正規表現(定義) アルファベットVの上の正規表現とは以下の ものである。 1. 2. 3. 4. 5. 6. εは正規表現 a∈Vならば、aは正規表現 rとsが正規表現ならば rs は正規表現 rとsが正規表現ならば r | s は正規表現 rが正規表現ならば r* は正規表現 以上のものだけが正規表現 20 Copyright© 2014 School of Computer Science, Tokyo University of Technology 正規表現 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. a b ab a|b a|(a|b) a* (a|b)* a|b* ab* (ab)* 正規表現の例 具体的な文字列 1. { 2. { 3. { 4. { 5. { 6. { 7. { 8. { 9. { 10.{ } } } } } } } } } } 21 Copyright© 2014 School of Computer Science, Tokyo University of Technology 有限オートマトンの定義 FA = ( K, Σ, δ, q0, F ) ただし、 K : 状態の集合( Kは有限集合) Σ : 入力アルファベット(Σは有限集合) δ : 状態遷移関数 δ: K×Σ∋( qi , a ) → qj ∈ K q0 : 初期状態 そうなの ですね F : 最終状態の集合 ( F ⊆ K ) 22 Copyright© 2014 School of Computer Science, Tokyo University of Technology オートマトンのイメージ 遷移条件 (出力) 内部 状態 内部 状態 初期状態 最終状態 など 23 Copyright© 2014 School of Computer Science, Tokyo University of Technology オートマトンの例 • ゲーム人工知能 – PackMan – RPG (Role Playing Games) など 24 Copyright© 2014 School of Computer Science, Tokyo University of Technology 今日の演習1 Packmanの観察 次のサイトに行って実際にPackmanを 体験してみよう。 (参考: http://j-game.net/packman.html) 【課題】 1. 2. 3. 4. 5. どのような内部状態が存在するか? 内部状態を書き出す。 内部状態同士の遷移関係を表す矢印を引く。 遷移の条件およびそのときの動作を書き込む。 オートマトンとしての解釈を考える。 25 Copyright© 2014 School of Computer Science, Tokyo University of Technology 次の話題 オートマトンと正規表現の関係 • (有限)オートマトンと正規表現とは対応関係 にある。 つまり、(有限)オートマトンは正規表現で書き 表せるとともに、正規表現は(有限)オートマト ンで書き表せる。 26 Copyright© 2014 School of Computer Science, Tokyo University of Technology 今日の演習2 練習 問 正規表現 b(a|b)a を考える。 1. この正規表現が表わす文字列をすべて求めよ。 2. この正規表現の表わす文字列をすべて、かつ、 それらだけを受理するオートマトンを作れ。 27 Copyright© 2014 School of Computer Science, Tokyo University of Technology もっと練習 問 次の正規表現と等価なオートマトンを作れ。 1. ab 2. a* 3. 01(10|01)*11 28 Copyright© 2014 School of Computer Science, Tokyo University of Technology オートマトンのシミュレータ s = s0; c = nextChar( ); while( c != eof ) { 積極的に理解 s = move( s, c ); しよう! c = nextChar( ); } if(sがFに含まれる) return “yes”; else return “no”; 29 Copyright© 2014 School of Computer Science, Tokyo University of Technology 字句解析プログラムは、当然なが ら自力で作成できるが、オートマト ン理論を知っていればスマートに 作成できる。 30 Copyright© 2014 School of Computer Science, Tokyo University of Technology Flexを使った例 • 正規表現 a(a|b)*c を受理するオートマトンを シミュレートするプログラムの自動生成が可 能。 31 Copyright© 2014 School of Computer Science, Tokyo University of Technology デモ • (詳しくは後日) 32 Copyright© 2014 School of Computer Science, Tokyo University of Technology 次回までの予習(準備) • 自分が普段使っているテキストエディタでは、 正規表現を扱えるか確認しなさい。 • 使えない場合は、正規表現が使えるエディタ を探し、インストールしなさい。 本授業としては、復習をしっ かりやすことをお勧めします。 33 Copyright© 2014 School of Computer Science, Tokyo University of Technology
© Copyright 2024 ExpyDoc