131 lines
6.2 KiB
Haskell
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
|
|
]
|