PEG.jsの記法の理解
PEG.jsを使っていてざっくり理解したことをまとめる
基本的な文法
code:parser.pegjs
ラベル = 変数名1:ラベル1 変数名2:ラベル2 ... {
/* JavaScriptコード(実際には変数名1, 変数名2, ...が引数で渡される関数のボディ) */
}
変数名はなくても良い
startというラベルに値を渡すとパーサーになる
例(公式サンプルの一部を改変したもの)
code:example.pegjs
Expression = (省略)
Factor = "(" _ expr:Expression _ ")" { return expr; }
/ Integer
Integer = _ num:0-9+ { return parseInt(num, 10); } 下から、_で空白文字を定義
[]は正規表現と同じでいずれか1つにマッチ
*も同様に0回以上の繰り返し
Integerで「空白文字(0文字以上)数字(1文字以上)」を定義
{}で数値型に変換して返す
以上とExpression の定義から、Factorは( 1 + 1 )などにマッチし、JavaScriptによる計算結果を返す
/より後ろは、その前にマッチしなかった場合にマッチするか確認される
つまりFactorは( 1 + 1 )もしくは1にマッチし、名前の通り項にマッチするものであると分かる
上の例は以下で試せる
PEG.jsをTypeScriptで使う場合、ts-pegというプラグインで.tsファイルとして出力できる
これを使う際.pegjsに書くコードはTypeScriptである必要がある
出力結果の.tsファイルにそのままコピペされるため
ただしPEGの性質のためかほとんどがany型になる
module.exportsに入るのはparse関数とSyntaxErrorだけなので、自分で型定義ファイルを書いた方が良いかもしれない(書いた)