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を使う
どう使うか?
演算子の優先順位などをテーブルで表現する
例
hs-- Expression Parserの作成
exprparser :: Parser Expr
exprparser = buildExpressionParser table term <?> "expression"
table =
[ [Prefix (m_reservedOp "~" >> return (Uno Not))]
, [Infix (m_reservedOp "&" >> return (Duo And)) AssocLeft]
, [Infix (m_reservedOp "=" >> return (Duo Iff)) AssocLeft]
]
term =
m_parens exprparser
<|> fmap Var m_identifier
<|> (m_reserved "true" >> return (Con True))
<|> (m_reserved "false" >> return (Con False))
<?>
ってなに
label
関数と同じらしい
参考