東京工科大学 コンピュータサイエンス学部 亀田弘之

Slides:



Advertisements
Similar presentations
和田俊和 資料保存場所 /2/26 文法と言語 ー正規表現とオートマトンー 和田俊和 資料保存場所
Advertisements

プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
Problem J: いにしえの数式 問題作成・解説: 北村 解答作成協力: 八森.
文法と言語 ー字句解析とオートマトンlexー
東京工科大学 コンピュータサイエンス学部 亀田弘之
コンパイラ 2011年10月17日
東京工科大学 コンピュータサイエンス学部 亀田弘之
言語処理系(4) 金子敬一.
12.3,E,-15, 12.3,E5,+,=, >,<,…,
文法と言語 ー文脈自由文法とLR構文解析2ー
コンパイラ 第9回 コード生成 ― スタックマシン ―
情報科学1(G1) 2016年度.
言語処理系(5) 金子敬一.
東京工科大学 コンピュータサイエンス学部 亀田弘之
コンパイラ 2012年10月15日
コンパイラ 2012年10月22日
言語プロセッサ2015 第10回目 〜資料番号 H28NoA〜
コンパイラ 2011年10月24日
情報基礎及び演習 プログラミング基礎① 電気・佐藤亮一.
東京工科大学 コンピュータサイエンス学部 亀田弘之
形式言語とオートマトン Formal Languages and Automata 第4日目
言語プロセッサ2007 平成19年9月26日(水) (Ver.2 平成19年10月3日変更)
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
言語プロセッサ 第7回目 平成27年11月16日.
東京工科大学 コンピュータサイエンス学部 亀田弘之
文法と言語 ー字句解析とオートマトンlexー
文法と言語 ー字句解析とオートマトンlexー
FlexとBison+アルファ -実習編-
東京工科大学 コンピュータサイエンス学部 亀田弘之
構文定義記述を用いた 多言語対応コードクローン検出ツールの改善
東京工科大学 コンピュータサイエンス学部 亀田弘之
形式言語とオートマトン Formal Languages and Automata 第4日目
プログラミング演習I 2003年5月7日(第4回) 木村巌.
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
文法と言語 ー文脈自由文法とLR構文解析2ー
東京工科大学 コンピュータサイエンス学部 亀田弘之
言語プロセッサ ー第9回目ー 構文解析(続き).
平成20年10月5日(月) 東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
制御文の役割と種類 IF文 論理式と関係演算子 GO TO文
コンパイラ 2011年10月20日
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
平成26年4月22日(火) 東京工科大学 コンピュータサイエンス学部 亀田弘之
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
文法と言語 ー文脈自由文法とLR構文解析ー
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
文法と言語 ー字句解析とオートマトンlexー
C言語講座 制御(選択) 2006年 計算技術研究会.
東京工科大学 コンピュータサイエンス学部 亀田 弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
情報処理Ⅱ 2007年12月3日(月) その1.
コンパイラ 2012年10月11日
言語プロセッサ ー第9回目ー 構文解析(続き).
言語プロセッサ ー第7回目ー 構文解析(続き).
東京工科大学 コンピュータサイエンス学部 亀田 弘之
東京工科大学 コンピュータサイエンス学部 亀田 弘之
形式言語とオートマトン Formal Languages and Automata 第5日目
文法と言語 ー文脈自由文法とLR構文解析2ー
:: の扱い 長谷川啓.
Presentation transcript:

東京工科大学 コンピュータサイエンス学部 亀田弘之 言語プロセッサ2014 -No.3- 東京工科大学 コンピュータサイエンス学部 亀田弘之

これからの内容 字句解析プログラムの作成方法 構文解析 手書きの方法 Flexを利用する方法 解析手法の種類 左再帰とその除去 括りだし FirstとFollow

参考資料(発展) Intermediate Representations in Imperative Compilers: A Survey, James Stanier and Des Watson, ACM Computing Surveys, Vol.45, No.3, Article 26(27 pages), 2013.

正規表現の練習 PCを立ち上げてください。 HTMLのソースコードから情報を抽出してみよう!

演習 準備 正規表現の使えるエディタを準備 大学のホームページのソースコードをコピーする。 正規表現の利用練習をする。

練習課題 HTMLのタグをすべて除去する。 メールアドレスをすべて抜き取る。 電話番号をすべて抜き取る。 数字だけをすべて抜き取る。 Remove all tags in the HTML page. メールアドレスをすべて抜き取る。 Extract all e-mail addresses in it. 電話番号をすべて抜き取る。 Extract all telephone numbers in it. 数字だけをすべて抜き取る。 Extract all figures in it.

練習課題のヒント サイトhttp://hodade.adam.ne.jp/seiki/page.php?chapter_1  

<("[^"]*"|'[^']*'|[^'">])*> 試してみよう ( Lt’s try it! ) <("[^"]*"|'[^']*'|[^'">])*> 参考ページ http://hodade.adam.ne.jp/seiki/page.php?chapter_1

字句解析の実際 「符号なし数」の字句解析 num → digit+ ( . digit+)? (E(+|-)?digit+)? => n → d+( . d+)? (E(+|-)?d+)? => num → d+(.d+|ε)( (E((+|-)|ε)) d+|ε) |ε)

