パーサコンビネータ
プログラミング言語に関数を組み合わせたりする能力(高階関数)があれば、演算子(コンビネータ)によりパーサを組み上げることができる パーサコンビネータは関数型プログラミング言語でよく親しまれている
パーサは入力を引数に取って解析結果を返す関数とみなせる
関数を値として扱ったり、関数を引数に取る高階関数を作ったり、関数の合成をしたりしやすい
パーサの入出力
入力: パースする文字列、現在の読み取り位置
出力: パースが成功したかどうか、パースされた結果、新しい読み取り位置
パーサジェネレータ(パーサコンビネータ)のライブラリの最近の実装では、字句解析器と構文解析器の機構も併せて持っていることが珍しくなく、トークン分割から構文木構築までカバーできるものがほとんどです。
構文解析器を生成するプログラムを「パーサジェネレータ(Parser Generator)」と言います。パーサジェネレータそのものは構文解析器ではありません。また、パーサジェネレータの中でも、演算子と関数を組み合わせて構文解析器を生成できるプログラムを「パーサコンビネータ(Parser Combinator)」と呼びます。
字句解析器と構文解析器を併せ持つタイプでは、一文字をトークンとみなすパーサといえる
字句解析は文字列をトークン列に加工するものですが、文字をそのままトークンとみなす何もしない字句解析を行っていると考えても良い
Monadic parser
文法を書くときに考えられるすべてのケースをカバーするという複雑なロジックを表現するためにモナドを使用できる モナドを使うと、「この条件が満たされた場合にのみ処理を進める」というようなことができる
サンプル
2019-04で止まっている
2008で止まっている
2017,2018に趣味で書かれたぽいもの
3.3.0から大きい動き
BNFレベルで文法の曖昧さがなければLRにできうるが、JSは厳密なパースができない メジャーなJSエンジンは手書き
有名な定番らしい
他言語でもこれを参考にしている様子
最も多機能で人気もある
Monadic Parser Combinator
Reports line numbers in errors機能を唯一備える
もしかすると使いたい機能がなくて困る
Monadic Parser Combinator
かなりミニマルでコアの実装も150行ぐらいなので読みやすそう
もしかすると使いたい機能がなくて困る
2016年でちょっと古い