Parser

プロジェクトらしくしてみた

http://code.google.com/p/castling/最近まともになってきた気がするので、ドキュメントなんかを整備してそれっぽくしてみました。 英語で書き始めて途中から日本語になっているのは私の根気の顕れです。全部英語に直したらOCamlのニュースグループかメーリ…

ぶらさがりifでconflictしない文法

http://www.parsifalsoft.com/ifelse.html

demo作ってみた

Castlingで作ったTiny Pascalのパーサのデモです。ボタンを押せばパース結果の構文木と検知したエラーが出てきます。 http://panathenaia.halfmoon.jp/castling/demo/tinypascal.cgi ……こうして見ると自動エラーリカバリ頭悪いな。ぶらさがりifにおけるelse…

Castlingちまちま更新

位置情報はパーサでは持ち運ぶだけで中身関与しないので多相型にした。これでファンクタの引数がトークンのみになった。 現在位置を値として記録するpositionだけだとocamlcのようなエラーメッセージ中の範囲表示に対応できないので、position_withを追加。r…

Google Codeを借りてみた

http://code.google.com/p/castling/ 履歴を残したかったからなのですが、手元zipとどちらが便利なのかしらん。 ドキュメントに関してはWikiが使えるので毎回アップロードするより圧倒的に楽になるはず。元々たいして書いて無いですけども。特に何も指定して…

Castling修正

エラーリカバリで無限ループしてました。 こんな感じの文法があったとして。 start := x e x ::= w x x ::= x y x ::= z 最初にwを与えるとこうなります。(startはスタック) x ::= w * x | * w x x ::= * x y x ::= * z そこへ、eが来ると、エラーリカバリに…

懲りずにパーサジェネレーター

http://panathenaia.halfmoon.jp/alang/castling.html とりあえず当初の目的としては使える程度にはなったと思う……。 実はfirst-set作るところがバグってたりしたので、もっとテストケースが必要なのでしょうけれども。 コード自体もいくらOCamlと言ってもち…

パーサジェネレータのそのまた続き

前回、 START ::= A * B D | A * C Dの状態でDが来たらBとCのどちらを補うかなんてのは迷いますが、どの道エラーリカバリですので適当にどっちか選ばれるようにしとけば問題ないと思います。recovery/recovery conflictなんてのは聞いた事が無いですし。 と…

パーサジェネレータの続き

かろうじて動くようになりました。http://panathenaia.halfmoon.jp/alang/castling.7zAST自動生成型のパーサジェネレータです。 奇跡的にLALR(1)のパーサを吐きます。 LR(0)項の集合そして状態遷移テーブルを作る超肝心の部分はcaperの丸写しです。従ってラ…

caperが吐いたコードを読む

LALR(1)はどうやって動作しているのでしょうか? 理解を完全にするために、caperの吐いたコードを追いかけてみたいと思います。 caperは、jonigataさんの作られたパーサジェネレーターです。パーサジェネレータの中では群を抜いてきれいなコードを吐いてくれ…

頭の悪いパーサジェネレータ

あんだけ進めといてアレなのですが、方針転換します。パーサジェネレータ作ります。 OCamlのコンパイラが吐くエラーメッセージは正気とは思えないため、最終的に使う言語自身で書いたほうがパーサジェネレータ用の間に合わせの構文よりも嬉しいというパーサ…

頭の悪いぱーさめも

