ubcc/src/Ubc/Parse/Syntax/Language.hs

131 lines
6.2 KiB
Haskell

{-# LANGUAGE NoMonomorphismRestriction #-}
module Ubc.Parse.Syntax.Language
( languageDef
, typeName
, Ubc.Parse.Syntax.Language.identifier
, Ubc.Parse.Syntax.Language.reserved
, Ubc.Parse.Syntax.Language.operator
, Ubc.Parse.Syntax.Language.reservedOperator
, Ubc.Parse.Syntax.Language.characterLiteral
, Ubc.Parse.Syntax.Language.stringLiteral
, Ubc.Parse.Syntax.Language.natural
, Ubc.Parse.Syntax.Language.integer
, Ubc.Parse.Syntax.Language.float
, Ubc.Parse.Syntax.Language.naturalOrFloat
, Ubc.Parse.Syntax.Language.decimal
, Ubc.Parse.Syntax.Language.hexadecimal
, Ubc.Parse.Syntax.Language.octal
, Ubc.Parse.Syntax.Language.symbol
, Ubc.Parse.Syntax.Language.lexeme
, Ubc.Parse.Syntax.Language.whiteSpace
, Ubc.Parse.Syntax.Language.parens
, Ubc.Parse.Syntax.Language.braces
, Ubc.Parse.Syntax.Language.angles
, Ubc.Parse.Syntax.Language.brackets
, Ubc.Parse.Syntax.Language.semicolon
, Ubc.Parse.Syntax.Language.comma
, Ubc.Parse.Syntax.Language.colon
, Ubc.Parse.Syntax.Language.dot
, Ubc.Parse.Syntax.Language.semicolonSeparated
, Ubc.Parse.Syntax.Language.semicolonSeparated1
, Ubc.Parse.Syntax.Language.commaSeparated
, Ubc.Parse.Syntax.Language.commaSeparated1
)
where
import Data.Functor ( ($>) )
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) )
languageDef :: Monad m => GenLanguageDef String u m
languageDef = LanguageDef {
commentStart = "/*"
, commentEnd = "*/"
, commentLine = "//"
, nestedComments = True
, identStart = letter <|> char '_'
, identLetter = alphaNum <|> char '_'
, opStart = oneOf "+-*/%"
, opLetter = oneOf "+-*/%"
, reservedNames = [ "struct", "u32", "i32", "f32", "if", "then", "else" ]
, reservedOpNames = [ "+", "-", "*", "/", "%" ]
, caseSensitive = True
}
tokenParser :: Monad m => GenTokenParser String 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]
TokenParser{
identifier = identifier
, reserved = reserved
, operator = operator
, reservedOp = reservedOperator
, charLiteral = characterLiteral
, stringLiteral = stringLiteral
, natural = natural -- decimal, hexadecimal or octal
, integer = integer -- decimal, hexadecimal or octal
, float = float
, naturalOrFloat = naturalOrFloat
, 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
typeName = choice
[ Ubc.Parse.Syntax.Language.reserved "i32" $> "i32"
, Ubc.Parse.Syntax.Language.reserved "u32" $> "u32"
, Ubc.Parse.Syntax.Language.reserved "f32" $> "f32"
, Ubc.Parse.Syntax.Language.identifier
]