parser2: add function definition, integer patterns, line comments
This commit is contained in:
parent
97cadac9aa
commit
24e52ec524
1 changed files with 16 additions and 3 deletions
19
parser2.hs
19
parser2.hs
|
@ -1,11 +1,15 @@
|
||||||
{-# Language TemplateHaskell, QuasiQuotes, FlexibleContexts #-}
|
{-# Language TemplateHaskell, QuasiQuotes, FlexibleContexts #-}
|
||||||
|
|
||||||
import Text.Peggy
|
import Text.Peggy hiding (space)
|
||||||
import AST
|
import AST
|
||||||
|
|
||||||
[peggy|
|
[peggy|
|
||||||
top :: [AST] = statements !.
|
top :: [AST] = statements !.
|
||||||
|
|
||||||
|
lineComment :: () = '--' (!'\n' .)* '\n' { () }
|
||||||
|
|
||||||
|
space :: () = [ \r\n\t] { () } / lineComment
|
||||||
|
|
||||||
statements :: [AST]
|
statements :: [AST]
|
||||||
= statement+
|
= statement+
|
||||||
|
|
||||||
|
@ -17,11 +21,20 @@ args :: AST
|
||||||
/ expr? { case $1 of
|
/ expr? { case $1 of
|
||||||
Just x -> x
|
Just x -> x
|
||||||
Nothing -> UnitConst }
|
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 :: AST
|
||||||
= expr "(" args ")" { Call $1 $2 }
|
= expr "(" args ")" { Call $1 $2 }
|
||||||
/ expr "+" fact { Add $1 $2 }
|
/ expr "+" fact { Add $1 $2 }
|
||||||
/ expr "-" fact { Sub $1 $2 }
|
/ expr "-" fact { Sub $1 $2 }
|
||||||
|
/ identifier "(" funpattern ")" "->" expr { Defun $1 (Lambda [($2, $3)]) }
|
||||||
/ fact
|
/ fact
|
||||||
|
|
||||||
fact :: AST
|
fact :: AST
|
||||||
|
@ -31,13 +44,13 @@ fact :: AST
|
||||||
|
|
||||||
term :: AST
|
term :: AST
|
||||||
= "(" expr ")"
|
= "(" expr ")"
|
||||||
/ number { IntConst $1 }
|
/ integer { IntConst $1 }
|
||||||
/ identifier { Var $1 }
|
/ identifier { Var $1 }
|
||||||
|
|
||||||
identifier ::: String
|
identifier ::: String
|
||||||
= [a-zA-Z_] [a-zA-Z0-9_'?!]* { $1 : $2 }
|
= [a-zA-Z_] [a-zA-Z0-9_'?!]* { $1 : $2 }
|
||||||
|
|
||||||
number ::: Integer
|
integer ::: Integer
|
||||||
= [1-9] [0-9]* { read ($1 : $2) }
|
= [1-9] [0-9]* { read ($1 : $2) }
|
||||||
|]
|
|]
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue