AirH" Annotation cvs cygwin DSL Eclipse Flash flex git Gizmo java javascript Linux metadata NOKIA OpenLaszlo packrat ruby RubyKaigi RubyOnRails Seesaa sourceforge SVN tdp4j tdp4js tdp4r thunderbird vodafone W-ZERO3 Windows X02HT x11 xml タグ ポーランド記法 携帯 構文解析
タグ / ruby
記事
RubyにおけるDSLとAnnotation(アノテーション) [2006/12/12 02:14]
今年始めから半ばに書いたものだが、「アノテーション(メタデータ)」「メタDSLとメタデータ」ということを考えた時期があった。このあたりのプロトタイプと現在の考え、さらに、Martin FowlerのRubyAnnotations(あまり多くは書いてないけど)などを参考に考えと実装(時間があれば)を洗練させてみようかと思った。もう一つ考えたいのは、ruby-dl, rjb, ruby-python などの共通フレームワークの話。両方とも本当に実装できるのか怪しい。そもそも、そんなことを考えている時間があるのかも怪しい。
tdp4rでXMLのtop-down parsing/transduction [2006/07/23 09:11]
TDP4RでXMLをパース/変形するためのパーサのセットを用意してみた。これで、top-downにパースしたり変形するものについては対応できる。例えば、a,bのタグが連続で現れるものをabというタグに変形し、他のものは大文字に変形するものは次のような変形ルールを記述すればよい。(サンプルsample_xml.rbから引用) g.xml = element("a"){ element("b"){ g.xmlseq } >> dom_constructor{|node| node.children() } } >> dom_constructor{|node| node.name = "AB"; node } | element(String){ g.xmlseq } >> dom_constructor{|node| ...
ポーランド記法<->逆ポーランド記法 [2006/07/22 15:22]
http://jp.rubyist.net/magazine/?0015-EditorsNoteinjectを使った実装と、tdp4rを使ったものを並べてみた。この程度なら構文解析使うと面倒になる。injectを使うとこうなる。def postfix2prefix(expr) expr.split(/\s+/).inject([]){|acc,x| p acc case x when "+", "-", "*", "/" acc.push([acc.pop(),acc.pop(),x].reverse()) else acc.push(x) end }.flatten().join(" ")enddef prefix2postfix(expr) ...
TDP4R 1.4.0: 自動最適化 [2006/07/22 03:25]
TDP4Rについて A B | A C とあるものを可能であれば A (B | C) と自動的に変形するようにしてみた。テストはまだ不十分かもしれない。
TDP4R: Packrat Parsing [2006/07/20 10:17]
TDP4Rの高速化に関連して、Packrat Parsingの論文を少し眺めてみた。やりたいことは、バックトラッキングの抑止で、その手段として、lazy evaluationとmemoizationという新しい道具を使ったという感じだ。関数で再帰下降式に実装する場合を考えると、各パース関数は(statelessであれば)文字を一つ入力すれば、後続するパース関数が一意に定まる。よって、その後続するパース関数をメモできるというもの。のように見えた。結局、A->B C D1 | B C D2 があれば、A -> B C (D1 | D2) にする。そして、D1 | D2 の部分は文字一つでどちらかに決まれば良いわけで、これをどうスマートに実現するかだろう。さて、packratじゃなくてもいいけど、うまいことtdp4rを速くするにはどうするのがよいだろう?余談1:packratというrubyforgeのプロジェクトがあった。
TDP4RでXMLの変換(2) [2006/07/19 07:24]
少しサンプル(sample_xml.rb)を改良して、パースしながらDOMを構成するようにしてみた。文法部分は以下の通り。XMLParserというモジュールにXML用のパーサとしてelementやconstructというものを定義している。まだ未完成で悩ましいところは多々あるが、完成すれば、XSLTやテンプレートなどとは違ったXMLの変換ができる。translator = TDParser.define{|g| extend XMLParser g.xml = element("a"){ element("b"){ g.xml*0 >> Proc.new{|x| x[0].collect{|y| y[0]} } } >> construct{|node| node.name = "bar"; node } } >> construct{|node| node.name ...