JavaScript

短いオフサイドルールなパーサ字句解析器

HaskellやPythonオフサイドルールのパーサレキサーをjavascriptで書いてみました。 例はわざとレアなケースで書いてあります。 <script> Array.prototype.toString = function() { return "[" + this.join(",") + "]" } function run() { var ls = (document.getElem…

戦うパーサ

戦闘力表を元に戦って勝ったほうが結合するように書いてみました。 <script> // 式 function Exp(l,op,r){this.l=l;this.op=op;this.r=r} Exp.prototype.toString = function() { return "["+this.l+",\""+this.op+"\","+this.r+"]" } // 戦闘力表 var powers = {} /…

四則演算計算機のエラー処理について

インタプリタの場合のエラー処理としては字句解析上のエラーと構文解析上のエラー、0で割った場合のランタイムエラーなどがあります。 字句解析時と構文解析時のエラーは一まとめにシンタックス(構文)エラーとして出力するのが一般的なようです。エラーが…

Ioっぽいforth

Forthというと後置記法なので、1+2*3は123*+とかけるというものです。 ところで、もしもメッセージの連鎖を書き連ねたforthを作ったらどうなるかと 考えてたら1+(2*(3))いう表記になりました。まるでIo言語です。 この文字列をバイトコードとして実行する処…

バイナリツリーバリデータ改

全ての値をバイナリツリーにしてしまうと、switch文だけで文法をチェックできます。 エラーを発見したらthrowすることにすると、returnの値がtrueかfalseかとか 関係なくなるので、アクションとか追加できそうな雰囲気です。 ガードとか無いので、match構文…

TDCのライトニングトークで使ったソース+α

再帰下降型の構文解析をして計算します。 高速に書き加える為にevalを使ってみてます。 advanceが字句解析器で1トークン取り出してtokenに値を入れ前回のtokenを返します。 eatは予測されたトークンのチェックをします。kinabaさんのソースとかからいただき…

OMeta

なんか、k.inabaさんが正規表現うんたらってはなしで、OMetaってのが面白いとか言う話をしてるので 見てみました。 http://www.kmonos.net/wlog/86.html#_1720080619 これは、IanのやつとかGoldenboxとかとアラン・ケイが言ってたようなもののひとつらしいっ…

flash10 playerとfirefox4

flash10が出たというので入れてみました。ニコニコ動画はちょっと速くなった気がする。 どちらも、TamarinプロジェクトのVMが乗っていて速くなっています。 flash用のNES Emulatorも自分のマシンで高速に動くようになりました。 スターフォースは速くて追い…

根幹部分

うーむ。いまだ、Javascriptの真似が出来ません。 やりたいことは、Function,Object,prototype,__proto__あたりがあって、 ネイティブな関数とJavaScript上の関数が動き、また、コンストラクタとしてnew Functionが動き、 ユーザー定義のnew A()といったオブ…

バイナリツリーの再帰下降バリデータ

自分の作っている言語は単に構文木を扱うだけって落ち込んだりしてました。 更にいうと、バイナリツリーを扱うだけの言語です。LISPはConsセルを使ったリストを扱うだけの言語です。 名前付きセルを使ったバイナリツリーを扱うだけの言語を自分は作っている…

演算子順位付きの再帰下降パーサ

なんか、プレビューを押したら固まった。そして、書いていた日記が消えてしまった。(泣 ここのところ、演算子順位法を使ったパーサは難しい。 ウームと思ってて、再帰下降パーサで優先順位付きの演算子をうまく扱えないかなぁと 考えてみたり、調べてみたり…

はてなに貼る。

オレオレ言語ブーム

IT戦記を見て、sumi言語に適応してみた。 <script src="smi.js"> print("hello world<br>"); </script> とhtmlに書けば、動きます。 ついでに、sumiを短くして、smiにしてみた。 http://sakurai.s59.xrea.com/compact/compact/smi.html

match式

Ocamlあたりのmatch式のsumiバージョンです。 f:(a){ match(a){ case(qq{$a+$b}){qq{add}} case(new XOX(qq{$a},qq{$b},qq{$c})){qq{xox}} default{a} } } print(f(qq{1+2})+"\n") print(f(qq{1*2})+"\n") print(f(qq{abc})+"\n") で、 add xox abc abcとい…

演算子定義とsyntaxマクロ

xox(100,_) syntax(qq{$a _ $b}){$a+$b} 1 _ 2 http://sakurai.s59.xrea.com/compact/compact/sumi.html?in=xox%28100%2C_%29%0D%0Asyntax%28qq%7B%24a+_+%24b%7D%29%7B%24a%2B%24b%7D%0D%0A1+_+2%0D%0Aこれで、3が返ります。まだ、完全ではないかんじだけど…

なんか、恥ずかしいぜい。

通りすがりの人に、普通のASTと何が違う言われて、んんん? 普通のASTってどんなものなのかいまいちわかってないので何ともいえません。Template HaskellとかDylanを見直して理解しないと差がわからない。 抽象構文木じゃなくて、只の構文木であるところが違…

CompactというかC式と言ってるものの何が凄いのか

S式はATOMをCONSセルで結合しています。基本は。 C式はこれを拡張して、XOX,XO,OY,XOY,XPXP,PXPという6つ種類の演算子で結合しています。 sumi言語はC式で記述されています。 LISPは構造化データ=プログラムです。 JavaScriptは文字列データ=プログラムです…

式ベースのパーサと処理系

式ベースのパーサとインタプリタを作ってみました。 {a:(a,b){a+b};b:(a,b){a*b}(5,2);c:(a(10,20)+b)*5;d:{a:a;c:c}}.d このような、式をパースして、実行すると、 {a:Lambda([a,b],XOX(a,+,b)),c:200} のような、式が帰って来ます。 今までは、括弧は特別…

演算子定義できるパーサとインタプリタ

ほぼ、C言語の演算子が定義できてて+αの演算子がついてる言語です。 最初構文木を作って、それをインタプリタで動くいう。 なにが、新しいのかというと、プログラムは数値や識別子以外は演算子でつながってるってこと。 演算子でつながってるだけなので、構…

100オーダーな優先順位付き演算子定義構文解析器

優先順位をリストで管理してやることで、とびとびの値の優先順位を付けられる ようなパーサを作ってみました。サンプル http://sakurai.s59.xrea.com/diary/100order.html以下ソース

優先順位付き演算子定義の可能な小さな構文解析器

以下のような簡単な構文解析器を作ります。前も書いたような気がしますが、 たまに、やらないと忘れて難しいことになってしまうし。 あろはさんが面白そう言ってたのでまぁ、のせて見ます。 出来たもののアドレス、、、。 http://sakurai.s59.xrea.com/diary…

Mini_0

今回はSECD ManiaのMini_0 SECDマシンのjavascript版です。 このマシンは Henderson を継承しています。 オリジナルの Henderson コンパイラはただ1つだけ 算術構文を使っています - (ADD (QUOTE 1) x)。1. SECDからすべての算術コードを削除し、 INC コー…

HendersonのSECDマシンコンパイラのJavaScript版

compiler.lispは、lispがわかっていればいいのかもしれませんが、 括弧がやはり、読みにくいのでjavascriptに移植して可読性UP+高速化しました。 ファイル名はcompiler.jsです。 selfjs.htmlを開くと、compiler.lispをcompiler.jsを使ってコンパイルして…

HendersonのSECDマシン

SECD ManiaのHendersonのSECDマシンをjavascriptに移植したので、載せておきます。 self.htmlを開くとcompiler.secdコードを使ってcompiler.lispを セルフコンパイルします。結果が画面上に表示されます。 ファイル読み込みは、AJax使ってます。 VMなので、…

継続インタプリタ

やっぱり、継続をまちがえてたので修正した。 まだ間違えているかもしれない。

できるだけ短い継続インタプリタ

call-ccの実装がとりあえず出来たっぽいバージョン よくわかってないので、怪しい。

できるだけ短い継続インタプリタ

この間ものの継続渡しバージョン+α 今までのは、fiberみたいなものだったので、call-ccを作ろうと思ってるけど、出来てない。 call-ccの実装が出来てない(泣

継続付きインタプリタ(2)

今日は変数を定義して読み込んだり出来るように拡張します。 そのために、環境を導入します。 function eval(s){ if (s instanceof Array) { switch(s[0]){ case "add": return eval(s[1]) + eval(s[2]); case "mul": return eval(s[1]) * eval(s[2]); } } r…

12行で書ける継続付きインタプリタ

どうも、継続がよくわからないので、とても短いサンプルを作ってみました。 ["mul", 3, ["add", 1, 4]] のようなjsonデータを読み込み、実行すると15を返すような インタプリタを作ると以下のようになります。 function eval(s){ if (s instanceof Array) { …

多相型バリアント

SML#の多相型バリアントの表現のところを見てて、よくわからないので JavaScriptに移植して理解しようとしてみた。http://www.pllab.riec.tohoku.ac.jp/smlsharp/ja/?Resorces%2FProgrammingExamples%2FVariants このへんや、 http://www.pllab.riec.tohoku.…