解析結果を XML で出力する JavaScript 字句解析器書きました
誕生秘話
8:12 AM Dec 24th, 2008 | README を書いている場合じゃない!要旨を書かねば. | ||
3:10 AM Dec 24th, 2008 | 勢いあまって gem まで作った。そろそろ資料作りを開始するか… | ||
1:51 AM Dec 24th, 2008 | 資料を作ろうと PC に向かったらいつのまにか JS の字句解析器ができていた…!何が起こったか(ry 資料は信頼の0バイト。 | ||
10:02 PM Dec 23rd, 2008 | お腹いっぱいになったら寝てた。資料はまだ手つかず。モチベーションが下がってきた! | ||
6:51 PM Dec 23rd, 2008 | クロノトリガーがおもしろすぎて明日の資料作成にまだ手をつけてない。もう何周もしたのに… |
ということで資料作成に対する 嫌だ力 全開で生まれましたとさ。
資料ができたらとたんに飽きてしまって半年放置したので
せっかくなのでブログで公開します。
これは何?
Tobirex は JavaScript の字句解析器です。
以下の特徴を持ちます。
- 解析結果を XML で出力します
- 解析結果にホワイトスペースを保持します
- もとのソースコード上の情報を解析結果の XML に 100% 残します
- そのため XML からもとのソースコードに簡単に戻すことができます
サンプル
var i = 0;
<?xml version="1.0"?><tokens><kw>var</kw><sp> </sp><ident>i</ident><sp> </sp><op>=</op><sp> </sp><literal>0</literal><op>;</op><nl> </nl></tokens>
インストール
$ gem sources -a http://gems.github.com $ gem install aaronp-frex $ gem install mallowlabs-tobirex
何に使う?
CASE ツールにを作るのに使います。
簡単なサンプルとして sample/colorize.rb に
ソースコードの色づけプログラムを同梱してます。
#!/usr/bin/env ruby -Ku require 'rubygems' require 'cgi' require 'tobirex' require 'rexml/document' # # colorize.rb # output colorized HTML # Usage: # $ruby colorize.rb test.js > test.js.html # module Tobirex class Colorize TEMPLATE = <<HTML <html> <head> <style type="text/css"> .kw { color : blue; } .comment { color : green; } .literal { color : red; } </style> </head> <body> %s </body> </html> HTML def run(argf = ARGF) xml = Tobirex::Parser.new(:javascript).parse(argf.read).xml doc = REXML::Document.new(xml) html = "<pre class=\"code\">" doc.root.each do |token| html.concat("<span class=\"#{token.name}\">#{CGI.escapeHTML(token.text)}</span>") end html.concat("</pre>") puts Colorize::TEMPLATE.sub("%s", html) end end end if $0 == __FILE__ Tobirex::Colorize.new.run end
参考文献
CiNii 論文 - XMLを用いた汎用的な細粒度ソフトウェアリポジトリの実装 のアイデアを丸ごとパクってます。