B演習(言語処理系演習)第2回 田浦.

Slides:



Advertisements
Similar presentations
プロセスの生成とコマンドの実行 プロセスの生成とコマンドの実行 プロセス生成のシステムコール プロセス生成のシステムコール プロセス生成のプログラム例 プロセス生成のプログラム例 プログラム実行のシステムコール プログラム実行のシステムコール 子プロセスの終了を待つシステムコール 子プロセスの終了を待つシステムコール.
Advertisements

オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
アルゴリズムとデータ構造 第2回 線形リスト(復習).
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
東京工科大学 コンピュータサイエンス学部 亀田弘之
情報処理演習C2 ファイル操作について (2).
コンパイラ 2011年10月17日
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
1.1 C/C++言語 Hello.ccを作りコンパイルしてa.outを作り出し実行する
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
言語処理系(4) 金子敬一.
12.3,E,-15, 12.3,E5,+,=, >,<,…,
リダイレクト パイプ 標準入出力プログラム コマンド行引数 関数 system()
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
第2回ネットワークプログラミング 中村 修.
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
記憶クラス 変数をどのような記憶領域に割り当てるかを指定するのが記憶クラス 記憶クラスには、自動変数、静的変数、外部変数などがある。
アルゴリズムとデータ構造 補足資料6-3 「サンプルプログラムcat3.c」
コンパイラ 2012年10月15日
TA 高田正法 B10 CPUを作る 2日目 SPIMのコンパイル TA 高田正法
補足説明.
Cプログラミング演習 中間まとめ2.
Microsoft Visual Studio 2005 の使い方
プログラミング論 ファイル入出力
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
B演習(言語処理系演習)第8回 評価器 田浦.
FlexとBison+アルファ -実習編-
オブジェクト指向 プログラミング 第二回 知能情報学部 新田直也.
B演習(言語処理系演習)第3回 字句解析 田浦.
プログラミング応用 printfと変数.
リダイレクト パイプ 標準入出力プログラム コマンド行引数 関数 system()
プログラミング演習I 2003年6月25日(第10回) 木村巌.
デバッガ dbx の使い方.
実行時情報に基づく OSカーネルのコンフィグ最小化
B演習(言語処理系演習)第4回 田浦.
プログラミング論 ファイル入出力
東京工科大学 コンピュータサイエンス学部 亀田弘之
デジタル画像とC言語.
演習1の解答例の解説 2006年11月8日 海谷 治彦.
文法と言語 ー文脈自由文法とLR構文解析2ー
東京工科大学 コンピュータサイエンス学部 亀田弘之
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
2005年度 データ構造とアルゴリズム 第6回 「ハッシュ法を用いた探索」
C言語演習 情報ネットワーク特論.
オブジェクト指向 プログラミング 第二回 知能情報学部 新田直也.
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
情報基礎演習I(プログラミング) 第11回 7月12日 水曜5限 江草由佳
2013年度 プログラミングⅠ ~ はじめてのプログラミング ~.
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
プログラミング演習I 2003年7月2日(第11回) 木村巌.
ファイルの読み込み, ファイルからのデータの取り出し, ファイルの書き出し
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
Make の使い方.
Visual Studio 2013 の起動と プロジェクトの新規作成 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
モジュール分割.
コンパイラ 2012年10月11日
全体の流れ 画像ファイルを開き,画像データをメモリ上にロード メモリ上にロードした画像データに処理を加える
文法と言語 ー文脈自由文法とLR構文解析2ー
プログラミング演習I 2003年6月11日(第9回) 木村巌.
情報処理Ⅱ 2005年11月25日(金).
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
情報処理Ⅱ 小テスト 2005年2月1日(火).
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
第1章 文字の表示と計算 printfと演算子をやります.
Presentation transcript:

B演習(言語処理系演習)第2回 田浦

今日の予定 言語処理系とは 大きなプログラムの書き方に関する一般論 今週の課題 部品化・モジュール化 部品の開発 分割コンパイル Makeによる自動化 Subversionによるソースの共有

言語処理系とは

言語処理系 プログラムP def fib(n): if n < 2: return 1 else: return … プログラムPの 動作・副作用 文字列

構文木 構文解析器 “fib” n 2 … def if < プログラムP def fib(n): if n < 2: return 1 else: return … 評価器 文字列 プログラムPの 動作・副作用

