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

Slides:



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

自然言語処理 平成 24 年 11 月 5 日 (No5)- 東京工科大学 コンピュータサイエンス学部 亀田弘之.
プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
東京工科大学 コンピュータサイエンス学部 亀田弘之
応用理工学情報処理 第1回(2015年10月 5日) 月曜日担当 前島展也 Manaba
コンパイラ 2011年10月17日
東京工科大学 コンピュータサイエンス学部 亀田弘之
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
情報とコンピュータ 静岡大学工学部 安藤和敏
東京工科大学 コンピュータサイエンス学部 亀田弘之
プログラミング言語論 第4回 式の構文、式の評価
2006/10/19 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井英二郎
東京工科大学 コンピュータサイエンス学部 亀田弘之
コンパイラ 2012年10月15日
東京工科大学 コンピュータサイエンス学部 亀田弘之
言語プロセッサ2015 第10回目 〜資料番号 H28NoA〜
言語プロセッサ2015 Language Processors 2015
ネットワークプログラミング 中村 修.
東京工科大学 コンピュータサイエンス学部 亀田弘之
言語プロセッサ2016 Language Processors 2016
言語プロセッサ2007 平成19年9月26日(水) (Ver.2 平成19年10月3日変更)
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
言語プロセッサ 第7回目 平成27年11月16日.
東京工科大学 コンピュータサイエンス学部 亀田弘之
プログラミング言語論 第3回 BNF記法について(演習付き)
FlexとBison+アルファ -実習編-
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
言語プロセッサ 第8回目 平成22年11月22日.
地域情報学 C言語プログラミング 第1回 導入、変数、型変換、printf関数 2016年11月11日
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
平成20年10月5日(月) 東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
プログラミング言語論 第9回 情報工学科 木村昌臣 篠埜 功.
コンパイラ 2011年10月20日
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
B演習(言語処理系演習)第2回 田浦.
C言語 はじめに 2016年 吉田研究室.
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
コンパイラ 2012年10月1日
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
第6回放送授業.
言語プロセッサ 第12日目 平成20年1月9日.
標準入出力、変数、演算子、エスケープシーケンス
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
コンパイラ 2012年10月11日
情報とコンピュータ 静岡大学工学部 安藤和敏
形式言語とオートマトン Formal Languages and Automata 第5日目
第7章 そろそろ int 以外も使ってみよう! ~データ型 double , bool~
1.2 言語処理の諸観点 (1)言語処理の利用分野
第2章 数値の入力と変数 scanfと変数をやります.
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
第1章 文字の表示と計算 printfと演算子をやります.
Presentation transcript:

東京工科大学 コンピュータサイエンス学部 亀田弘之 ネットワークの準備お願いします! 言語プロセッサ2015 No.8 東京工科大学 コンピュータサイエンス学部 亀田弘之 言語プロセッサ2015(東京工科大学CS学部)

今日から演習 言語プロセッサ2015(東京工科大学CS学部)

分析 合成 ソース言語 読み込み 字句解析 構文解析 中間語生成 コード生成 目的言語 #include <stdio.h> main(){ float kingaku = 0, teika = 100; float shouhizei = 0.10; kingaku = teika + teika*shouhizei; printf("kingaku=%f\n", kingaku); } 読み込み 字句解析 分析 構文解析 .file "test2.c" .def ___main; .scl 2; .type 32; .endef .section .rdata,"dr"LC3: .ascii "kingaku=%f\12\0" .text.globl _main .def _main; .scl 2; .type 32; .endef_main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp call ___main movl $0x00000000, %eax movl %eax, 28(%esp) movl $0x42c80000, %eax movl %eax, 24(%esp) movl $0x3dcccccd, %eax movl %eax, 20(%esp) flds 24(%esp) fmuls 20(%esp) fadds 24(%esp) fstps 28(%esp) flds 28(%esp) fstpl 4(%esp) movl $LC3, (%esp) call _printf leave ret .def _printf; .scl 2; .type 32; .endef 中間語生成 合成 コード生成 目的言語 言語プロセッサ2015(東京工科大学CS学部)

Flexの復習(確認) (いくつか実例をやります。) 言語プロセッサ2015(東京工科大学CS学部)

Flexの復習 確認1 (いくつか実例をやります。) 言語プロセッサ2015(東京工科大学CS学部)

