【事例演習5】  字句解析     解 説  “ハッシュを用いた字句解析の方法”.

Slides:



Advertisements
Similar presentations
メモリとポインタ. プログラムの前提 コンピュータは、0と1で計算をし、 0と1でデータを保存している。 メモリを学ぶのに必要な知識である。
Advertisements

復習 配列変数の要素 5は配列の要素数 これらの変数をそれぞれ配列の要素と呼ぶ この数字を配列の添え字,またはインデックスと呼ぶ
復習 配列変数の要素 5は配列の要素数 これらの変数をそれぞれ配列の要素と呼ぶ この数字を配列の添え字,またはインデックスと呼ぶ
アルゴリズムとデータ構造 第2回 線形リスト(復習).
基本情報技術概論 I 演習(第5回) 埼玉大学 理工学研究科 堀山 貴史
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
情報処理演習C2 ファイル操作について (2).
コンパイラ 2011年10月17日
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
データ構造とアルゴリズム 第10回 mallocとfree
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
オペレーティングシステムJ/K 2004年11月4日
情報処理Ⅱ 2005年12月9日(金).
第8回 プログラミングⅡ 第8回
アルゴリズムとデータ構造 2011年6月13日
構造体.
システム開発実験No.7        解 説       “論理式の簡略化方法”.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
コンパイラ 2012年10月15日
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
ハッシュテーブル.
プログラミング 4 記憶の割り付け.
画像処理プログラムの説明.
プログラミング演習I 2003年5月7日(第4回) 木村巌.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
第13章 文字の取り扱い方 13.1 文字と文字型関数 13.2 文字列 13.3 文字型配列への文字列の代入
第7回 プログラミングⅡ 第7回
Ibaraki Univ. Dept of Electrical & Electronic Eng.
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
プログラミング基礎B 文字列の扱い.
2005年度 データ構造とアルゴリズム 第6回 「ハッシュ法を用いた探索」
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
2013年度 プログラミングⅡ ~ 計算してみよう ~.
2015年度 プログラミングⅡ ~ 計算してみよう ~.
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
型の compatibility とポインタ演算
情報処理Ⅱ 第2回:2003年10月14日(火).
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
プログラミング基礎a 第6回 C言語によるプログラミング入門 配列と文字列(その2)
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
ポインタとポインタを用いた関数定義.
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
コンパイラ 2012年10月29日
アルゴリズムとデータ構造 2012年6月11日
オペレーティングシステムJ/K (管理のためのデータ構造)
情報処理Ⅱ 第2回 2005年10月14日(金).
情報処理Ⅱ 第2回 2006年10月13日(金).
第11回放送授業.
アルゴリズムとデータ構造1 2009年6月15日
情報処理Ⅱ 2006年11月24日(金).
情報処理Ⅱ 第7回 2004年11月16日(火).
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
コンパイラ 2012年10月11日
プログラミング 4 文字列.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
アルゴリズムとデータ構造 2010年6月17日
情報処理Ⅱ 第2回 2004年10月12日(火).
情報処理Ⅱ 2005年11月25日(金).
プログラミング基礎a 第5回 C言語によるプログラミング入門 配列と文字列
情報処理Ⅱ 小テスト 2005年2月1日(火).
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
Presentation transcript:

【事例演習5】  字句解析     解 説  “ハッシュを用いた字句解析の方法”

● 字句解析アルゴリズムの応用分野 => コンパイラ,インタプリタ 【例1 】 ● 字句解析アルゴリズムの応用分野       =>  コンパイラ,インタプリタ 【例1 】 int int1,j,k,l,i1,j1,i2,j2,count[10]; float X1,Y1,floar,theta=13.0,alpha,beta,pai=3.141592,const=1.2; int for1=20,whil=0.0; for ( int1 = 1; int1 < for1 ; int1 ++) { whil1 += X1 * sin ( theta * pai / 180.0 ) + const ); : : } ・名称は変数名なのか組み込み関数名なのか, ・変数名はすでに定義されたものか, ・型は何であるか(int,float,char)等を高速に決定してやる必要がある

【例2 】 int IX = 190,IY = 360; float a , b , c ; void func( int p, float q) { int a , c = 12; a = IX * c ; b = a + 1 ; : } どのレベルで定義されたかを高速に 決定してやる必要がある  なぜなら名前は同じでも,型や記憶個所は 通常異なる

● 字句解析で検索すべきデータ 1.高速に変数に関する情報を検索できるようするには データ構造をどのようにすればよいか ● 字句解析で検索すべきデータ すでに定義された変数に関する情報が    格納されたテーブル 調べるべき対象文字列が格納された文字配列 syllable_buff  変数名        変数の型     定義レベル A float 0 B float 0 C float 0 X1 int 1 Y1 int 1 A int 1 B int 1 X 1 \0 順番に比較してゆく線形探索だと,変数が多くなるにつれ効率が悪くなる. 1.高速に変数に関する情報を検索できるようするには   データ構造をどのようにすればよいか 2.その検索手順はどのようにすべきか

● 高速化を実現するデータ構造 syllable_buff < hash_tbl > hash_addr ● 高速化を実現するデータ構造 X 1 \0 調べるべき対象文字列 syllable_buff ハッシュ(ちらし)関数 ハッシュテーブル < hash_tbl > 変数情報を格納しておくスタック hash_addr       float char char* int * int[ ]         float < stack_head > 変数名を格納しておく文字列配列 tos_head < symbol_tbl > 6 5 4 3 2 1 0 X 1 \0 格納された変数情報の配列stack_head上での位置 変数名を格納した文字列配列 symbol_tbl上での位置(symbol_address) 同じhash_addrをもつ変数を 結ぶリンク(hash_link) 変数がもつ型(var_type) 変数が定義されたレベル この変数情報を指すデータが格納されている 配列hash_tblの位置(hash_address)

● ハッシュ関数 (155ページ参照) < hash_tbl > syllable_buff hash_addr = ● ハッシュ関数  (155ページ参照) 文字列ポインタsyll_buff < hash_tbl > 調べるべき対象文字列 0  1  2  3  4 syllable_buff X 1 \0 hash_addr = hash % HASH_SIZE syllable_buffをビット列で表したもの HASH_SIZE この1バイトを8ビットで表される数値として解釈するには (int) *syll_buff  ●NULL文字が来るまでポインタを進めながら繰返し合計値hashを求める   hash += (int) *syll_buff; syll_buff ++; 

【課題】 文字列としての数字を,1ワードの数値に変換する ( 0.12456*102 ) 文字列ポインタ pscan 文字列scan_buff 1 2 4 .5 6 (注) 1文字の数字を数値と解釈するには     (int)(*pscan – ‘0’) float型変数 syll_value 数字 内部コード(16進) 指数部の符号 0    30   1 31 2 32 33 : 仮数部の符号 仮数部 指数部  内部表現形式 ( 0.12456*102 )