Skip to content

Commit

Permalink
fix: handle escape sequences in the AST as an unit
Browse files Browse the repository at this point in the history
  • Loading branch information
Jabolol committed Jan 10, 2025
1 parent 6b0732d commit f9f0291
Showing 1 changed file with 47 additions and 2 deletions.
49 changes: 47 additions & 2 deletions lib/Ast/Parser/Literal.hs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ module Ast.Parser.Literal where

import qualified Ast.Parser.Utils as PU
import qualified Ast.Types as AT
import qualified Data.Char as C
import qualified Text.Megaparsec as M
import qualified Text.Megaparsec.Char as MC
import qualified Text.Megaparsec.Char.Lexer as ML
Expand Down Expand Up @@ -54,9 +55,53 @@ parseChar = AT.LChar <$> M.between (MC.char '\'') (MC.char '\'') M.anySingle
parseArray :: PU.Parser AT.Literal
parseArray =
M.choice
[ AT.LArray . map AT.LChar <$> M.between (MC.char '\"') (MC.char '\"') (M.many (M.noneOf ['"'])),
AT.LArray <$> M.between (PU.symbol "[") (PU.symbol "]") (M.sepBy parseLiteral PU.sc)
[ parseStringArray,
parseLiteralArray
]
where
parseStringArray =
AT.LArray . map AT.LChar
<$> M.between (MC.char '\"') (MC.char '\"') (M.many parseStringChar)

parseLiteralArray =
AT.LArray
<$> M.between (PU.symbol "[") (PU.symbol "]") (M.sepBy parseLiteral PU.sc)

parseStringChar =
M.choice
[ parseEscapeSequence,
M.noneOf ['"', '\\']
]

parseEscapeSequence =
MC.char '\\'
>> M.choice
[ '\a' <$ MC.char 'a',
'\b' <$ MC.char 'b',
'\f' <$ MC.char 'f',
'\n' <$ MC.char 'n',
'\r' <$ MC.char 'r',
'\t' <$ MC.char 't',
'\v' <$ MC.char 'v',
'\\' <$ MC.char '\\',
'\"' <$ MC.char '"',
'\'' <$ MC.char '\'',
'\0' <$ MC.char '0',
parseHexEscape,
parseOctalEscape
]

parseHexEscape = do
_ <- MC.char 'x'
digits <- M.count 2 hexDigit
return $ C.chr $ read ("0x" ++ digits)

parseOctalEscape = do
digits <- M.count 3 octalDigit
return $ C.chr $ read ("0o" ++ digits)

hexDigit = M.oneOf $ ['0' .. '9'] ++ ['a' .. 'f'] ++ ['A' .. 'F']
octalDigit = M.oneOf ['0' .. '7']

-- | Parses a `null` literal.
-- Returns a `Literal` of type `LNull`.
Expand Down

0 comments on commit f9f0291

Please # to comment.