diff --git a/parser2.hs b/parser2.hs new file mode 100644 index 0000000..9f517cf --- /dev/null +++ b/parser2.hs @@ -0,0 +1,28 @@ +{-# Language TemplateHaskell, QuasiQuotes, FlexibleContexts #-} + +import Text.Peggy +import AST + +[peggy| +top :: AST = expr !. + +expr :: AST + = expr "+" fact { Add $1 $2 } + / expr "-" fact { Sub $1 $2 } + / fact + +fact :: AST + = fact "*" term { Mul $1 $2 } + / fact "/" term { Div $1 $2 } + / term + +term :: AST + = "(" expr ")" + / number + +number ::: AST + = [1-9] [0-9]* { IntConst $ read ($1 : $2) } +|] + +main :: IO () +main = print . parseString top "" =<< getContents \ No newline at end of file