wvogel日記

自分用の技術備忘録が多めです.

Peggy練習

数ヶ月前に遊んで以来全く触っていなかったのですっかり忘れてしまった....
思い出そうと思って、Peggyチュートリアルにある数式パーサに、べき乗演算を追加したものを書いてみる

{-# Language TemplateHaskell,QuasiQuotes, FlexibleContexts #-}

import Text.Peggy

[peggy|
top :: Double = expr !.

expr ::Double
 =expr "+" fact { $1 + $2 }
 /expr "-" fact { $1 - $2 }
 /fact

fact ::Double
 =fact "*" beki { $1 * $2 }
 /fact "/" beki { $1 / $2 }
 /beki

beki ::Double
 = beki "^" term { $1 ^^ (floor $2) }
 / term

term ::Double
 = "(" expr ")"
 /number

number :::Double
 = [1-9] [0-9]* {read ($1:$2)}
|]

main = print.parseString top "stdin" =<< getLine

動いた!!
と思ったのもつかの間、()のあとにべき乗演算子をつけるとパースエラーが起きる
unexpected inputと...

なぜだ....
まだ理解が足りないようです