works?
This commit is contained in:
parent
c986d42bf2
commit
9f8624d2c7
16
src/Parse.hs
16
src/Parse.hs
|
@ -42,7 +42,6 @@ ns = between skipSpace skipSpace
|
||||||
opTable :: [[Operator Parser Syn]]
|
opTable :: [[Operator Parser Syn]]
|
||||||
opTable =
|
opTable =
|
||||||
[ [ prefix "!" Not
|
[ [ prefix "!" Not
|
||||||
, prefix "fix" Fix
|
|
||||||
]
|
]
|
||||||
, [ binary "*" Mul
|
, [ binary "*" Mul
|
||||||
, binary "/" Div
|
, binary "/" Div
|
||||||
|
@ -69,8 +68,8 @@ parseSyn ctx = ns (makeExprParser (parseInnerSyn ctx) opTable)
|
||||||
|
|
||||||
parseInnerSyn :: Ctx -> Parser Syn
|
parseInnerSyn :: Ctx -> Parser Syn
|
||||||
parseInnerSyn ctx = do
|
parseInnerSyn ctx = do
|
||||||
l <- many (try (ns goL))
|
l <- many (ns goL)
|
||||||
r <- many (try (ns goR))
|
r <- many (ns goR)
|
||||||
let lr = l ++ r
|
let lr = l ++ r
|
||||||
guard (not (null lr))
|
guard (not (null lr))
|
||||||
pure (foldl1 App lr)
|
pure (foldl1 App lr)
|
||||||
|
@ -85,13 +84,14 @@ parseInnerSyn ctx = do
|
||||||
goR = choice [ parseIf ctx
|
goR = choice [ parseIf ctx
|
||||||
, parseLam ctx
|
, parseLam ctx
|
||||||
, parseLet ctx
|
, parseLet ctx
|
||||||
|
, parseFix ctx
|
||||||
]
|
]
|
||||||
|
|
||||||
parseId :: Parser String
|
parseId :: Parser String
|
||||||
parseId = unpack <$> P.takeWhile1P Nothing isLetter
|
parseId = unpack <$> P.takeWhile1P Nothing isLetter
|
||||||
|
|
||||||
parseIL :: Parser Syn
|
parseIL :: Parser Syn
|
||||||
parseIL = IL <$> L.signed skipSpace (L.lexeme skipSpace L.decimal)
|
parseIL = IL <$> L.lexeme skipSpace L.decimal
|
||||||
|
|
||||||
parseUL :: Parser Syn
|
parseUL :: Parser Syn
|
||||||
parseUL = chunk "unit" >> pure UL
|
parseUL = chunk "unit" >> pure UL
|
||||||
|
@ -146,6 +146,14 @@ parseLam ctx = do
|
||||||
skipSpace
|
skipSpace
|
||||||
Lam <$> parseSyn (name : ctx)
|
Lam <$> parseSyn (name : ctx)
|
||||||
|
|
||||||
|
parseFix :: Ctx -> Parser Syn
|
||||||
|
parseFix ctx = do
|
||||||
|
chunk "fix"
|
||||||
|
skipSpace
|
||||||
|
res <- parseSyn ctx
|
||||||
|
skipSpace
|
||||||
|
pure (Fix res)
|
||||||
|
|
||||||
parseIf :: Ctx -> Parser Syn
|
parseIf :: Ctx -> Parser Syn
|
||||||
parseIf ctx = do
|
parseIf ctx = do
|
||||||
chunk "if"
|
chunk "if"
|
||||||
|
|
Loading…
Reference in New Issue
Block a user