diff --git a/parser2.hs b/parser2.hs index 356bd46..984d5f2 100644 --- a/parser2.hs +++ b/parser2.hs @@ -1,11 +1,15 @@ {-# Language TemplateHaskell, QuasiQuotes, FlexibleContexts #-} -import Text.Peggy +import Text.Peggy hiding (space) import AST [peggy| top :: [AST] = statements !. +lineComment :: () = '--' (!'\n' .)* '\n' { () } + +space :: () = [ \r\n\t] { () } / lineComment + statements :: [AST] = statement+ @@ -17,11 +21,20 @@ args :: AST / expr? { case $1 of Just x -> x Nothing -> UnitConst } +pattern :: Pattern + = integer { IntP $1 } + +funpattern :: Pattern + = pattern ("," pattern)+ { TupleP ($1 : $2) } + / pattern? { case $1 of + Just x -> x + Nothing -> UnitP } expr :: AST = expr "(" args ")" { Call $1 $2 } / expr "+" fact { Add $1 $2 } / expr "-" fact { Sub $1 $2 } + / identifier "(" funpattern ")" "->" expr { Defun $1 (Lambda [($2, $3)]) } / fact fact :: AST @@ -31,13 +44,13 @@ fact :: AST term :: AST = "(" expr ")" - / number { IntConst $1 } + / integer { IntConst $1 } / identifier { Var $1 } identifier ::: String = [a-zA-Z_] [a-zA-Z0-9_'?!]* { $1 : $2 } -number ::: Integer +integer ::: Integer = [1-9] [0-9]* { read ($1 : $2) } |]