6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PEG.jsを使う

Last updated at Posted at 2022-06-28

パーサジェネレータの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 ]*

参考

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?