数式をトークンに分解する! 練習1 練習2 練習3 入力: teika + teika * zei 確認2 練習1 入力: teika + teika * zei 出力: var(teika) op(+) var(teika) op(*) var(zei) 練習2 入力: a123 * xyz + 120 * h 出力: var(a123) op(*) var(xyz) op(+) num(120) … 練習3 入力: x1 + x2 * ( y1 + y2) 出力: var(x1) op(+) var(x2) op(*) lpa(() var(y1) … 言語プロセッサ2015(東京工科大学CS学部)

手順 Flexのプログラムを書く。 Flexのプログラムをflexにかける。 確認3 Flexのプログラムを書く。 Flexのプログラムをflexにかける。 出力ファイルlex.yy.cをgccでコンパイルする。この際,ライブラリーを忘れずに! 出力a.exeを実行する。 さまざまな文字列を入力する。 言語プロセッサ2015(東京工科大学CS学部)

手順 確認4 ライブラリ(fl) Flex Lex.yy.c gcc Flex Program a.exe 文字列入力 出力 言語プロセッサ2015(東京工科大学CS学部)

実際の手順 C:\> flex sample01.l C:\> gcc lex.yy.c –lfl C:\> a.exe 確認5 実際の手順 C:\> flex sample01.l C:\> gcc lex.yy.c –lfl C:\> a.exe それでは、実際にやってみよう。 言語プロセッサ2015(東京工科大学CS学部)

数式をトークンに分解する!(再) 練習1 練習2 練習3 入力: teika + teika * zei 確認6 練習1 入力: teika + teika * zei 出力: var(teika) op(+) var(teika) op(*) var(zei) 練習2 入力: a123 * xyz + 120 * h 出力: var(a123) op(*) var(xyz) op(+) num(120) … 練習3 入力: x1 + x2 * ( y1 + y2) 出力: var(x1) op(+) var(x2) op(*) lpa(() var(y1) … 言語プロセッサ2015(東京工科大学CS学部)

構文解析の実装 〜BisonとFlaxの応用〜 最終目標: PL/0 言語の構文解析器を自作する。 (注) PL/0言語とは、Niklaus Wirth がコンパイラ教育のために考案した    プログラミング言語。 言語プロセッサ2015(東京工科大学CS学部)

準備をしましょう! 言語プロセッサ2015(東京工科大学CS学部)

BNFとEBNF(文法の記述法) How to describe a grammar of a programming language, especially syntactic rules. (注)前回までは、文脈自由文法の記法を 使っていた。もちろん、それでもいい のだが、… (参考)教科書29ページ参照の事。 言語プロセッサ2015(東京工科大学CS学部)

BNFの例 文脈自由文法 BNF(Backus Naur Form) 文 → 主語 述語 主語 → 名詞 助詞 述語 → 副詞 動詞 名詞 → 子犬 | アヒル | 子供 助詞 → が | も | は 副詞 → ゆっくりと | よたよたと |素早く 動詞 → 歩いている | 移動する <文> ::= <主語> <述語> <主語> ::= <名詞> <助詞> <述語> ::= <副詞> <動詞> <名詞> ::= 犬 | アヒル | 自動車 <助詞> ::= が | も | は <副詞> ::= ゆっくりと | のんびりと |素早く <動詞> ::= 歩いている | 移動する 言語プロセッサ2015(東京工科大学CS学部)

BNFの例(続き) 文 => 主語 述語 => 名詞 助詞 副詞 動詞 => 子犬 が ゆっくりと 移動する <文> => <主語> <述語> => <名詞> <助詞> <副詞> <動詞> => 子犬 が ゆっくりと 移動する 言語プロセッサ2015(東京工科大学CS学部)

BNFの例(2) <数字> ::= 0|1|2|3|4|5|6|7|8|9 <英字> ::= a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t |u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K |L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z <名前> ::= <英字>|<名前> <英字>|<名前> <数字> 言語プロセッサ2015(東京工科大学CS学部)

BNFの例(2)(続き) 名前の例 hensuu, KoukaDai, university, smart, OK など <名前>=> <名前><英字> => <英字> K => OK 言語プロセッサ2015(東京工科大学CS学部)

Bisonでの記述 Bisonのコード 元のBNF <名前> : <英字> |<名前> <英字> |<名前> <数字> ; <数字> ::= 0|1|2|3|4|5|6|7|8|9 <英字> ::= a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t |u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K |L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z <名前> ::= <英字> |<名前> <英字> |<名前> <数字> 言語プロセッサ2015(東京工科大学CS学部)

実際のコード Bisonのコード Flexのコード id : character | id character | id number ; [a-zA-Z]+ return(CHARACTER); [0-9]+ return(NUMBER) 言語プロセッサ2015(東京工科大学CS学部)

EBNF 実際にプログラミング言語やXMLなどの形式言語を記述する場合、BNFでは書きにくい場合もあるため、BNFを拡張したものが使われる。それがEBNF(extended BNF)である。 言語プロセッサ2015(東京工科大学CS学部)

数式の文法(BNF) <expression> ::= <term> | <expression> "+" <term> <term> ::= <factor> | <term> "*" <factor> <factor> ::= <constant> | <variable> | "(" <expression> ")" <variable> ::= "x" | "y" | "z" <constant> ::= <digit> | <digit> <constant> <digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" 言語プロセッサ2015(東京工科大学CS学部)

ENFの例(3) 数式 expression = term | expression, "+" , term; term = factor | term, "*" , factor; factor = constant | variable | "(" , expression , ")"; variable = "x" | "y" | "z"; constant = digit , {digit}; digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" 言語プロセッサ2015(東京工科大学CS学部)

Syntax Diagram(構文図) こちらで書いた方がわかりやすい! 積極的に利用しましょう。 (図は別途紹介します) こちらで書いた方がわかりやすい! 積極的に利用しましょう。 (図は別途紹介します) 言語プロセッサ2015(東京工科大学CS学部)

(今後の予定) 数式を中間言語へ変換するプログラムの作成 (配布資料を配ります。) 言語プロセッサ2015(東京工科大学CS学部)

出題および提出日は、後日お知らせします。 (予告)レポート課題 数式を中間言語へ変換するプログラムに対して、5種類の計算式を 入力し実行せよ。 レポートには、入力した式とその出力を記せ。下記に書き方の例を示 しておく。 入力 出力 ① a + b*c T1: ( *, b, c ) T2: ( +, a, T1 ) ② abc + xy T1: ( +, abc, xyz) 出題および提出日は、後日お知らせします。 言語プロセッサ2015(東京工科大学CS学部)