2009年05月19日

そろそろ梅雨入りするので急いでキュウリの苗植えたら安物のせいか根っこが弱っこくて少し心配な金曜日担当Yappoです。

Perlも飽きたし、ふと思う所があって、オレオレ言語を作ってみました。
http://github.com/yappo/AcotieScript/tree/master
たぶんMacでしか動かないんじゃないかなとは思ってますが、普通にmakeすればコンパイルされる筈。

サポートされているシンタックスはコメントとprintとperlにあるような文字列同士のxorです。

"hoge" ^ "ugee"
みたいのですが、これを実行すると死にます。元ネタの人が文字列xorを理解したら正しく動くなる予定です。

printは

print "hello\n"
を実行すると「おうっふー hello」とprefixにおうっふーを追加します。

AcotieScriptの最大の特徴は、コメント構文の豊富さで、次の物は全てコメントとして解釈されます。

//this is comment
#this is comment
/*this is comment*/
"""this is comment
'''this is comment
<!--this is comment-->
REM this is comment
また、実行文の後ろにも次の物はコメントになります。
    print "hello!\n" #    this is comment
    print "hello!\n" //   this is comment
    print "hello!\n" """  this is comment
    print "hello!\n" '''  this is comment
    print "hello!\n" :REM this is comment

その他構文は{}のブロックはサポートしているが意味ありません。
またrubyの用っぽく1行で1つの文になり、一つの行に複数の文を置きたければ;で区切れます。

print "hoge\n" # 1文
print "foo\n";print "bar\n" # 2文

サポートされているリテラルは文字列リテラルのみでシングルクオートとダブルクオートが使えます。
それぞれはだいたいその他の言語のような動きはします。

コマンドラインでもいけます

acotiescript -e 'print "hello\n"'

shebang使えます。

$ cat oufu.acotie 
#!./acotiescript

print "うっ!\n"
$ ./oufu.acotie 
おうっふー うっ!

今後

今のままだと100% CGIとして動作しないので、CGIとして動作するようにするかも。
構文解析した物をスタック詰んだりしないで、逐一実行するだだからifやらwhileやら作るの面倒いのでスタック型にするかなーとか
mod_acotie作ってみるのはどうか?

まとめ

perlとrubyはparserをyaccでやってトークナイザはlex使わないで自前でやってる。
PHPもyacc使ってるが何かスッゲーきたない。
Pythonは全部自前でやっててコンパクトでシンプルでソース量も少なかった。

とりあえずlex使うと楽ですね。yaccは規則がループしたりしないようにするように作らないといけないのだが、気を抜くと循環参照しだしてパースが終わんなくなる。
perl -e 'print "hello"' みたいな -e オプションを実装するのにfunopenを使って、文字列バッファをstdioインターフェィスに組み込めるような機能を関数を使ったがBSDでしか使えなっぽ。
perlとかだとトークナイザは自前なのでどうとでもなるが、lex使うとFILE *なものしかやってくれないので、char *をFILE *にしてくれる汎用的な方法ないかなーと探してる所。

あとコマンドラインオプション解析は getopt を使いました。 argv[1] がファイル名だったらそれスキップします。

そんな感じでfork歓迎push requestも歓迎です!

Posted by Yappo at 2009年05月19日 11:24 | TrackBack | tech
Comments
Post a comment









Remember personal info?






コメントを投稿する前に↓の場所にnospamと入力してください。