Everything is now Data.Text instead of String

This commit is contained in:
vegowotenks 2025-02-21 18:17:46 +01:00
parent 753f429ec8
commit cbfd729795
18 changed files with 178 additions and 137 deletions

View file

@ -1,3 +1,4 @@
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
module Ubc.Parse.Syntax.Language
( languageDef
@ -33,19 +34,24 @@ module Ubc.Parse.Syntax.Language
)
where
import Data.Functor ( ($>) )
import Data.Functor ( ($>), (<&>) )
import qualified Data.Text as Text
import Text.Parsec
( alphaNum, char, letter, oneOf, choice, (<|>), ParsecT )
import Text.Parsec.Token
( makeTokenParser,
GenLanguageDef(..),
GenTokenParser(TokenParser, identifier, reserved, operator,
reservedOp, charLiteral, stringLiteral, natural, integer, float,
naturalOrFloat, decimal, hexadecimal, octal, symbol, lexeme,
whiteSpace, parens, braces, angles, brackets, semi, comma, colon,
dot, semiSep, semiSep1, commaSep, commaSep1) )
GenTokenParser(TokenParser,
charLiteral, natural, integer, float,
naturalOrFloat, decimal, hexadecimal, octal, lexeme,
whiteSpace, parens, braces, angles, brackets,
semiSep, semiSep1, commaSep, commaSep1) )
import qualified Text.Parsec.Token as Token
languageDef :: Monad m => GenLanguageDef String u m
import Ubc.Parse.Syntax (Token)
languageDef :: Monad m => GenLanguageDef Token u m
languageDef = LanguageDef {
commentStart = "/*"
, commentEnd = "*/"
@ -92,44 +98,29 @@ languageDef = LanguageDef {
, caseSensitive = True
}
tokenParser :: Monad m => GenTokenParser String u m
tokenParser :: Monad m => GenTokenParser Token u m
tokenParser = makeTokenParser languageDef
identifier :: Monad m => ParsecT String u m String
reserved :: Monad m => String -> ParsecT String u m ()
operator :: Monad m => ParsecT String u m String
reservedOperator :: Monad m => String -> ParsecT String u m ()
characterLiteral :: Monad m => ParsecT String u m Char
stringLiteral :: Monad m => ParsecT String u m String
natural :: Monad m => ParsecT String u m Integer
integer :: Monad m => ParsecT String u m Integer
float :: Monad m => ParsecT String u m Double
naturalOrFloat :: Monad m => ParsecT String u m (Either Integer Double)
decimal :: Monad m => ParsecT String u m Integer
hexadecimal :: Monad m => ParsecT String u m Integer
octal :: Monad m => ParsecT String u m Integer
symbol :: Monad m => String -> ParsecT String u m String
lexeme :: Monad m => ParsecT String u m a -> ParsecT String u m a
whiteSpace :: Monad m => ParsecT String u m ()
parens :: Monad m => ParsecT String u m a -> ParsecT String u m a
braces :: Monad m => ParsecT String u m a -> ParsecT String u m a
angles :: Monad m => ParsecT String u m a -> ParsecT String u m a
brackets :: Monad m => ParsecT String u m a -> ParsecT String u m a
semicolon :: Monad m => ParsecT String u m String
comma :: Monad m => ParsecT String u m String
colon :: Monad m => ParsecT String u m String
dot :: Monad m => ParsecT String u m String
semicolonSeparated :: Monad m => ParsecT String u m a -> ParsecT String u m [a]
semicolonSeparated1 :: Monad m => ParsecT String u m a -> ParsecT String u m [a]
commaSeparated :: Monad m => ParsecT String u m a -> ParsecT String u m [a]
commaSeparated1 :: Monad m => ParsecT String u m a -> ParsecT String u m [a]
characterLiteral :: Monad m => ParsecT Token u m Char
natural :: Monad m => ParsecT Token u m Integer
integer :: Monad m => ParsecT Token u m Integer
float :: Monad m => ParsecT Token u m Double
naturalOrFloat :: Monad m => ParsecT Token u m (Either Integer Double)
decimal :: Monad m => ParsecT Token u m Integer
hexadecimal :: Monad m => ParsecT Token u m Integer
octal :: Monad m => ParsecT Token u m Integer
lexeme :: Monad m => ParsecT Token u m a -> ParsecT Token u m a
whiteSpace :: Monad m => ParsecT Token u m ()
parens :: Monad m => ParsecT Token u m a -> ParsecT Token u m a
braces :: Monad m => ParsecT Token u m a -> ParsecT Token u m a
angles :: Monad m => ParsecT Token u m a -> ParsecT Token u m a
brackets :: Monad m => ParsecT Token u m a -> ParsecT Token u m a
semicolonSeparated :: Monad m => ParsecT Token u m a -> ParsecT Token u m [a]
semicolonSeparated1 :: Monad m => ParsecT Token u m a -> ParsecT Token u m [a]
commaSeparated :: Monad m => ParsecT Token u m a -> ParsecT Token u m [a]
commaSeparated1 :: Monad m => ParsecT Token u m a -> ParsecT Token u m [a]
TokenParser{
identifier = identifier
, reserved = reserved
, operator = operator
, reservedOp = reservedOperator
, charLiteral = characterLiteral
, stringLiteral = stringLiteral
charLiteral = characterLiteral
, natural = natural -- decimal, hexadecimal or octal
, integer = integer -- decimal, hexadecimal or octal
, float = float
@ -137,24 +128,49 @@ TokenParser{
, decimal = decimal
, hexadecimal = hexadecimal
, octal = octal
, symbol = symbol
, lexeme = lexeme
, whiteSpace = whiteSpace
, parens = parens
, braces = braces
, angles = angles
, brackets = brackets
, semi = semicolon
, comma = comma
, colon = colon
, dot = dot
, semiSep = semicolonSeparated
, semiSep1 = semicolonSeparated1
, commaSep = commaSeparated
, commaSep1 = commaSeparated1
} = tokenParser
typeName :: Monad m => ParsecT String u m String
semicolon :: Monad m => ParsecT Token u m Token
semicolon = Token.semi tokenParser <&> Text.pack
comma :: Monad m => ParsecT Token u m Token
comma = Token.comma tokenParser <&> Text.pack
colon :: Monad m => ParsecT Token u m Token
colon = Token.colon tokenParser <&> Text.pack
dot :: Monad m => ParsecT Token u m Token
dot = Token.dot tokenParser <&> Text.pack
symbol :: Monad m => String -> ParsecT Token u m Token
symbol = (<&> Text.pack) . Token.symbol tokenParser
stringLiteral :: Monad m => ParsecT Token u m Token
stringLiteral = Token.stringLiteral tokenParser <&> Text.pack
identifier :: Monad m => ParsecT Token u m Token
identifier = Token.identifier tokenParser <&> Text.pack
reserved :: Monad m => String -> ParsecT Token u m ()
reserved = Token.reserved tokenParser
operator :: Monad m => ParsecT Token u m Token
operator = Token.operator tokenParser <&> Text.pack
reservedOperator :: Monad m => String -> ParsecT Token u m ()
reservedOperator = Token.reservedOp tokenParser
typeName :: Monad m => ParsecT Token u m Token
typeName = choice
[ Ubc.Parse.Syntax.Language.reserved "i32" $> "i32"
, Ubc.Parse.Syntax.Language.reserved "u32" $> "u32"