LLとか言われても「再帰下降」、LALRとか言われても「表引くやつ」と言い直さないとぴんと来ないのでまとめる。あるごりずむ LL……トップダウン LL(1)……JavaCC他、手書きできる LL(k)……ANTLR他、手書きできる 再帰下降+バックトラック……Parsec*1他(たぶんREBO…

すごいパーサジェネレータ

http://aurochs.fr/cgi/demo.cgi新鋭のパーサジェネレータってどれもこれもすごく良いと思うのですけれど、どれもこれもエラーリカバリが貧弱なのはなんででしょうか。 構文木を勝手に作ってくれて、何もしなくても充分なエラーリカバリしてくれて一気にエラ…

みたび頭の悪いパーサコンビネータ

こないだsheracyさんにパーサの演算子は右結合であるべきか左結合であるべきかと訊ねる機会を持てました。結論としては、>>がHaskellで左結合なのはdo構文のためとかそんなでparsecのが右結合なのも含め深い意味は無いらしくて、結局は使いやすい方を選ぶし…

PascalはLL(1)じゃないよね

http://d.hatena.ne.jp/kmaebashi/20071203#p1 手続き名をlexerが認識するとかどこのBASICでしょうか。Pascalはそんな事してないと思……いやまてよ。 WriteLn(x: 10); ↑こんな、Write/WriteLn中でしか使えない特殊構文がある以上、手続き名をlexerが認識して…

続・頭の悪いパーサコンビネータ

あれからだいぶ直してしまったので1から説明します。YT版Parser Combinator for OCaml……どう見てもHaskellやCleanのそれの劣化版ですが。 ええと、まず、今更言うまでもないですがパーサコンビネータというのはパースする関数とパースする関数をくっつける関…

頭の悪いパーサコンビネータ

普通に再帰下降で書いていたはずが、定型句が面倒になって、関数を作る関数に変えていったらこんなふうになってしまいました。 (* 2.3: identifier ::= identifier_start {identifier_start | identifier_extend} *) let rec identifier () = p_do ( identif…

caper for D

手書きと強弁できることが目標らしいパーサジェネレータcaperに、D言語吐かせてみました。 http://panathenaia.halfmoon.jp/alang/caper.7z caperは所謂スキャナレスの状態遷移型パーサーです。スキャナは自分で書く必要があります。パースを途中で打ち切る…

boost::variant(2)、と、なんとかcaperビルド通りました

やった。動いた。 --- variant.000.hpp Sun Sep 19 20:49:50 2004 +++ variant.hpp Thu Oct 19 03:19:36 2006 @@ -633,16 +633,58 @@ private: // helpers, for visitor interfa delete backup_lhs_ptr; // nothrow } +#ifdef __BORLANDC__ + template <typename LhsT> + vo</typename>…

boost::variant(1)

トラックバックをいただいたcaperをC++Builderで通すべくなんかやってるわけなんですが、boost::variantがふつーにコンパイル通らねえ。 http://bcbboost.sourceforge.net/test/1_33_1-5_8_2-0.5/cs-win32.html 対応状況としてはPassとFailが入り交じってる…

parse

Rebolのparseは、split兼正規表現といいますか。正規表現というものは必ずしもPerlやgrepなんかのあの構文で書く必要は無くて、NFAまでいかなくても、あらかじめその言語のデータ構造にばらしておけば正規表現インタプリタが正規表現自体の字句解析を行うと…

パーサジェネレータ動くところまで

D言語だとみなさん喰い付きがいいですな…。 動くところまで持って行きましたので載せておきます。 k.inabaさんの指摘を受けてmixinを使うようにしました。正直mixinの存在なんて頭から消えてましたははは。 test.d + import testdriver; expression => | sum…

ずぼら向けパーサジェネレーター

http://d.hatena.ne.jp/ytqwerty/20050424#p1の続き。反応をいただいたので、もう少し詳しく書くことにしましょう。 たとえば四則演算。 expression => | sum + int evaluate(); sum => | product | add' x:sum "+" y:product -- left rec | sub' x:sum "-" …

パーサジェネレーターのアイデア

http://d.hatena.ne.jp/ytqwerty/20050420#p2で何を作ろうとしていたか書いときます。 Adaでinterfaceがまだ使えませんのでinterfaceが使えてジェネレートが楽そうということでD。 program => | mainmethod "." mainmethod => | method' n:#label "method" "…

部分集合構成法

昨日、コンパイラⅠを立ち読みしてきました。(た、高いですからね、つ、Ⅱは持ってるんですよっ) 忘れないうちにメモを残しておきます。 集合構成法では、位置の集合を状態とし、状態と次の文字から次の状態を引けるような表を作るようです。例えば、次のよう…