add string literals to parser
This commit is contained in:
parent
fa5783b6e1
commit
17cfbce27d
30
parser.hs
30
parser.hs
|
@ -22,17 +22,32 @@ ops = [ [Infix (reservedOp "*" >> return Mul) AssocLeft ]
|
||||||
, [Infix (reservedOp "+" >> return Add) AssocLeft]
|
, [Infix (reservedOp "+" >> return Add) AssocLeft]
|
||||||
]
|
]
|
||||||
|
|
||||||
identifier = T.identifier lexer -- parses an identifier
|
identifier = T.identifier lexer
|
||||||
reserved = T.reserved lexer -- parses a reserved name
|
reserved = T.reserved lexer
|
||||||
reservedOp = T.reservedOp lexer -- parses an operator
|
reservedOp = T.reservedOp lexer
|
||||||
parens = T.parens lexer -- parses surrounding parenthesis
|
parens = T.parens lexer
|
||||||
integer = T.integer lexer -- parses an integer
|
integer = T.integer lexer
|
||||||
semi = T.semi lexer -- parses a semicolon
|
semi = T.semi lexer
|
||||||
whiteSpace = T.whiteSpace lexer -- parses whitespace
|
whiteSpace = T.whiteSpace lexer
|
||||||
symbol = T.symbol lexer
|
symbol = T.symbol lexer
|
||||||
|
|
||||||
statement = exprparser
|
statement = exprparser
|
||||||
|
|
||||||
|
-- http://codereview.stackexchange.com/a/2572
|
||||||
|
stringChar =
|
||||||
|
escaped <|> noneOf "\""
|
||||||
|
where
|
||||||
|
escaped = char '\\' >> choice (zipWith escapedChar codes replacements)
|
||||||
|
escapedChar code replacement = char code >> return replacement
|
||||||
|
codes = ['b', 'n', 'f', 'r', 't', '\\', '\"', '/']
|
||||||
|
replacements = ['\b', '\n', '\f', '\r', '\t', '\\', '\"', '/']
|
||||||
|
|
||||||
|
stringLiteral = do
|
||||||
|
char '"'
|
||||||
|
x <- many stringChar
|
||||||
|
char '"'
|
||||||
|
return x
|
||||||
|
|
||||||
block = do
|
block = do
|
||||||
reserved "do"
|
reserved "do"
|
||||||
lst <- seqStmt
|
lst <- seqStmt
|
||||||
|
@ -95,6 +110,7 @@ term = try block
|
||||||
<|> parens exprparser
|
<|> parens exprparser
|
||||||
<|> listSeq exprparser ListConst
|
<|> listSeq exprparser ListConst
|
||||||
<|> fmap Var identifier
|
<|> fmap Var identifier
|
||||||
|
<|> fmap StrConst stringLiteral
|
||||||
<|> fmap IntConst integer
|
<|> fmap IntConst integer
|
||||||
|
|
||||||
seqStmt = sepBy1 statement semi
|
seqStmt = sepBy1 statement semi
|
||||||
|
|
Loading…
Reference in New Issue