all of javascript tokenizer is done other than compiler errors

This commit is contained in:
Pagwin 2026-01-31 01:35:08 -05:00
parent dea8577f14
commit cf4f35f997
No known key found for this signature in database
GPG key ID: 81137023740CA260

View file

@ -19,7 +19,7 @@ import Data.Maybe (maybeToList)
import Data.String (IsString (fromString)) import Data.String (IsString (fromString))
import Data.Void (Void) import Data.Void (Void)
import Logger import Logger
import Text.Megaparsec (MonadParsec (notFollowedBy, try), ParseErrorBundle, ParsecT, Stream (tokensToChunk), anySingle, between, choice, parse, runParserT) import Text.Megaparsec (MonadParsec (notFollowedBy, try), ParseErrorBundle, ParsecT, Stream (tokensToChunk), anySingle, anySingleBut, between, choice, noneOf, parse, runParserT)
import qualified Text.Megaparsec as MP import qualified Text.Megaparsec as MP
import Text.Megaparsec.Char (binDigitChar, char, digitChar, eol, hexDigitChar, hspace, letterChar, newline, octDigitChar, string) import Text.Megaparsec.Char (binDigitChar, char, digitChar, eol, hexDigitChar, hspace, letterChar, newline, octDigitChar, string)
import Utilities.Parsing (Characters, ToChar (fromChar, toChar), ToText (fromText, toString, toText)) import Utilities.Parsing (Characters, ToChar (fromChar, toChar), ToText (fromText, toString, toText))
@ -442,8 +442,19 @@ fslash_handler = do
regex_literal :: Parser s m (Token s) regex_literal :: Parser s m (Token s)
regex_literal = do regex_literal = do
char '/' char '/'
error "TODO" first_char <- reg_first_char
pure $ Literal $ Regex {} rem_chars <- many reg_rem_char
let body = fromString (first_char : rem_chars)
char '/'
flags <- fromString $ tokensToChunk (Proxy :: Proxy s) <$> many letterChar
pure $ Literal $ Regex {body, flags}
reg_first_char :: Parser s m Char
-- ecmascript specification name lied to me, it can be more than one char >:(
-- to clarify this is technically wrong but I don't care because I don't want to rewrite
-- other code due to ecmascript standard using bad names
reg_first_char = noneOf "*/"
reg_rem_char :: Parser s m Char
reg_rem_char = anySingleBut '/'
division_assign :: Parser s m (Token s) division_assign :: Parser s m (Token s)
division_assign = (string "/=") *> (pure $ Punc $ DivAssign :: Parser s m (Token s)) division_assign = (string "/=") *> (pure $ Punc $ DivAssign :: Parser s m (Token s))