FlexとBison+アルファ -実習編-

Slides:



Advertisements
Similar presentations
プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
Advertisements

文法と言語 ー字句解析とオートマトンlexー
東京工科大学 コンピュータサイエンス学部 亀田弘之
応用理工学情報処理 第1回(2015年10月 5日) 月曜日担当 前島展也 Manaba
コンパイラ 2011年10月17日
東京工科大学 コンピュータサイエンス学部 亀田弘之
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
データ構造とアルゴリズム 第10回 mallocとfree
数値計算及び実習 第3回 プログラミングの基礎(1).
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
文法と言語 ー文脈自由文法とLR構文解析2ー
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
情報科学1(G1) 2016年度.
構造体.
プログラミング論 II 電卓,逆ポーランド記法電卓
  【事例演習6】  数式インタプリタ      解 説     “インタプリタの基本的な仕組み”.
東京工科大学 コンピュータサイエンス学部 亀田弘之
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
コンパイラ 2012年10月15日
東京工科大学 コンピュータサイエンス学部 亀田弘之
言語プロセッサ2015 第10回目 〜資料番号 H28NoA〜
【プログラミング応用】 必修2単位 通年 30週 授業形態:演習.
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
東京工科大学 コンピュータサイエンス学部 亀田弘之
言語プロセッサ2007 平成19年9月26日(水) (Ver.2 平成19年10月3日変更)
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
言語プロセッサ 第7回目 平成27年11月16日.
東京工科大学 コンピュータサイエンス学部 亀田弘之
文法と言語 ー字句解析とオートマトンlexー
文法と言語 ー字句解析とオートマトンlexー
オブジェクト指向 プログラミング 第二回 知能情報学部 新田直也.
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
言語プロセッサ 第8回目 平成22年11月22日.
文法と言語 ー文脈自由文法とLR構文解析2ー
東京工科大学 コンピュータサイエンス学部 亀田弘之
プログラミング基礎B 文字列の扱い.
平成20年10月5日(月) 東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
コンパイラ 2011年10月20日
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
B演習(言語処理系演習)第2回 田浦.
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
Webページに動きを持たせるJavascript言語について 例題のプログラムを通して体験的に理解することとします。
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
文法と言語 ー字句解析とオートマトンlexー
C言語講座 制御(選択) 2006年 計算技術研究会.
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
第6回放送授業.
言語プロセッサ 第12日目 平成20年1月9日.
東京工科大学 コンピュータサイエンス学部 亀田弘之
コンパイラ 2012年10月11日
文法と言語 ー文脈自由文法とLR構文解析2ー
第12章 乱数という業の深い存在 ~ランダムな値・他~
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
プログラミング演習II 2003年11月19日(第6回) 木村巌.
printf・scanf・変数・四則演算
第2章 数値の入力と変数 scanfと変数をやります.
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
第1章 文字の表示と計算 printfと演算子をやります 第1章 文字の表示と計算.
第1章 文字の表示と計算 printfと演算子をやります.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

FlexとBison+アルファ -実習編- 東京工科大学 コンピュータサイエンス学部 亀田弘之

内容 実例紹介 基礎練習 実習1 実習2 実践的演習 FlexとBisonの書き方・実行手順 HTMLのタグを抜き出す 電卓作成 Pascalパーザ作成

1.実例紹介

2.基礎練習 Flexの書き方・実行手順

Flex書き方 %%

Flex書き方 各種定義 %{ C言語のコード %} %% Flexの記述 パターン アクション の列

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

