スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#で入門 コンパイラ、インタプリタ編 Whitespace(1)

 新シリーズの「コンパイラ、インタプリタ編」です。まずは実装するのが簡単な(コードを書くのは大変ですが、)難解プログラミング言語であるWhitespaceのインタプリタを作ってみたいと思います。 
最終的には次のようなウィンドウプログラムを作り上げたいと思います。(総コードで700行程度です。) 
 
 460-1.jpg
 
Whitespaceは「空白」「タブ」「改行」の三種類の文字から構成されたソースを読み込んで、動作するよう定義された、プログラミング言語です。 
まずは、ソースを読み込んで、目で見えるように、空白\sをs,タブ\tをt,改行\nをnで置き換える関数を定義しておきます。 
 
補助関数として「正規表現のコンストラクタに渡す文字列(置き換え対象文字とマッチする表現)」と「置き換える文字」と、もとの文字列を引数にして、置き換えた後の文字列を返す関数を定義します。 
 
let myReplace (regStr:string) (repStr:string) (oriSrcStr:string)= 
    (new Regex(regStr)).Replace(oriSrcStr,repStr) 
 
使ってみます。 
 
> //aかcをxで置き換える 
myReplace "[ac]" "x" "abcdefg";; 
val it : string = "xbxdefg" 
 
> //a,c以外をxで置き換える 
myReplace "[^ac]" "x" "abcdefg";; 
val it : string = "axcxxxx" 
 
ではこれを使っ「て空白\sをs,タブ\tをt,改行\nをnで置き換える(なお空白タブ改行以外は取り除く)関数visualize」を定義します。 
 
> let visualize (src:string) = 
    src 
    |> myReplace "[^\s]" "" 
    |> myReplace " " "s" 
    |> myReplace "\t" "t" 
    |> myReplace "\n" "n";; 
 
val visualize : string -> string 
 
使ってみます。(Visual studioではタブは自動的に半角スペースに変換されるので\tを使ってます。) 
 
> let t = " \t        
\t  " 
;; 
 
val t : string = "             
      " 
 
> visualize t;; 
val it : string = "stsssssssntss" 
 
次にWhitespaceがこの3文字で構成されたソースをどのように解釈して実行していくのかのルールの説明です。 
 
Whitespceは記憶用途のものとして、一つのスタックと、ヒープ領域(アドレスを指定して値を書き込んだり、読み込んだりできるメモリ)を使用します。 
 
またWhitespaceでは、ソースを命令文の連結したものだとして解釈します。 
命令文の種類としては 
 ■[Space] スタック操作 
 ■[Tab][Space] 演算 
 ■[Tab][Tab] ヒープアクセス 
 ■[LF] フロー制御 
 ■[Tab][LF] I/O 
 
の5種類があります。   
 
これらの命令文の内容は順次紹介していくこととして、命令文の一部として出てくる数値の表現と、その翻訳をする部分から始めます。 
 
数値は0以上の整数はsから、負の整数はtから始まり、残り部分が2進数表記でsが0、tが1を表します。そして最後にnが付きます。 
少し例を挙げます。 
 
ststsn ->+1010(2進数)     ->  10(10進数) 
ttstn  ->-101 (2進数)     -> -5(10進数) 
 
正規表現で最初のsかtからnの前まで取り出して処理するので、この部分を整数化する関数wToNumを用意しておきます。 
 
 
> let wToNum (str:string) = 
    let strbiNum = 
        str.Substring(1) 
        |> myReplace "s" "0" 
        |> myReplace "t" "1" 
    let absPart10 = System.Convert.ToInt32 (strbiNum,2) 
    if str.Substring(0,1) = "s" then absPart10 
    elif str.Substring(0,1) = "t" then (-1)*absPart10 
    else failwith "数値表現エラー";; 
 
val wToNum : string -> int 
 
(使用例) 
> wToNum "ssststs";; 
val it : int = 10 
 
> wToNum "ttst";; 
val it : int = -5 
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。