プログラムを書くときの考え方 「たくさんのことを一度にやらない」 言語処理系での例: 全体を,概念的に独立性の高い部品に分解する 部品単独の動作,部品間の相互作用を少なく,明確に 言語処理系での例: 構文解析器: 文字列を読み込んで構文木を作る 評価器: 構文木を実行 構文木の受け渡しが両者の唯一の相互作用 大きくなっても壊れない,維持・修正をしやすいプログラムを作る際の鉄則

def fib ( n ): if n < 2: return 1 else: return … 字句列(token stream) プログラムP def fib(n): if n < 2: return 1 else: return … 字句解析器 文字列 構文解析器 構文木 “fib” n 2 … def if < 評価器 プログラムPの 動作・副作用

おのおのの役割 字句解析器(tokenizer): 構文解析器(parser): 評価器(evaluator): 「文字列」から字句(単語)を認識.字句列を生成 正しくない字句(例: 1a)が現れたらエラー 構文解析器(parser): 字句列を構文木に変換 構文的に正しくない字句の列が現れたらエラー(parse error) 評価器(evaluator): 構文木をプログラムとして実行

構文木の実際 構文的に正しい任意のプログラムを表現できるデータ構造 本質的でない文字列としての違いを吸収する E.g., print 1 と print 1 さまざまな式,文に対して対応するtypedef (C++ class)を行って表現する

来週以降 字句解析器 構文解析器(+構文木の定義) 評価器 について順に説明していく

開発環境の選択肢 Unix的環境: Emacs + gcc (+ make, gdb, …) Microsoft的環境 折衷 Linux, cygwin Microsoft的環境 Visual studioの統合環境 折衷 Visual studioのコマンドラインコンパイラ(cl) エディタはEmacs

ウォームアップ課題 開発環境を決めて使ってみる 部品「文字ストーリムライブラリ」を作る それを使って「ファイルの行数カウント」プログラムを作る 分割コンパイル makeの利用 Emacsを統合環境として利用する 目標: 部品化の実例と,中サイズ以上のプログラムの開発サイクルに慣れる

部品: 文字ストリームライブラリ 機能: 指定されたファイル中の文字を順に読んでいく.常に 「最後に読まれた文字」 「その文字の現れた行番号,列番号」 を管理している 文字を読み込みながら,時々「現在の行番号・列番号」を知りたい

インタフェース(外部仕様) typedef char_stream { … } char_stream, * char_stream_t; char_stream_t cs = mk_char_stream(char * filename); void char_stream_next_char(cs); int char_stream_cur_char(cs); int char_stream_cur_line(cs); int char_stream_cur_column(cs);

lc.c (1) void line_count(char * filename) {   /* char_streamを作る */ char_stream_t cs = mk_char_stream(filename); if (cs == 0) { fprintf(stderr, "could not open %s\n", filename); exit(1); } while (char_stream_cur_char(cs) != EOF) {    /* EOFが出るまで読んでいく */ char_stream_next_char(cs); /* char_streamの仕様により,EOFの行番号がファイルの行数 */ printf("%d lines\n", char_stream_cur_line(cs));

lc.c (2) int main(int argc, char ** argv) { if (argc != 2) { fprintf(stderr, "usage: %s filename\n", argv[0]); exit(1); } line_count(argv[1]); return 0;

分割コンパイル 単にファイルを分けるだけでは× コンパイルの実際 部品(char_stream)のtypedef, 関数の宣言をヘッダファイル(cs.h)へ 部品(char_stream)の関数の定義(本体)をcs.cへ 利用者はcs.hをinclude コンパイルの実際 gcc –c cs.c gcc –c lc.c gcc –o lc lc.o cs.o

Make 分割コンパイルの簡略化・自動化 最小限のMakefile 生成したいファイルとその生成方法(コマンド)をMakefileに記述 生成したいファイルを生成するのに必要最小限のコマンドを自動的に実行 最小限のMakefile lc : lc.o cs.o gcc -o lc lc.o cs.o lc gcc -o lc lc.o cs.o lc.o cs.o gcc –c lc.c gcc –c cs.c lc.c cs.c

もう少し模範的なMakefile CFLAGS = -Wall OBJS = lc.o cs.o lc : $(OBJS) gcc -o lc $(OBJS) clean : rm -f $(OBJS) Cコンパイラオプション ファイル追加に応じて追加 make cleanで.oファイルを削除 (最初からコンパイルしなおすとき)

まめ知識: Emacsの統合環境化 M-x compile M-x shell M-x gdb C-o でバッファ間を移動 C-x ` (エラーの場所へ飛ぶ) M-x shell M-x gdb C-o でバッファ間を移動 (define-key global-map "\C-o" 'other-window)