解析結果を XML で出力する JavaScript 字句解析器書きました

誕生秘話

mallowlabs 8:12 AM Dec 24th, 2008 README を書いている場合じゃない!要旨を書かねば.
mallowlabs 3:10 AM Dec 24th, 2008 勢いあまって gem まで作った。そろそろ資料作りを開始するか…
mallowlabs 1:51 AM Dec 24th, 2008 資料を作ろうと PC に向かったらいつのまにか JS の字句解析器ができていた…!何が起こったか(ry 資料は信頼の0バイト。
mallowlabs 10:02 PM Dec 23rd, 2008 お腹いっぱいになったら寝てた。資料はまだ手つかず。モチベーションが下がってきた!
mallowlabs 6:51 PM Dec 23rd, 2008 クロノトリガーがおもしろすぎて明日の資料作成にまだ手をつけてない。もう何周もしたのに…

ということで資料作成に対する 嫌だ力 全開で生まれましたとさ。
資料ができたらとたんに飽きてしまって半年放置したので
せっかくなのでブログで公開します。

これは何?

TobirexJavaScript の字句解析器です。
以下の特徴を持ちます。

  • 解析結果を XML で出力します
  • 解析結果にホワイトスペースを保持します
  • もとのソースコード上の情報を解析結果の XML に 100% 残します
  • そのため XML からもとのソースコードに簡単に戻すことができます
サンプル

JavaScript

var i = 0;

XML

<?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>

XML のタグ部分を除去すればもとのソースコードに戻ります。

インストール

$ gem sources -a http://gems.github.com
$ gem install aaronp-frex
$ gem install mallowlabs-tobirex

使い方

$ tobirex target.js

XML が出力されます。
ファイルに保存したいときはリダイレクトを使ってください。

何に使う?

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

解析結果 XMLソースコードのすべての情報が載っているので簡単ですね。