ANTLR
何だか随分前から、ANTLRWorksを使っていると、 デバッグモードでステップ実行出来ない事があったのだけど、 何が起きているのか分らなかったのだよね。 文法定義がおかしいのか、ANTLR3.1.1がバグっているのか、 良く分からないので、記録的な意味合いで晒…
効率の良し悪しで言えば、明らかに悪いのだけど、 前提知識が大きく欠如している以上、動いているコードから、何をか判断せざるを得ないと言うワケ。 自動生成されたパーザや、レキサーが投げる例外は、全て、 org.antlr.runtime.RecognitionException のサ…
最新版だと、頑張るの結構キツイかもよ。 既に、公式サイトにサンプルがあるレベルだとRuntimeに実装済み。 ANTLR3.1.1における実装。 BaseRecognizer protected Object recoverFromMismatchedToken(IntStream input, int ttype, BitSet follow) throws Reco…
大切な何かが弾けた途端に、カオスを受け入れる事が出来た。 つまり、こういう事。
実行VMのロケールを見て、日本語と英語でエラーメッセージを出す。 クォート途中で死んだら、その旨通知しる。 コメントの中で死んだら、その旨通知しる。 どんなルールの処理中に死んだのか、通知しる。 エラーリカバリとか、考えると超重い感じなので、 何…
こんな感じに、#をブロックコメントの開始の後に付けとくとバインド変数コメントになる。 /*# hogehoge.fugagua*/dummygrammar TwoWaySQL; options { language = Java; output = AST; ASTLabelType = CommonTree; } tokens { BEGINNODE; IFNODE; EXPRESSIONN…
2WaySQLの中でもかなり怪しい仕様、と言ってもこれが非常に便利なのだけど、 IN句の後ろにあるコメント及び、その後のテキストノードが括弧で括られている時、 括弧で括られている範囲を、実行時にゴッソリ落して、再構築してくれるんですなぁ。 例えば、こ…
ツリーは、ちゃんと出来ている。ASTに変換しようとしてコケている。 パーサが構築しうるツリーと、変換されうるASTにズレ的な何かがある…と言っている気がするが、 どう対応したら良いのかサパーリ分からない。誰かボスケテ。 grammar TwoWaySQL; options { …
さっきのを、ちょこちょこと弄って整理してみた。
■[ANTLR] 空白文字のスキップCommentsAdd Starwarufuzaketaichi引き続き、ASTは、タダじゃ作ってくれない。 - 設計と実装の狭間で。を添削。予想以上に大変。 らしいのだけど、せっせとコピペしたので、それなりに楽勝。 しかし、それでは芸がないので、クォ…
/と*と-が、lexer辺りでうまく処理されてなかったので、 そいつだけ独立したトークンにしつつ、Parserでまとめる感じに。 空白文字列がgrammarに山ほど出てきてしまうのは、もうちょっと先で対応するつもり。 grammar TwoWaySQL; options { language = Java;…
grammar TwoWaySQL; options { language = Java; output = AST; ASTLabelType = CommonTree; } tokens { BEGINNODE; IFNODE; EXPRESSIONNODE; ELSENODE; } @header { package twowaysql.grammar; } @lexer::header { package twowaysql.grammar; } twowaySQL…
僭越ながら ASTは、タダじゃ作ってくれない。 - 設計と実装の狭間で。 を添削。 添削してもらったので、少し直してみた。 そろそろ2byte文字も使ってみたいな…とか思って直している最中に、致命的な事が判明。 とりあえず、出来たトコまで晒しておくます。
ANTLRWorksで、ParseTreeなんてのが、出てるから、これでいいんじゃね? とか思っていたのだけど、世の中そんなに甘く無い事を理解。
まぁ、eclipseのプラグインはすでにあるのだけどさ。 Eclipse Eclipse 3.3+ for Antlr 3.xAntlrDT is a standard Eclipse plugin implementing an Antlr 3.x specific editor, outline, and builder. See http://www.certiv.net/projects/plugins/antlrdt.ht…
まぁ、何かテキトーに動きそうなツリーが出来たトコロで、 エラー処理辺りを作りこもうかな…と言う気分なのだけど、 そもそも良く分かってない部分があるので、細かい単位で動かせないと駄目だよね…と言う訳。 で、ANTLRには、gUnitと言うテスティングツール…
コメントとテキストを分割出来る様になったので、 次は、条件分岐をパース出来る様にしてみる。
スーパークラスを変えるとデバッグできなくなるので注意 (デバッグ用のスーパークラスを使ってブレークとかトレースしてる模様)
ANTLRWorksの使い方がようやく分ったので、結局、ANTLRを使う事に。 コンパイラの知識らしい知識を全く持たずに、どこまでいけるか頑張ってみる。