パーサジェネレータのPEG.jsを使うと手軽に構文解析器が作れます。
ここに使い方をメモしておきます。
始め方
PEG.jsはWeb上で試すことができ、そこで文法チェックができるのがJSならではの素晴らしさです。それでも、Node.jsを使って、ローカルで使えれば便利なので、その方法で紹介できます。
install.sh
# グローバルインストールの場合
npm install -g pegjs
一番簡単なサンプル
足し算・掛け算を行う文法を定義するには、以下のように書きます。
sisoku.pegjs
start = add
add = left:mul "+" right:add { return left + right; }
/ mul
mul = left:val "*" right:mul { return left * right; }
/ val
val = _ nums:[0-9]+ _ { return parseInt(nums.join('')); }
_ "whitespace" = [\s ]*
この文法規則ファイルをJavaScriptの構文解析(パーサー)にコンパイルするために以下のコマンドを実行します。すると「sisoku.js」というCommonJSのファイルが生成されます。
compile.sh
pegjs sisoku.pegjs
そして、これを利用するメインファイルを書きます。
main.js
// ライブラリ取り込み
const parser = require('./sisoku.js')
// 適当な計算を実行
const ans = parser.parse('1 + 2 * 3')
console.log('答え:', ans)
実行してみましょう!すると、「答え: 7」と表示されます。
run.sh
$ node main.js
答え: 7
使い方は簡単ですね。
四則演算する文法
次に、四則演算およびカッコの計算をする文法は以下の通り。超簡単に実装できる。
sisoku.pegjs
start = add
add = left:mul "+" right:add { return left + right; }
/ left:mul "-" right:add { return left - right; }
/ mul
mul = left:val "*" right:mul { return left * right; }
/ left:val "/" right:mul { return left / right; }
/ left:val "%" right:mul { return left % right; }
/ val
val = _ "(" _ expr:add _ ")" _ { return expr }
/ _ nums:[0-9]+ _ { return parseInt(nums.join('')); }
_ "whitespace" = [\s\n ]*