Pratt構文解析
Vaughan Prattによる論文"Top Down Operator Precedence"(1973)
とてもシンプルで理解しやすく、実装も容易で、使いやすく、理論上はともかく区実用上は非常に効率的であり、それでいて、利用者の殆どの合理的な構文に耐えられるほど柔軟である
構造体などは利用していない
用語の違い
nuds (null denotations): prefixParseFn
leds (left denotations): infixParseFns
演算子やオペランドを表現すること自体は難しいわけでなく、難しいのは優先順位のある記号の扱い方
論文
Top Down Operator Precedence
https://tdop.github.io/
訳: https://sfpgmr.github.io/tdop.github.io/
ダグラス・クロックフォードがJSに移植したもの
https://crockford.com/javascript/tdop/tdop.html
再帰的下降構文解析器 wikipedia
Top Down Operator Precedenveを用いたパーサ
日本語では「下向き演算子順位解析」
演算子順位解析
http://fujimura2.fiw-web.net/java/mutter/operator-precedence/index.html
https://qiita.com/quwahara/items/1f1de434b63bef5a5d84
あるトークンタイプに遭遇するたびに、対応する構文解析関数を呼ぶ
トークンタイプごとに最大2つの構文解析関数が関連付けられる
構文解析関数の種類
前置構文解析関数(prefix parsing function)
中置構文解析関数(infix parsing function)
中置演算子の左側の値のASTを引数に取る
そもそも構文解析では、符号(?)の優先度を比較する必要がある
PrattではPrefixとInfixの2つのパターンにわけて優先度を付けて構文解析する
code:nim
proc tokenToPrecedence(tok: Token): Precedence =
case tok.Type
of EQ, NOT_EQ: return Precedence.Equals
of LT, GT: return Precedence.Lg
of PLUS, MINUS: return Precedence.Sum
of SLASH, ASTERISC: return Precedence.Product
else: return Precedence.Lowest
他のParserとの比較
パックラット構文解析
構文解析器
使われているところ
JSLint
Douglas Crockford作
実装
https://github.com/matklad/minipratt
Rust
参考
Goでインタプリタ実装本を読んで2 parser - hatajoeのブログ
S.F. Blog:ゲーム用のオレオレ言語を作るためにPratt Parserを勉強している
『Go言語でつくるインタプリタ』
https://zenn.dev/pandaman64/books/pratt-parsing