【事例演習5】 字句解析 解 説 “ハッシュを用いた字句解析の方法” ● 字句解析アルゴリズムの応用分野 => 【例 1int 】 コンパイラ,インタプリタ 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 b a , c = IX = a * + c 1 ; : } = 12; ; どのレベルで定義されたかを高速に 決定してやる必要がある なぜなら名前は同じでも,型や記憶個所は 通常異なる ● 字句解析で検索すべきデータ 調べるべき対象文字列が格納された文字配列 syllable_buff X 1 \0 順番に比較してゆく線形探索 だと,変数が多くなるにつれ効 率が悪くなる. すでに定義された変数に関する情報が 格納されたテーブル 変数名 A B C X1 Y1 A B 変数の型 float float float int int int int 1.高速に変数に関する情報を検索できるようするには データ構造をどのようにすればよいか 2.その検索手順はどのようにすべきか 定義レベル 0 0 0 1 1 1 1 ● 高速化を実現するデータ構造 調べるべき対象文字列 syllable_buff ハッシュテーブル X 1 \0 ハッシュ(ちらし)関数 < hash_tbl > 変数情報を格納しておくスタック hash_addr < stack_head > 変数名を格納しておく文字列配列 tos_head 格納された変数情報の配 列stack_head上での位置 6 float 5 char 4 char* 3 int * 2 int[ ] 1 < symbol_tbl > X 1 \0 float 0 同じhash_addrをもつ変数を 結ぶリンク(hash_link) 変数名を格納した文字列配列 symbol_tbl上での位置(symbol_address) 変数がもつ型(var_type) 変数が定義されたレベル この変数情報を指すデータが格納されている 配列hash_tblの位置(hash_address) ● ハッシュ関数 (155ページ参照) 文字列ポインタsyll_buff < hash_tbl > 調べるべき対象文字列 syllable_buff hash_addr 0 1 2 3 4 X 1 \0 = hash % HASH_SIZE HASH_SIZE syllable_buff を ビット列で表し たもの この1バイトを8ビットで表される数値として解釈するには (int) *syll_buff ●NULL文字が来るまでポインタを進めながら繰返し合計値hashを求める hash += (int) *syll_buff; syll_buff ++; 【課題】 文字列としての数字を,1ワードの数値に変換する 文字列ポインタ pscan 文字列scan_buff 1 2 4 .5 6 (注) 1文字の数字を数値と解釈するには (int)(*pscan – ‘0’) float型変数 syll_value 指数部の符号 仮数部の符号 仮数部 指数部 内部表現形式 ( 0.12456*102 ) 数字 内部コード(16進) 0 30 1 31 2 32 3 33 :
© Copyright 2024 ExpyDoc