@@ -7,23 +7,20 @@ import Text.Megaparsec((<|>))
7
7
import qualified Text.Megaparsec as Parsec
8
8
import qualified Text.Megaparsec.Char as Char
9
9
import qualified Text.Megaparsec.Char.Lexer as Lexer
10
+ import Text.Megaparsec.Debug
10
11
import Data.Text (Text )
11
12
import qualified Data.Text as T
13
+ import qualified Data.Text.IO as TIO
12
14
import Data.Void (Void )
13
15
import qualified Control.Monad as Monad
14
16
15
17
type Parser = Parsec. Parsec Void Text
16
18
17
- -- if iszero 0 then true else false
18
-
19
- data Token
20
- = KeywordIf
21
- | KeywordThen
22
- | KeywordElse
23
- | KeywordIsZero
24
- | KeywordTrue
25
- | KeywordFalse
26
- | IntegerToken Integer
19
+ data Expr
20
+ = IntegerLiteral Integer
21
+ | TrueLiteral
22
+ | FalseLiteral
23
+ | IfExpr Expr Expr Expr
27
24
deriving (Show , Eq )
28
25
29
26
consumeSpace :: Parser ()
@@ -39,23 +36,56 @@ lexeme = Lexer.lexeme consumeSpace
39
36
symbol :: Text -> Parser Text
40
37
symbol = Lexer. symbol consumeSpace
41
38
42
- token :: Parser Token
43
- token = keywordToken <|> integerToken
39
+ keyword :: Text -> Parser ()
40
+ keyword kwd = dbg (T. unpack kwd) $
41
+ lexeme $ do
42
+ Monad. void (Char. string kwd)
43
+ Monad. void (Parsec. notFollowedBy Char. alphaNumChar)
44
+
45
+ keywordIf :: Parser ()
46
+ keywordIf = keyword " if"
47
+
48
+ keywordThen :: Parser ()
49
+ keywordThen = keyword " then"
50
+
51
+ keywordElse :: Parser ()
52
+ keywordElse = keyword " else"
53
+
54
+ keywordIsZero :: Parser ()
55
+ keywordIsZero = keyword " iszero"
44
56
45
- keywordToken :: Parser Token
46
- keywordToken =
57
+ integerLiteral :: Parser Expr
58
+ integerLiteral = dbg " integerLiteral" $
59
+ IntegerLiteral <$> lexeme Lexer. decimal
60
+
61
+ trueLiteral :: Parser Expr
62
+ trueLiteral = dbg " trueLiteral" $
63
+ TrueLiteral <$ keyword " true"
64
+
65
+ falseLiteral :: Parser Expr
66
+ falseLiteral = dbg " falseLiteral" $
67
+ FalseLiteral <$ keyword " false"
68
+
69
+ ifExpr :: Parser Expr
70
+ ifExpr =
71
+ IfExpr
72
+ <$ keywordIf
73
+ <*> expr
74
+ <* keywordThen
75
+ <*> expr
76
+ <* keywordElse
77
+ <*> expr
78
+
79
+ expr :: Parser Expr
80
+ expr =
47
81
Parsec. choice
48
- [ KeywordIf <$ symbol " if"
49
- , KeywordThen <$ symbol " then"
50
- , KeywordElse <$ symbol " else"
51
- , KeywordIsZero <$ symbol " iszero"
52
- , KeywordTrue <$ symbol " true"
53
- , KeywordFalse <$ symbol " false"
82
+ [ integerLiteral
83
+ , trueLiteral
84
+ , falseLiteral
85
+ , ifExpr
54
86
]
55
87
56
- integerToken :: Parser Token
57
- integerToken =
58
- IntegerToken <$> lexeme Lexer. decimal
59
-
60
88
main :: IO ()
61
- main = someFunc
89
+ main = do
90
+ input <- TIO. getContents
91
+ Parsec. parseTest expr input
0 commit comments