[kernel-ml 14] Re: Request for Comment (

Naitoh Ryuichi ((no email))
Wed, 31 May 1995 01:05:24 +0900

隆一@B-Free です。

>> On Tue, 30 May 1995 19:41:00 +0900, 磯山 卓志 <GGG03556@niftyserve.or.jp> said:

> 磯山です。
>>> scheme というと、Common Lisp の Guy Steel Jr. と G.J.Sussman の作った
>>> 言語ですね。Common Lisp に比べるとかなり仕様は小さいですが、やっぱり
>>> Lisp ですので、Boot に使う言語としては無理があるような気がします。

> そうですね。中身が完全なLispマシンならばともかく。

> 「Lispでbootする」って宣伝すると、Lisper達がB-Free OSに興味もってくれるかも
> という、スケベな下心から書いてみました。:-)

。。。good idea かもしれない。。。

# ところで、日本の Lisper ってどのくらい残っているんでしょうか? :-P
# 絶滅寸前だったりして :-)

> SUNがforth系だというのならば、forth系でやってみましょうか。
> こんな感じなのかしら。

> %ITRONが入っているパスの指定
> /ITRON-PATH "/itron.img" def

> %指定したデバイスからプログラムを読み込み、実行を開始する
> /load-and-fly
> dup pop
> {
> read-program-header
> get-load-addr
> load-program-body
> run
> {
> "Cannot run program" print
> } if
> }
> {
> "Cannot open file" print
> } ifelse
> def

> として、

boot> ITRON-PATH "fd0" load-and-fly

> ※PostScriptもどき

残念ながら、PostScript はほとんど知らないのですが、次のような感じの文
法と考えていいのでしょうか?

'/'ではじまる単語はシンボル。
".." で囲んだ文は、文字列。
それ以外の文字は、予約語(関数)。
{ ... } で囲んだ文は、ひと固まりの処理を表現する。

予約語以外のシンボル、文字列が来たときにはスタックへ積む。
{ ... } で囲んだ文はそれをひとかたまりとして、スタックへ積む。
(中身は実行しない)。

構文解析の処理は、次のようになるのかな?

parser ()
{
TOKEN token;

for (;;)
{
token = read_token (); /* トークンの読み込み */
if ((トークンが文字列) || (トークンが数値))
{
token をスタックへ積む。
}
else if (トークンがシンボル)
{
シンボルテーブルに登録。
シンボルをスタックに積む。
}
else if (トークンは予約語(関数))
{
トークンを実行。
}
else if (トークンが '{')
{
非実行モードで '}' までのトークンを読み込み、
ひとかたまりのブロックを作成し、スタックに積む。
}
else
{
エラー :-P
}
} /* End of while */
}

確かに、forth (風) に逆ポーランド記法で書くと構文解析は単純そうですね。

-- 
内藤隆一 (ggc00661@niftyserve.or.jp/night@bfree.rim.or.jp)