Skip to content

Commit a65c411

Browse files
committed
[hello-parsec] update
1 parent ceeafb2 commit a65c411

File tree

1 file changed

+55
-25
lines changed

1 file changed

+55
-25
lines changed

hello-parsec/app/Main.hs

+55-25
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,20 @@ import Text.Megaparsec((<|>))
77
import qualified Text.Megaparsec as Parsec
88
import qualified Text.Megaparsec.Char as Char
99
import qualified Text.Megaparsec.Char.Lexer as Lexer
10+
import Text.Megaparsec.Debug
1011
import Data.Text(Text)
1112
import qualified Data.Text as T
13+
import qualified Data.Text.IO as TIO
1214
import Data.Void(Void)
1315
import qualified Control.Monad as Monad
1416

1517
type Parser = Parsec.Parsec Void Text
1618

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
2724
deriving (Show, Eq)
2825

2926
consumeSpace :: Parser ()
@@ -39,23 +36,56 @@ lexeme = Lexer.lexeme consumeSpace
3936
symbol :: Text -> Parser Text
4037
symbol = Lexer.symbol consumeSpace
4138

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"
4456

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 =
4781
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
5486
]
5587

56-
integerToken :: Parser Token
57-
integerToken =
58-
IntegerToken <$> lexeme Lexer.decimal
59-
6088
main :: IO ()
61-
main = someFunc
89+
main = do
90+
input <- TIO.getContents
91+
Parsec.parseTest expr input

0 commit comments

Comments
 (0)