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

Slides:



Advertisements
Similar presentations
コンピュータープログラミング(C言語)(2) 1.文字列出力と四則演算 (復習) 2.関数と分割コンパイル
Advertisements

文法と言語 ー字句解析とオートマトンlexー
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
第2章 数値の入力と変数 scanfと変数をやります.
数値計算及び実習 第3回 プログラミングの基礎(1).
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
文法と言語 ー文脈自由文法とLR構文解析2ー
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
基礎プログラミング (第五回) 担当者: 伊藤誠 (量子多体物理研究室) 内容: 1. 先週のおさらいと続き (実習)
情報科学1(G1) 2016年度.
構造体.
プログラミング論 II 電卓,逆ポーランド記法電卓
東京工科大学 コンピュータサイエンス学部 亀田弘之
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
東京工科大学 コンピュータサイエンス学部 亀田弘之
言語プロセッサ2015 第10回目 〜資料番号 H28NoA〜
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
C言語講座 第3回 ポインタ、配列.
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
東京工科大学 コンピュータサイエンス学部 亀田弘之
言語プロセッサ2016 Language Processors 2016
言語プロセッサ2007 平成19年9月26日(水) (Ver.2 平成19年10月3日変更)
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
文法と言語 ー字句解析とオートマトンlexー
文法と言語 ー字句解析とオートマトンlexー
FlexとBison+アルファ -実習編-
オブジェクト指向 プログラミング 第二回 知能情報学部 新田直也.
東京工科大学 コンピュータサイエンス学部 亀田弘之
プログラミング基礎a 第10回 Javaによる図形処理入門(2) GUIの使い方
高度プログラミング演習 (02).
東京工科大学 コンピュータサイエンス学部 亀田弘之
プログラミング基礎a 第10回 Javaによる図形処理入門(2) GUIの使い方
文法と言語 ー文脈自由文法とLR構文解析2ー
プログラミング基礎B 文字列の扱い.
平成20年10月5日(月) 東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
オブジェクト指向 プログラミング 第二回 知能情報学部 新田直也.
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
B演習(言語処理系演習)第2回 田浦.
C言語 はじめに 2016年 吉田研究室.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
文法と言語 ー字句解析とオートマトンlexー
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
コンパイラ 2012年10月11日
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
Cp-1. Microsoft Visual Studio 2019 C++ の使い方 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
文法と言語 ー文脈自由文法とLR構文解析2ー
第12章 乱数という業の深い存在 ~ランダムな値・他~
printf・scanf・変数・四則演算
第2章 数値の入力と変数 scanfと変数をやります.
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
第1章 文字の表示と計算 printfと演算子をやります 第1章 文字の表示と計算.
第1章 文字の表示と計算 printfと演算子をやります.
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
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);