aboutsummaryrefslogtreecommitdiff
path: root/src/Parser.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Parser.hs')
-rw-r--r--src/Parser.hs17
1 files changed, 8 insertions, 9 deletions
diff --git a/src/Parser.hs b/src/Parser.hs
index 6ec4ba0..f83f4cc 100644
--- a/src/Parser.hs
+++ b/src/Parser.hs
@@ -21,7 +21,6 @@ data Expr = List [Expr]
21 | FloatLiteral Double 21 | FloatLiteral Double
22 | BoolLiteral Bool 22 | BoolLiteral Bool
23 | Id String 23 | Id String
24 | NoReturn
25 deriving (Eq) 24 deriving (Eq)
26 25
27-- backslash double quote escapes a quote inside strings 26-- backslash double quote escapes a quote inside strings
@@ -83,15 +82,16 @@ optionalWhiteSpace :: Parser ()
83optionalWhiteSpace = skipMany $ oneOf [' ', '\n'] 82optionalWhiteSpace = skipMany $ oneOf [' ', '\n']
84 83
85type Alias = String 84type Alias = String
86parseModifier :: Char -> Alias -> Parser Expr 85parseModifier :: String -> Alias -> Parser Expr
87parseModifier c alias = do 86parseModifier s alias = do
88 char c 87 string s
89 x <- parseLispValue 88 x <- parseLispValue
90 return $ List [Id alias, x] 89 return $ List [Id alias, x]
91 90
92parseQuote = parseModifier '\'' "quote" 91parseQuote = parseModifier "'" "quote"
93parseQuasiquote = parseModifier '`' "quasiquote" 92parseQuasiquote = parseModifier "`" "quasiquote"
94parseUnquote = parseModifier ',' "unquote" 93parseUnquote = parseModifier "," "unquote"
94parseUnquoteSplicing = parseModifier ",@" "unquote-splicing"
95-- TODO: add modifier for unquote splicing: ,@ 95-- TODO: add modifier for unquote splicing: ,@
96 96
97parseLispValue :: Parser Expr 97parseLispValue :: Parser Expr
@@ -103,8 +103,8 @@ parseLispValue =
103 <|> try parseId 103 <|> try parseId
104 <|> parseQuote 104 <|> parseQuote
105 <|> parseQuasiquote 105 <|> parseQuasiquote
106 <|> try parseUnquoteSplicing
106 <|> parseUnquote 107 <|> parseUnquote
107 -- handles lists and dotted lists
108 <|> do 108 <|> do
109 char '(' >> optionalWhiteSpace 109 char '(' >> optionalWhiteSpace
110 x <- sepEndBy parseLispValue whiteSpace 110 x <- sepEndBy parseLispValue whiteSpace
@@ -127,4 +127,3 @@ instance Show Expr where
127 show (BoolLiteral True) = "#t" 127 show (BoolLiteral True) = "#t"
128 show (BoolLiteral False) = "#f" 128 show (BoolLiteral False) = "#f"
129 show (Id i) = i 129 show (Id i) = i
130 show NoReturn = ";;; environment extension"