Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "東京工科大学 コンピュータサイエンス学部 担当 亀田弘之"— Presentation transcript:

1 東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
言語プロセッサ2016 第3回目 東京工科大学 コンピュータサイエンス学部 担当 亀田弘之

2 言語プロセッサ2016 担当:亀田弘之(東京工科大学)
今日の学習目標 Flex(Fast LEXical analyzer generator)で 簡単な処理が書ける(分かる)。 言語プロセッサ2016 担当:亀田弘之(東京工科大学)

3 言語プロセッサ2016 担当:亀田弘之(東京工科大学)
本資料の内容 復習 正規表現 Flexでのプログラミング その他 言語プロセッサ2016 担当:亀田弘之(東京工科大学)

4 言語プロセッサ2016 担当:亀田弘之(東京工科大学)
(復習1)正規表現 言語プロセッサ2016 担当:亀田弘之(東京工科大学)

5 正規表現の例 a { a } b { b } ab { ab } a|b { a, b } a|(a|b) a*
前回の確認1 正規表現の例 正規表現 具体的な文字列 a b ab a|b a|(a|b) a* (a|b)* a|b* ab* (ab)* { a } { b } { ab } { a, b } { ε, a, aa, aaa, ・・・ } { ε, a, b, aa, ab,ba, bb, ・・・ } { ε, a, b, bb, bbb, ・・・ } { a, ab, abb, abbb, ・・・ } { ε, ab, abab, ababab, ・・・ }

6 言語プロセッサ2016 担当:亀田弘之(東京工科大学)
大切なのはこの逆 プログラムの変数名(alphanumeric)  英文字で始まり、その後ろに        英文字か数字か空文字列が続く  正規表現でどう表現する? プログラムの整数型数値  正規表現でどう表現する? 言語プロセッサ2016 担当:亀田弘之(東京工科大学)

7 言語プロセッサ2016 担当:亀田弘之(東京工科大学)
大切なのはこの逆(その2) プログラムの変数名(alphanumeric)  英文字で始まり、その後ろに        英文字か数字か空文字列が続く  正規表現でどう表現する?  [a-zA-Z][a-zA-Z0-9]* プログラムの整数型数値  正規表現でどう表現する?  [0-9]+ 言語プロセッサ2016 担当:亀田弘之(東京工科大学)

8 言語プロセッサ2016 担当:亀田弘之(東京工科大学)
Flex (導入部) まずはデモから! 手習い: 正規表現文字列を切り出す プログラムの作成をしてみよう。 練習0 言語プロセッサ2016 担当:亀田弘之(東京工科大学)

9 言語プロセッサ2016 担当:亀田弘之(東京工科大学)
参考 Flexによる処理手順 ライブラリ(-lfl or -ll) flex lex.yy.c gcc Flex program a.exe 文字列入力 出力 言語プロセッサ2016 担当:亀田弘之(東京工科大学)

10 言語プロセッサ2016 担当:亀田弘之(東京工科大学)
実際の手順 C:\> flex sample01.l C:\> gcc lex.yy.c –lfl (注) Unixでは -ll C:\> a.exe それでは、実際にやってみよう。 言語プロセッサ2016 担当:亀田弘之(東京工科大学)

11 言語プロセッサ2016 担当:亀田弘之(東京工科大学)
参考 Flexのインストールについて Adobe Flex と間違わないこと! Fast Lexical analyzer generator の Flex です。 言語プロセッサ2016 担当:亀田弘之(東京工科大学)

12 言語プロセッサ2016 担当:亀田弘之(東京工科大学)
Flex (お試し) まずはやってみよう! 手習い: プログラムから変数名を切り出す プログラムの作成。 言語プロセッサ2016 担当:亀田弘之(東京工科大学)

