理系学生日記

おまえはいつまで学生気分なのか

忍者TOOLS

Scheme のコードの字句解析

SICP の第 4 章は,SchemeScheme の簡単な処理系を実装するような感じみたいなんですけど,higepon さんが C++Schemeインタプリタを作っていっています.

おぉおぉ,別言語で実装するのも面白そうにかんじたぼくは,バカの一つ覚えみたいに Perl の上で Scheme が動いたらワクワクするよなとか思いましたから,なんか突然 Perl ベースで SICP 第 4 章を進めてみようと決意したのでした.

決意の強さ

ぼくの決意の強さとかはドコモダケの手足のごとくか細い.

しかしですね,飽きたら飽きたでそこまで進めてきた努力だのはムダにはならないような気もしますし,まず始めなければ飽きることすらできませんから,まずは始めたほうがエラいのです.

まず

全体を把握しないと実装することはむずかしい.ぼくは 4 章を読みはじめたばっかしで,まだ全体的なところをよく理解してませんので,実装とか考えるよかまずは読んだほうがいい.
ただ,字句解析とかはさっさとやっときたいなとか思ったので,とりあえずトークンを区切るのだけ考えてみた.

最初にあんまし細かいこととか気にしすぎるとアレなんで,なんかこんなんで良いような気がする.

my @tokens = map { split /(?<=\()|(?=\))/, $_ } split /\s+/, <<SOURCE;
(define (list->set-name size lst)
  (cond
   ((null? lst)				"e")
   ((= size (list-length lst))		"f")
   (#t					(apply join-fields-with " " (map ->string lst)))))
SOURCE

print join "\n", @tokens, "\n";

実行するとこんな感じになって,まぁなんとなく区切れてるっぽい.

(
define
(
list->set-name
size
lst
)
(
cond
(
(
null?
lst
)
"e"
)
(
(
=
size
(
list-length
lst
)
)
"f"
)
(
#t
(
apply
join-fields-with
"
"
(
map
->string
lst
)
)
)
)
)

しかしこれには問題があって,二重引用符の中のスペースとかでも区切られてしまいますからぜんぜんダメだ.やっぱし一気に区切るんじゃなくて,文字単位で区切るしかなさそうな予感.
このへん読んで,どうやって解析してんのか確認してみる.