Flexのソースコード例 D [0-9] %% [\t ] { printf("Tab or Space\n"); } 参 考 D [0-9] %% [\t ] { printf("Tab or Space\n"); } {D}+(\.{D}+)?(E(\+|\-)?{D}+)? {printf("%s\n", yytext); } . { printf("NG %s\t", yytext); }

識別子のシンタックス letter → a|b|c|…|z|A|B|C|…|Z digit → 0|1|2|…|9 id → letter (letter|digit)*

Flexのコード例 LETTER [a-zA-Z] DIGIT [0-9] %% [\t ] { printf("Tab or Space\n"); } {LETTER}({LETTER}|{DIGIT})* {printf("id=%s\n", yytext); } . { printf("NG %s\t", yytext); }

符号なし数のシンタックス digit → 0|1|2|3|4|5|6|7|8|9 digits → digit digit* optional_fraction → . digits |ε optional_exponent → (E(+|-|ε)digits)|ε num → digits optional_fraction optional_exponent

トークン認識プログラム作成 (教科書を参考に作成してみよう!)

プログラムの文法(例)

stmt → if expr then stmt | if expr then stmt else stmt |ε expr → term relop term | term term → id | num

if → if then → then else → else relop → <|<=|=|<>|>|>= id → letter(letter|digit)* num → digit+(.digit+)?(E(+|-)?

delim → blank|tab|newline ws → delim+

トークン-正規表現パタン 正規表現 トークン 属性値 ws if then else id num < <= = <> > >= (なし) relop   (なし) 記号表のエントリへの   ポインタ   LT   LE   EQ   NE   GT   GE

オートマトンの作成

= > 0 6 7 other 8

図. 関係演算子の遷移図 0 1 2 = < Return(relop,LE) > 3 Return(relop,NE) other 4 Return(relop,LT) > = 5 Return(relop,EQ) = 6 7 Return(relop,GE) other 8 Return(relop,GT) 図. 関係演算子の遷移図

Return(get_token( ), install_id( )) letter letter other 9 10 11 Return(get_token( ), install_id( )) digit 図. 識別子とキーワードに対する遷移図

. digit digit - E + digit other digit E digit digit digit 図. 数の遷移図(1) 17 digit 12 digit - 13 E 19 + digit . other digit 16 18 E 14 digit 15 digit digit 図. 数の遷移図(1)

. digit digit digit digit digit digit other 図. 数の遷移図(2) 20 21 22 23 24 25 26 27 図. 数の遷移図(2)

単純な遷移図 b 1 a a 2 b

state = 0; while(TRUE) { switch(state) { case 0: c = nextChar( ); /* 先読み */ switch(c){ case ‘a’: state = 1; break; case ‘b’: state = 2; break; } case 1: c = nextChar( ); case ‘a’: state = 2; break; case ‘b’: state = 1; break; } }

state = 0; while(TRUE) { switch(state) { case 0: c = nextChar( ); /* 先読み */ switch(c){ case ‘a’: state = 1; break; case ‘b’: state = 2; break; } case 1: c = nextChar( ); case ‘a’: state = 2; break; case ‘b’: state = 1; break; } }

簡単な遷移図 b 26 a a 25 a 27 b b 28

練習問題 直前のページのオートマトンをシミュレートするプログラムを作成せよ。 符号なし数を処理する字句解析プログラムを作成せよ。 次ページに示した(C言語の)浮動小数点定数を処理する字句解析プログラムを作成せよ。

参考: (C言語の)浮動小数点定数 . Numbers Numbers f Numbers . e + l Numbers Numbers - F L

今度はflexを使ってみよう!

手順 ライブラリ(fl) Flex Lex.yy.c gcc Flex Program a.exe 文字列入力 出力

Flexプログラムの記述(1) delim [ \t\n] ws {delim}+ letter [a-zA-Z] digit [0-9] id {letter}({letter}|{digit})* number {digit}+(\.{digit}+)?(E[+\-]?{digit}+)? %%

Flexプログラムの記述(2) {ws} { /* do nothing */ } If {return(IF);} Then {return(THEN);} else {return(ELSE);} {id} {yylval = install_id( ); return(ID);} {number} {yylval = install_num(); return(NUMBER);}

Flexプログラムの記述(3) “<” {yylval = LT; return(RELOP);} “<=“ {yylval = LE; return(RELOP);} “=“ {yylval = EQ; return(RELOP);} “<>” {yylval = NE; return(RELOP);} “>“ {yylval = GT; return(RELOP);} “>=“ {yylval = GE; return(RELOP);} %%

Flexプログラムの記述(4) install_id( ){ static int id_ptr=0; return(id_ptr); } install_num( ){ static int num_ptr=0; return(num_ptr); }

Flexのデモ

手順 Flexのプログラムを書く。 Flexのプログラムをflexにかける。 出力ファイルlex.yy.cをgccでコンパイルする。 出力a.exeを実行する。 さまざまな文字列を入力する。

手順 ライブラリ(fl) Flex Lex.yy.c gcc Flex Program a.exe 文字列入力 出力

実際の手順 C:\> flex sample01.l C:\> gcc lex.yy.c –lfl C:\> a.exe それでは、実際にやってみよう。

字句解析から構文解析へ 以上で、字句解析は終わり。 字句解析の次の処理は、構文解析でしたね。