文法と言語 ー字句解析とオートマトンlexー

Slides:



Advertisements
Similar presentations
プログラミング言語論 第3回 BNF 記法について(演習付き) 篠埜 功. 構文の記述 プログラミング言語の構文はどのように定式化できるか? 例1 : for ループの中に for ループが書ける。 for (i=0; i
Advertisements

和田俊和 資料保存場所 /2/26 文法と言語 ー正規表現とオートマトンー 和田俊和 資料保存場所
プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
文法と言語 ー字句解析とオートマトンlexー
コンパイラ 2011年10月17日
計算の理論 I 決定性有限オートマトン(DFA) と 非決定性有限オートマトン(NFA)
文法と言語 ー文脈自由文法とLR構文解析2ー
文法と言語 ー文脈自由文法とLL構文解析ー
計算の理論 II 文脈自由文法と プッシュダウンオートマトン
言語処理系(5) 金子敬一.
コンパイラ 2012年10月15日
コンパイラ 2012年10月22日
東京工科大学 コンピュータサイエンス学部 亀田弘之
コンパイラ 2011年10月24日
形式言語とオートマトン2013 ー有限オートマトンー 第5日目
システムソフトウェア講義の概要 計算機システムの復習:中央演算処理装置(CPU),プログラムの実行,主記憶装置,補助記憶装置
形式言語とオートマトン2008 ー有限オートマトンー
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
プログラミング言語論 第3回 BNF記法について(演習付き)
正則言語 2011/6/27.
文法と言語 ー字句解析とオートマトンlexー
FlexとBison+アルファ -実習編-
形式言語の理論 5. 文脈依存言語.
東京工科大学 コンピュータサイエンス学部 亀田弘之
計算の理論 I ー 正則表現(今度こそ) ー 月曜3校時 大月 美佳.
計算の理論 I ー 正則表現 ー 月曜3校時 大月 美佳.
形式言語とオートマトン Formal Languages and Automata 第4日目
プログラミング序論 2. n人のインディアン.
東京工科大学 コンピュータサイエンス学部 亀田弘之
言語と文法 言語とは,ルールに従う記号列の無限集合である. 文法を与えることで言語が定義できる.
文法と言語 ー文脈自由文法とLR構文解析2ー
東京工科大学 コンピュータサイエンス学部 亀田弘之
平成20年10月5日(月) 東京工科大学 コンピュータサイエンス学部 亀田弘之
文法と言語 ー文脈自由文法とLR構文解析3ー
計算の理論 II 前期の復習 -有限オートマトン-
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
2007年度 情報数理学.
プログラミング言語論 第9回 情報工学科 木村昌臣 篠埜 功.
文法と言語 ー文脈自由文法とLL構文解析ー
コンパイラ 2011年10月20日
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
形式言語とオートマトン 中間試験解答例 2016年11月15実施 中島毅.
平成26年4月22日(火) 東京工科大学 コンピュータサイエンス学部 亀田弘之
計算の理論 I 決定性有限オートマトン(DFA) と 非決定性有限オートマトン(NFA)
プログラミング演習I 2003年4月30日(第3回) 木村巌.
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
文法と言語 ー文脈自由文法とLR構文解析ー
計算の理論 I 非決定性有限オートマトン(NFA)
5.チューリングマシンと計算.
東京工科大学 コンピュータサイエンス学部 亀田弘之
文法と言語 ー字句解析とオートマトンlexー
C言語講座 制御(選択) 2006年 計算技術研究会.
4.プッシュダウンオートマトンと 文脈自由文法の等価性
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
システムソフトウェア講義の概要 計算機システムの復習:中央演算処理装置(CPU),プログラムの実行,主記憶装置,補助記憶装置
東京工科大学 コンピュータサイエンス学部 亀田弘之
計算の理論 I ー 正則表現 ー 月曜3校時 大月 美佳.
コンパイラ 2012年10月11日
非決定性有限オートマトン 状態の有限集合 入力記号の有限集合 注意 動作関数 初期状態 受理状態の有限集合.
システムソフトウェア講義の概要 計算機システムの復習:中央演算処理装置(CPU),プログラムの実行,主記憶装置,補助記憶装置
文法と言語 ー文脈自由文法とLR構文解析2ー
情報処理Ⅱ 2005年11月25日(金).
第4回 配列.
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
第1章 文字の表示と計算 printfと演算子をやります.
Presentation transcript:

文法と言語 ー字句解析とオートマトンlexー 2018/12/7 文法と言語 ー字句解析とオートマトンlexー 和田俊和 資料保存場所 http://vrl.sys.wakayama-u.ac.jp/~twada/syspro/

前回の復習1 言語とは,あるルールに従う記号列の無限集合である. 文法を与えることで言語が定義できる. 2018/12/7 言語とは,あるルールに従う記号列の無限集合である. 文法を与えることで言語が定義できる. 文法にはタイプ0からタイプ3までのレベルがあり, プログラム言語としてはタイプ2「文脈自由文法」 プログラム中の字句の表現にはタイプ3「正規文法」 が用いられる. 文脈自由文法(Context Free Grammar:CFG)は,前後の記号に関係なく「非終端記号1つ」を「非終端記号と終端記号から成る記号列」に置き換えるという生成規則 A→t のみを持つ文法 出発記号に対して生成規則の要素を何度か適用して終端記号列を得ることを「導出」と呼ぶ. 終端記号列と文法が与えられたとき,生成規則がどのように適用されたのか,つまり,導出の過程を求めることを「構文解析」と呼び,その結果,導出木が得られる. 導出木からそれを簡略化した「構文木(演算子木)」が求められ,それを利用した式の計算などが可能である.

2018/12/7 前回の復習2 正規文法は,「非終端記号1つ」を「終端記号」もしくは「終端記号 非終端記号」に置き換えるという生成規則 A→a or B→bB  のみを持つ文法 正規文法で表現できるのは,「整数」「実数」「識別子(変数名)」「キーワード」など,比較的単純な記号の並びである. 正規文法によって規定される言語は,正規表現によって表現することができる. 正規表現から,それに唯一に対応付けられる「非決定性有限状態オートマトン(NFA)」が機械的に対応付けられる. その,機械的に求められたNFAは,計算機で実行可能な「決定性有限状態オートマトン(DFA)」に変換することができ,さらに状態数の最適化などが行われ,字句解析に用いられる.

オートマトンの利用例:字句解析 文字の連続的な並びに対して,字句の種類ごとに分類しつつ,単一の字句の切り出し(セグメンテーション)も行う. 2018/12/7 オートマトンの利用例:字句解析 文字の連続的な並びに対して,字句の種類ごとに分類しつつ,単一の字句の切り出し(セグメンテーション)も行う. 例 while ( a14z < 100.4 ) a14z ... 予約語 左括弧 変数 比較演算子 実数 右括弧 変数名 これは構文解析の前に行われる処理である.

前回の演習課題 最初の数字は1~9までの数字であり, 引き続き0~9までの数字が0回以上繰り返される. これで終わりの場合もあるが, 2018/12/7 前回の演習課題 最初の数字は1~9までの数字であり, 引き続き0~9までの数字が0回以上繰り返される. これで終わりの場合もあるが, “.”が来て0~9までの数字が0回以上繰り返される場合もある.

2018/12/7 正規表現からオートマトンへの変換規則             i f i f i f i f i f

オートマトンへの変換 2018/12/7 i f

オートマトンへの変換(簡単化) 2018/12/7 a b c a c a b c a c i f

NFAからDFAへ これらを無くせば,DFAになる. 2018/12/7 NFAからDFAへ NFA(非決定性有限状態オートマトン)がDFA(決定性有限状態オートマトン)と異なる点. 「ε遷移」がある. 同じ入力に対して複数の状態に遷移する「非決定性遷移」がある. ↓ これらを無くせば,DFAになる. 以下 “while”, “with”, “wrap” の3つの文字列を受理する3つのオートマトンを合成し,1つのNFAを作った後,これをDFAに変換する問題を例題として説明する.

2018/12/7 複数のオートマトンの結合 while with wrapという記号列を受理するオートマトンから (while|with|wrap)という正規表現に対応するオートマトンを生成すると,「ε遷移」を含むオートマトンができる. w h i l e i f h i t a l h p e w ε ε i t h w i ε i f ε i w f r ε r a p w ε w i f

ε閉包(ε-closure) ある状態から無入力で遷移し得る状態の集合のこと. 2018/12/7 ε閉包(ε-closure) ある状態から無入力で遷移し得る状態の集合のこと. これら状態の集合を新たな状態として定義し直すことにより, ε遷移を含まないオートマトンができる. h i r i t a l h p e h i t a l h p e w w ia df ε a d ε i ε ε ef i w i ib b e f r ε ε w ic ff c f

2018/12/7 非決定的遷移の除去 同様に,ある状態に於いて,1つの入力記号が与えられたときに遷移し得る状態集合をまとめることにより,非決定的遷移も消すことができる. これでDFAが得られたことになる. h i r i t a l h p e i t a l h p e w a f h i r f f i b w f i abc c f f

このNFAを決定性に直す c g i a b e f d i h f Non-deterministic Finite Automaton 2018/12/7 c g i a b e f d i h f Non-deterministic Finite Automaton bcef fgif abef fif i bdef fhif Deterministic Finite Automaton

終了状態はどこにある? bcef fgif abef fif i bdef fhif 2018/12/7 bcef fgif abef fif i bdef fhif Deterministic Finite Automaton 元の終了状態 f を含む状態を,終了状態とする.→終了状態からの状態遷移は定義上おかしい. ε遷移で,終了状態に遷移させる.→DFAなのでε遷移はあってはいけない. 各状態で受理しない記号を受け取った時点で終了状態に遷移する.→図として煩雑なので,ここでは明示しない.

実装は大変! lex(flex)を使えばオートマトンも簡単に作れる. 2018/12/7 実装は大変!               lex(flex)を使えばオートマトンも簡単に作れる. lex は,正規文法を与えて,それを解析するオートマトンを生成する,いわば「字句解析用オートマトン生成プログラム」である. 正規文法だけでなく,文字列を受理した際に行う処理をC言語で書くことができる. {文法, C言語} lex(flex) 記号列 字句解析器 区切られ,分類された字句

flex プログラムと使い方 入力ファイルの構造 test.l 使い方 lex test.l gcc lex.yy.c –ll 2018/12/7 入力ファイルの構造 %{ 任意のC プログラム。定数やC のマクロの宣言をここにかく。 %} 下の定義で使うlex のマクロの定義 %% 正規表現による入力パターンの定義 正規表現パターン アクション という形で書く 任意のC プログラム test.l %{ #include <stdio.h> %} %% a(b|c)* { printf("OK\n"); } /*このパターンを入力したらOK を出力する*/ . {printf("NG\n");} /*.は以上以外のパターンの場合のアクションを指定 */ 使い方 lex test.l gcc lex.yy.c –ll . /a.out

プログラム例 実行例 ./a.out abcbabcbabcbbabbc OK %{ #include <stdio.h> %} 2018/12/7 プログラム例 %{ #include <stdio.h> %} %% a(b|c)* { printf("OK\n"); } /*このパターンを入力したらOK を出力する*/ . {printf("NG\n");} /*.は以上以外のパターンの場合のアクションを指定 */ 実行例 ./a.out abcbabcbabcbbabbc OK

flex プログラムの例2 %{ /* You can put any C code here. */ 2018/12/7 flex プログラムの例2 %{ /* You can put any C code here. */ #define END 0 /* end of input */ #define BADTOKEN 1 /* invalid token */ #define NUMBER 2 /* decimal number */ #define HEXNUMBER 3 /* hex number */ #define RETURN 4 #define PLUS 5 #define MINUS 6 %} %% [0-9]+ return NUMBER; 0[Xx][0-9A-Fa-f]+ return HEXNUMBER; “+” return PLUS; “-” return MINUS; “\n” return RETURN; [ \t]+ ; /* ignore */ .   return BADTOKEN; #include <stdio.h> /* for printf() */ #include <stdlib.h> /* for atoi() */ main() { extern char* yytext;  int token; while((token = yylex()) != END){ printf("token no.%d: ", token); switch(token){ case NUMBER : printf("%d\n", atoi(yytext)); break; case RETURN : printf("return\n"); default : puts(yytext); }

正規表現と実行例 [0-9]+ return NUMBER; 0[Xx][0-9A-Fa-f]+ return HEXNUMBER; 2018/12/7 正規表現と実行例 [0-9]+ return NUMBER; 0[Xx][0-9A-Fa-f]+ return HEXNUMBER; “+” return PLUS; “-” return MINUS; “\n” return RETURN; [ \t]+ ; /* ignore */ .   return BADTOKEN; -bash-3.1$ ./a.out 19+0x12+a    ←入力 token no.2: 19 token no.5: + token no.3: 0x12 token no.1: a token no.4: return

本日の演習課題 という正規表現を受理するオートマトンを, 個々の文字列を受理するオートマトンをε遷移で束ねたNFA 決定性に変換したDFA 2018/12/7 本日の演習課題 という正規表現を受理するオートマトンを, 個々の文字列を受理するオートマトンをε遷移で束ねたNFA 決定性に変換したDFA に分けて,それぞれ示しなさい. 右の正規表現に対応するオートマトンが受理する記号列(すなわち言語)L(A)〜L(D)をVenn図で示しなさい. A: a*b* B: aa*b* C: a*bb* D: aa*bb*