電卓作成 解説文 概要  簡単な電卓ソフトウェア。  例えば、1+2 と入力すると、計算結果として 3 を表示する。  (1+2)*4 ならば 12、 1+2*4 ならば 9 と表示する。  ただし、変数は使えない。 機能:  キーボードから入力された数式(変数や四則演算以外の関数は含まないもの)に対して、  その計算結果を画面に出力する。 使い方:  起動方法:コマンドラインにおいて、calc と入力する。 数式入力方法:キーボードから入力する。 プログラムの説明 lexer.l の説明 機能の説明 Flex (Fastlex ) のプログラムで、数式の構文構成要素 (token) を切り出すプログラムを 自動生成する。生成されるプログラムはC言語で書かれたものとなる。 ソースコードの説明 大きく3つの部分から構成されている。 1) ヘッダー等の情報 2) トークンの認識・切り出し 3)C言語のソースコード parser.yの説明 数式の構文解析を行う。このソースプログラムをBisonで処理すると、 C言語で書かれた簡易電卓プログラムが生成される。

電卓作成(2) コンパイルの仕方と動作例 % bison -d parser.y % flex lexer.l % gcc -o calc parser.tab.c -lfl % ./calc.exe 1: 1 + 2 3 2: (1+2)*4 12 3:

ソースコード(lexer.l) %{ #include "parser.tab.h" #include <stdio.h> int tokenValue = NONE; int lineNumber = 1; %} %% [ \t]+ { /* do nothing */ } \n { return(ENDOFLINE); } [0-9]+ { tokenValue = strtol(yytext, NULL, 10); return(NUMBER); } "+" { return(PLUS); } "-" { return(MINUS); } "*" { return(MULTIPLY); } "/" { return(DIVIDE); } "(" { return(LPAR); } ")" { return(RPAR); } . { tokenValue = yytext[0]; return(NONE); }

ソースコード(parser.y) %{ extern int tokenValue; extern int lineNumber; #define prompt printf("\n%5d : ", ++lineNumber) %} %start lines %token PLUS MINUS MULTIPLY DIVIDE LPAR RPAR NONE ENDOFLINE NUMBER %% lines : /* null string epsylon */ | expression { printf("%d", $1); prompt; } ENDOFLINE lines ; expression : expression PLUS term { $$ = $1 + $3; } | expression MINUS term { $$ = $1 - $3; } | term { $$ = $1; } term : term MULTIPLY factor { $$ = $1 * $3; } | term DIVIDE factor { $$ = $1 / $3; } | factor { $$ = $1 } factor : LPAR expression RPAR { $$ = $2; } | NUMBER { $$ = tokenValue; } | MINUS NUMBER { $$ = -tokenValue; } %% #include "lex.yy.c" main(){ printf("%5d : ", lineNumber); yyparse(); return 0; } yyerror(char *s){ printf("%s\n", s);

コンパイラの動作概要 結局コンパイラはどう動いているのか? 概要を理解しよう (教科書2.3 p.15~19 を参照のこと)

プログラムの一部(Pascal言語) Program example; Var abc, e3, fg: real; Begin abc := e3*2.56 + abc/e3; end

abc := e3*2.56 + abc/e3; の処理 変数名表(1) 番号 変数名 データ型 アドレス 1 2 演算記号表(8) 番号 1 2 演算記号表(8) 番号 演算 := 1 + 2 - 3 * 4 / 定数表(2) 番号 変数名 データ型 アドレス 1 2

abc := e3*2.56 + abc/e3; の処理 変数名表(1) 演算記号表(8) 番号 変数名 データ型 アドレス abc abc real 100 1 e3 104 2 fg 108 番号 演算 := 1 + 2 - 3 * 4 / 定数表(2) 番号 変数名 データ型 アドレス 2.56 real 500 1 2 スタック _(8,1)(8,1)(8,4) 出力:(1,0)(1,1)(2,0)(8,3)(1,0)(1,1)(8,4)(8,1)(8,0)

その他参考コード (コード1) lexer.lとparser.y (コード2) lexer2.lとparser2.y (コード4) lexer4.lとparser4.y (Webページに挙げてあります。)

試験へ向けて 教科書の 3.1 バッカス記法 と 3.2 構文図式 は、試験に出ます。勉強しておいてください。