buildExpressionParser
buildExpressionParser :: Stream s m t => OperatorTable s u m a -> ParsecT s u m a -> ParsecT s u m a
準備しておくもの
2つの引数を取る
演算の規則のテーブル
type OperatorTable s u m a = [[Operator s u m a]]
演算子の優先順位はリストの前後関係で定義
優先順位が高いものを上の方に書く
Infix
中置演算子
Prefix
前置演算子
++1とか、-3とか
Postfix
後置演算子
2--とか
factorを決めたパーサー
?
思考の手順
左結合のもの
これらを一つずつParsecのコンビネータを使って作っていくこともできるが面倒
なのでbuildExpressionParserを使う
どう使うか?
演算子の優先順位などをテーブルで表現する
例
code:hs
-- Expression Parserの作成
exprparser :: Parser Expr
exprparser = buildExpressionParser table term <?> "expression"
table =
]
term =
m_parens exprparser
<|> fmap Var m_identifier
<|> (m_reserved "true" >> return (Con True))
<|> (m_reserved "false" >> return (Con False))
<?>ってなに
label関数と同じらしい
参考