2007年6月22日金曜日

KEMURIのインタプリタ 改訂版

KEMURIのインタプリンタ改訂版。
前回のバグの原因は仕様の勘違いでした。これで正常に動作するように。

// HSPで記述されたKEMURIのインタープリタ 改訂版
#runtime "hsp3cl"

// エラーコードの定義
#enum ERROR_NO_ERROR = 0
#enum ERROR_UNKNOWN_COMMAND
#enum ERROR_STACK_EMPTY

    goto *start

// スタック用命令をグローバル空間にて定義
#deffunc push int arg1
    if count >= 0 {
        stack(count) = arg1
        count++
    }
    return

#defcfunc pop
    count--
    if count < 0 {
        error = ERROR_STACK_EMPTY
        return 0
    }
    return stack(count)

// 処理の開始
*start
    mes "KEMURI インタープリタ v1.0"
    mes "=========================="
    mes "コマンドを入力してください"
    dim stack, 16
    gosub *get
    gosub *exe
    gosub *show
    end

// コマンドを取得する
*get
    command = ""
    input command, 01
    getstr command, command // 改行コードを取り除く
    return

// コマンドを解析し、実行
*exe
    error = ERROR_NO_ERROR
    repeat strlen(command)
        switch peek(command, cnt)
        case '^'
            x = pop() : y = pop()
            push x ^ y
            swbreak
        case '~'
            x = pop()
            push $FF ^ x
            swbreak
        case '"'
            x = pop()
            push x : push x
            swbreak
        case '\''
            x = pop() : y = pop() : z = pop()
            push x : push z : push y
            swbreak
        case '`'
            s = "Hello, world!"
            repeat strlen(s), 1
                push(peek(s, strlen(s) - cnt))
            loop
            swbreak
        case '|'
            sdim s, count + 1
            repeat count
                x = pop() & $FF
                poke s, cnt, x
            loop
            mes s
            swbreak
        default
            error = ERROR_UNKNOWN_COMMAND
            swbreak
        swend
        if error != ERROR_NO_ERROR {
            errorPos = cnt
            break
        }
    loop
    return

// 結果やエラーの表示
*show
    if error == ERROR_NO_ERROR {
        mes "処理が正常に終了しました"
    } else {
        switch error
        case ERROR_UNKNOWN_COMMAND
            mes "エラー:規定されていないコードが見つかりました"
            mes "利用できるのは\" ' ` ~ ^ |の6つのみです"
            swbreak
        case ERROR_STACK_EMPTY
            mes "エラー:空のスタックから取り出そうとしました"
            swbreak
        default
            mes "エラー:未知のエラーが発生しました"
            swbreak
        swend

        mes "エラー発生箇所:" + (errorPos + 1) + "文字目の" + strmid(command, errorPos, 1)
    }
    return

2 件のコメント:

RE:No.44 さんのコメント...

errorさんってインタプリタにも興味あるんですか?
電卓のスクリプトもありましたしね
僕も少し興味あります
開発wikiのインタプリタ企画を推し進めるのは君しかいない!と煽っておきます

そうそうHNは”りすと”です
このHNはこれに変えるか迷っている途中です
やっぱりHNは本名を連想させるのがいいのかもしれませんしねえ

僕の下の名前はヨシノリなので
それの逆さ読みです
リノシヨ
もしくは
レスポンス・ナンバー・44 と
お読み下さい

そうそう、相互リンクなんですけど
まだバナー書いてないものでスミマセン
それでもいいなら相互リンクしませんか?

eller さんのコメント...

コメントありがとうございます。
本名晒して良かったんでしょうか…?
問題ありましたら削除いたしますよー。

インタプリンタに興味があるというわけではなく、文字列操作全般に興味があるのです。HTMLタグの消去やCSVをHTMLのテーブルに書き換えるなどいろんなスクリプトを書きためています。
KEMURIは文字列操作というよりはスタックとエラー対策がメインでしたけれど。
電卓は昔からの難題で、最近ようやく実装方法が分かってきました。……再帰も好きなのかな?

特に今使っている言語に不満はないのでインタプリンタ企画は興味無いですね。他の皆さんがどんな言語をデザインするか、期待しています。

# こちらからリンクさせていただきました。これからもよろしくお願いします。