13 言語プロセッサ2016 担当:亀田弘之(東京工科大学)
練習1 仕様 入力:英文テキストファイル 出力:小文字 a をスペースに置き換える。 例: 入力 int main( ) { char x = ‘A’; printf(“x=%c\n”, x); } 出力 int m in( ) { ch r x = ‘A’; 言語プロセッサ2016 担当:亀田弘之(東京工科大学)

14 言語プロセッサ2016 担当:亀田弘之(東京工科大学)
練習2 テキストファイルの行数を数える 言語プロセッサ2016 担当:亀田弘之(東京工科大学)

15 言語プロセッサ2016 担当:亀田弘之(東京工科大学)
テキストファイルの行数を数える CUI(コマンドライン入力) テキストファイルを読み込む (OSのリダイレクト機能を利用) 動作例 $ ./a.exe < infile.txt  キーボード入力 行数=48  計算結果(出力) $ 言語プロセッサ2016 担当:亀田弘之(東京工科大学)

16 言語プロセッサ2016 担当:亀田弘之(東京工科大学)
実装例 %{ int c = 0; /* 大域変数の定義 初期値 = 0 */ %} %% “\n” { c = c + 1; /* printf("c=%d\n", c);*/ } . { } main(){ yylex(); printf("C=%i\n", c); } 言語プロセッサ2016 担当:亀田弘之(東京工科大学)

17 言語プロセッサ2016 担当:亀田弘之(東京工科大学)
練習3 英文中の単語数を数える 言語プロセッサ2016 担当:亀田弘之(東京工科大学)

18 言語プロセッサ2016 担当:亀田弘之(東京工科大学)
英文中の単語数を数える CUI(コマンドライン入力) テキストファイルを読み込む (OSのリダイレクト機能を利用) 動作例 $ ./a.exe < infile.txt  キーボード入力 単語数=273  計算結果(出力) $ 言語プロセッサ2016 担当:亀田弘之(東京工科大学)

19 言語プロセッサ2016 担当:亀田弘之(東京工科大学)
実装例 %{ int wc = 0; %} %% [a-zA-Z][a-zA-Z0-9]* { wc++; } "\n" { } . { } int main(void){ yylex(); printf("wc=%i\n", wc); return 0; } 課題:左のプログラムに ついて説明せよ. 言語プロセッサ2016 担当:亀田弘之(東京工科大学)

20 数式を解析(字句解析)する プログラムの作成
練習4 数式を解析(字句解析)する プログラムの作成 動作仕様    入力されたプログラム(数式列)から、    トークンだけを切り出す 言語プロセッサ2016 担当:亀田弘之(東京工科大学)

21 プログラムを解析(字句解析)する プログラムの作成
練習5 プログラムを解析(字句解析)する プログラムの作成 例えば,“Hello World” を出力するプログラムに対し て,字句解析するプログラムを作成する. 言語プロセッサ2016 担当:亀田弘之(東京工科大学)

22 言語プロセッサ2016 担当:亀田弘之(東京工科大学)
入力例 Java言語 public class hello { public static void main( String[ ] args ){ System.out.println("Hello, Mr. Java!"); } C言語 #include <stdio.h> int main(void){ printf("Hello!\n"); } 言語プロセッサ2016 担当:亀田弘之(東京工科大学)

23 プログラムを解析(字句解析)する プログラムの作成
練習7 プログラムを解析(字句解析)する プログラムの作成 入力例1 入力例2 #include <stdio.h> int main(void) { int S, i; S = 0; for(i = 1; i <= 10; i++){ S = S + i; } printf("%d\n", S); return 0; int max(int a, int b){ if(a >= b){ return a; } else { return b; 言語プロセッサ2016 担当:亀田弘之(東京工科大学)

24 言語プロセッサ2016 担当:亀田弘之(東京工科大学)
今日の宿題(提出の必要なし) 上記の練習問題    を,自力でもう一度 やってみる。 次回の授業で、この件に関して口頭で質問します。 自分の言葉で説明できるように。 練習0 言語プロセッサ2016 担当:亀田弘之(東京工科大学)


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

Similar presentations


Ads by Google