packages feed

papillon-0.0.58: examples/arith.hs

{-# LANGUAGE QuasiQuotes, TypeFamilies #-}

import Text.Papillon
import Data.Char
import System.Environment

main :: IO ()
main = do
	arg : _ <- getArgs
	case expr $ parse arg of
		Right (r, _) -> print r
		Left _ -> putStrLn "parse error"

[papillon|

op1 :: Int -> Int -> Int
	= '*'			{ (*) }
	/ '/'			{ div }
	/ '%'			{ mod }
;
op2 :: Int -> Int -> Int
	= '+'			{ (+) }
	/ '-'			{ (-) }
;
factor :: Int
	= ds:<isDigit>+		{ read ds }
	/ '(' e:expr ')'	{ e }
;
term :: Int
	= v0:factor vs:(op:op1 v:factor { (`op` v) })*
				{ foldl (flip ($)) v0 vs }
;
expr :: Int
	= p0:term ps:(op:op2 p:term { (`op` p) })*
				{ foldl (flip ($)) p0 ps }
;
|]