lamb/parser2.hs

39 lines
689 B
Haskell
Raw Normal View History

2013-11-02 01:53:36 +00:00
{-# Language TemplateHaskell, QuasiQuotes, FlexibleContexts #-}
import Text.Peggy
import AST
[peggy|
2013-11-02 02:10:02 +00:00
top :: [AST] = statements !.
statements :: [AST]
= statement+
statement :: AST
= expr "."
2013-11-02 01:53:36 +00:00
expr :: AST
2013-11-02 02:10:02 +00:00
= expr "(" ")" { Call $1 UnitConst }
/ expr "+" fact { Add $1 $2 }
2013-11-02 01:53:36 +00:00
/ expr "-" fact { Sub $1 $2 }
/ fact
fact :: AST
= fact "*" term { Mul $1 $2 }
/ fact "/" term { Div $1 $2 }
/ term
term :: AST
= "(" expr ")"
2013-11-02 02:10:02 +00:00
/ number { IntConst $1 }
/ identifier { Var $1 }
identifier ::: String
= [a-zA-Z_] [a-zA-Z0-9_'?!]* { $1 : $2 }
2013-11-02 01:53:36 +00:00
2013-11-02 02:10:02 +00:00
number ::: Integer
= [1-9] [0-9]* { read ($1 : $2) }
2013-11-02 01:53:36 +00:00
|]
main :: IO ()
main = print . parseString top "<stdin>" =<< getContents