JS/CC: 構文解析器生成系


JS/CC は JavaScript 用のコンパイラ生成器で、字句解析器生成系と構文解析器生成系が一緒になっているようです。JavaScript の実装としては、ウェブブラウザに組込まれたもののほか、Microsoft JScript, Mozilla Rhino, Mozilla SpiderMonkey, Google V8 など主要なものに対応しているようです。

若干、苦労しましたけれども、ひとまず Rhino 版はすんなりと動いたことを報告します。

+ [[JS/CC:http://jscc.jmksf.com/%5D%5Dを入手し展開。
+ mkdir $HOME/lib/javascript/jscc
別にどこでもいいですけれども、JavaScript のライブラリを保存しているディレクトリにサブディレクトリを作って下さい。
+ cd src; make -f Makefile
+ cp jscc.js driver*.js $HOME/lib/javascript/jscc

$HOME/bin に jscc という以下のスクリプトを作成。

#!/bin/sh

LIBDIR=$HOME/lib/javascript/jscc

rhino $LIBDIR/jscc-rhino.js -t $LIBDIR/driver_rhino.js_ $*;

あとは構文定義ファイル(calc.par)を以下のように処理して、構文解析器を作成できます。

jscc -o calc.js calc.par

ここで calc.js がお目当ての処理系が通常の ECMAScript として出力されます。ですので、さまざまな処理系を用いて実行することができます。以下が私が試したものです。

Rhino の場合:
$ rhino calc.js 1+2+3
6

Tracemonkey の場合:
$ tracemonkey calc.js 1+2+3
6

Squirrelfish の場合:
$ squirrelfish calc.js — 1+2+3
6

V8 の場合はうまくいきませんでしたが、それは出力された構文解析器のせいではなく、その main ルーチンでコマンド行引数を参照しているのですが、V8 はコマンド行引数へのアクセスをサポートしていないためです。main ルーチンを書き直せば動くと思います。

—–
今回は Rhino を用いて構文解析器生成系を作りましたが、さきほど述べたようい JS/CC は SpiderMonkey や V8 もサポートしているようです。わたしが試した範囲では、どちらもうまくいきませんでした。Makefile をいじって、SpiderMonkey の場合には構文解析器生成系のビルドまではできるのですが、生成系を実行するとエラーになりました。V8 はどうしたわけか V8 のインタプリタのビルドに失敗します。これはなんとか直せそうなんですが、すでに Rhino で動いているので我慢することにします。本当は Tracemonkey で動くといいんだけどなぁ。。。