2008-04-25

Lexical Analysis

眠い。睡眠時間ってやっぱし大事だ。

春休みの間課題の多い生活から離れていたせいか、時間管理が下手になってるorz
さっそく、実験レポの時間管理で失敗してるしorz orz
想像していた時間より、2倍近くかかった。
まずいな。修正しなくては。

加えて、OS実践の課題も今のうちにある程度進めておかないと、
後半戦で死亡フラグ立つわ。毎日ガリガリやるしかねぇw

とりあえず、SoC設計取り消しといて正解だったといえるな。
当時の俺Good job。


----------- note -------------
字句解析(Lexical Analysis)@wikipedia

連続した文字の並びを、意味における最小単位である字句(一般にはトークン、英文なら単語など。)に分割すること。字句解析を行うプログラムを字句解析器(lexical analyzer)と呼ぶ。英語ではlexerとも。字句解析器はスキャナとトークナイザから構成される。

プログラミング言語の仕様には規則群があり、一般に何らかの構文記法で示され、トークンや語彙素を形成する文字の並びを指定する。空白文字は字句解析では無視されることが多い。自然言語の字句解析を形態素解析と呼ぶ。なお、字句解析によって得られたトークンのならびについて、トークン間の関係を解析することを構文解析という。字句解析は、構文解析の前段階として広く行われている。しかし、高速な動作が必要でない場合は1文字を1トークンとみなすことで字句解析を無くし、構文解析のみで文字列の解析を行うシンプルな手法が使われる場合もある。




約束:一文字先読み

次の一字句を読み取る関数を使う。
get_char()
ch
get_token()
token
spell
value

spellかvalueのどっちかがとる。
・名前が同じかどうかがわからなくてはいけない。

1. 英字だったら読み飛ばす
2. (が出たのでmainが読める。
3. )が出るけど、一次先読みの取り決めがあるため、次の文字を読んでから()を理解する
4. {
5. intを読み込む
6. + 空白が来るので、intが予約語かどうか調べる。予約語だった!
7. two
8. ;が来るので、予約語かどうかを調べて、そうでなかったら大丈夫!
以下省略


・字句読み取り
変な文字列がきたら、それを格納するものを作る - nontoken
endffile EOF
comment /**/

enum {} 定数名をデータ番号をそれぞれ違う番号にして、使い分けるための整数型。
→それぞれ違う番号になることに意味があり、番号自体には意味はない。
→コンパイラが勝手に決めてくれえる。

get_char()で一文字先を読んでおく。

v = v*10 + (c + -'0')

・予約語の同定→一致しているかどうか
適当なhash関数をかけて、綴りがすべて違えばいい。

たとえば、予約語が10個あったら、場所は10個以上必要。

・具現
if文でやると無駄に多く比較してしまう。
switch文でやるのが

配列[数十個]を英数字分用意して、それぞれの配列に入っている中身を参照して処理を決めればよい!
→それを作ってね。
というのがswitch文。

WL言語ではswitchがかけないので、手で書く。
さらに早くするためには、実行頻度が多い部分を早めにif文を持っていく。
二分岐する。

字句解析は自習。自分で呼んでくること。


英字からはじまるabcdからなる文字列で
末尾がabでおわっているもの。
ただし、末尾を除いて、bc(正:ab)という部分列は現れていないものに限る。


-------------------------------
課題

課題内容: WLの字句解析を読み,実習課題のLEX-1を行え。

LEX-1
get_token を呼び出して,次々と字句を切り出し,その結果を 表示する 簡単な主算譜 と これらの関数を一緒にして WL処理系で翻訳し,実行して見よ。
実行に際しては,これまでに入手している算譜を試料 (test data) として使って見るのもよい。

レポートとしては,つぎのものを記載すること。
 ・でき上がった字句解析のソースプログラム
 ・入力例
 ・その入力例に対する出力結果
 ・考察
レポートは,ファイルの形で用意し,それを添付することによって提出せよ。

-------------------------------
テストは小テストと同じ方式で出題する。

次回:
エラーが出たときの処理。
宣言の結果を表に記録し、型があっているかどうかをチェックする方法。

0 件のコメント: