Skip to content

Commit 1a4fbca

Browse files
committed
feat: read stdin
1 parent a585dbc commit 1a4fbca

3 files changed

Lines changed: 50 additions & 6 deletions

File tree

lab-parser/src/JsonParser.hs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
module JsonParser (
22
JsonValue(..),
3+
json,
34
jsonValue,
45
jsonNull,
56
jsonBool,
@@ -22,6 +23,8 @@ data JsonValue = JsonNull
2223
| JsonObject [(String, JsonValue)]
2324
deriving (Show, Eq)
2425

26+
json = ws *> jsonValue <* ws
27+
2528
jsonValue :: Parser JsonValue
2629
jsonValue = jsonNull
2730
<|> jsonBool
@@ -45,8 +48,18 @@ jsonNumber = lstToInt <$> number
4548
where
4649
lstToInt nms = JsonNumber $ read $ map intToDigit nms
4750

51+
simpleChar_ :: Parser Char
52+
simpleChar_ = satisfy ((&&) <$> (/= '"') <*> (/= '\\'))
53+
54+
escapedChar_ :: Parser Char
55+
escapedChar_ = ('"' <$ string "\\\"")
56+
<|> ('\\' <$ string "\\\\")
57+
<|> ('\n' <$ string "\\n")
58+
<|> ('\r' <$ string "\\r")
59+
<|> ('\t' <$ string "\\t")
60+
4861
stringLiteral :: Parser [Char]
49-
stringLiteral = char '"' *> (many $ satisfy (/= '"')) <* char '"'
62+
stringLiteral = char '"' *> many (simpleChar_ <|> escapedChar_) <* char '"'
5063

5164
jsonString :: Parser JsonValue
5265
jsonString = JsonString <$> stringLiteral

lab-parser/src/Lib.hs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,38 @@ module Lib (
44

55
import Parser
66
import JsonParser
7+
import System.IO
78

89
mainLoop :: IO ()
9-
mainLoop = putStrLn "mainLoop"
10+
mainLoop = do
11+
inp <- readStdin
12+
putStrLn inp
13+
case (runParser json inp) of
14+
(Right (ast, rest)) -> putStrLn $ show ast
15+
(Left err) -> putStrLn err
16+
hFlush stdout
17+
18+
myLoop = do
19+
done <- isEOF
20+
if done
21+
then do
22+
putStrLn "Bye!"
23+
hFlush stdout
24+
else do
25+
inp <- getLine
26+
putStrLn inp
27+
hFlush stdout
28+
myLoop
29+
30+
readStdin :: IO String
31+
readStdin = readStdin_ ""
32+
33+
readStdin_ :: String -> IO String
34+
readStdin_ acc = do
35+
done <- isEOF
36+
if done
37+
then do
38+
return acc
39+
else do
40+
inp <- getLine
41+
readStdin_ $ acc ++ "\n" ++ inp

lab-parser/src/Parser.hs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,13 @@ char :: Char -> Parser Char
5353
char c = Parser $ \inp ->
5454
case (runParser (char_ c) inp) of
5555
(Left err) -> Left (err ++ ", expected '" ++ [c] ++ "'" ++ context inp )
56-
result -> result
57-
56+
result -> result
5857

5958
digit :: Parser Int
6059
digit = digitToInt <$> satisfy isDigit
6160

6261
ws :: Parser String
63-
ws = many (satisfy isSpace)
62+
ws = many (satisfy (\c -> isSpace c || c == '\xfeff'))
6463

6564
string_ :: String -> Parser String
6665
string_ str = sequenceA $ map char str
@@ -78,4 +77,4 @@ number :: Parser [Int]
7877
number = some digit
7978

8079
context :: String -> String
81-
context inp = " in " ++ take 10 inp
80+
context inp = ": " ++ take 20 inp

0 commit comments

Comments
 (0)