2007-01-01から1年間の記事一覧

息子(3歳)と映画館に。「レミーのおいしいレストラン」。 いざこれから、ってときに「疲れた、帰る」攻撃にあう。 あと奥さんのプレゼントに傘を買う。

lispで言語実装(4)

電卓の実装(4) 番外編 前回までのコードでは、「-1+2」の様な計算ができない。本当は字句解析で「-1」というトークンを返すようにするのがいいのかもしれないが、せっかくBNFで構文解析を記述できるようにしたので、Fの定義を以下のように変更して対応してみ…

lispで言語実装(3)

電卓の実装(3) 意味解析 字句解析 構文解析 意味解析← いまここ 2*(1+2)から(* 2 (+ 1 2))が得られるようになったので、あとはそれを計算するだけ。lispで処理しやすい形に整形してあるので処理は簡単。 構文解析の時点で、1+1+1+1 → (+ 1(+ 1 (+ 1 1)))のよ…

lispで言語実装(2)

電卓の実装(2) 構文解析 字句解析 構文解析 ← いまここ 意味解析 「1+2*3」の様な入力に対して、「(+ 1 (* 2 3))」を返す処理を作成する。 数式の構文規則は、以下の様に表現される。 E := T [["+" | "-"] T]* T := F [["*" | "/"] F]* F := NUM | "(" E ")"…

lispで言語実装

新年だし、言語実装の勉強をはじめよう。ベース言語にはlispを選択。以下の手順で進めようと考えている。 電卓の実装 TinyCの実装 若干実用的な言語の実装 lisp処理系は、xyzzy lispを利用する。 電卓の実装(1) 字句解析 「(100+3)*10」のような入力に対して…

使っている処理系にstrtok_rがなかったので自作

こんな感じかな。strspnとstrcspnを使います。 #include <string.h> char *strtok_r(char *str, const char *delim, char **saveptr) { size_t width; char* head; head = (NULL != str)? str: *saveptr; width = strcspn(head, delim); if(0 == width){ head += strsp</string.h>…