Refactoring into Syntax Parser, also float parsing
This commit is contained in:
parent
212eecfdf7
commit
52e04d28cf
18 changed files with 287 additions and 176 deletions
|
@ -1,131 +0,0 @@
|
|||
{-# LANGUAGE NoMonomorphismRestriction #-}
|
||||
module Ubc.Parse.Language
|
||||
( languageDef
|
||||
, typeName
|
||||
, Ubc.Parse.Language.identifier
|
||||
, Ubc.Parse.Language.reserved
|
||||
, Ubc.Parse.Language.operator
|
||||
, Ubc.Parse.Language.reservedOperator
|
||||
, Ubc.Parse.Language.characterLiteral
|
||||
, Ubc.Parse.Language.stringLiteral
|
||||
, Ubc.Parse.Language.natural
|
||||
, Ubc.Parse.Language.integer
|
||||
, Ubc.Parse.Language.float
|
||||
, Ubc.Parse.Language.naturalOrFloat
|
||||
, Ubc.Parse.Language.decimal
|
||||
, Ubc.Parse.Language.hexadecimal
|
||||
, Ubc.Parse.Language.octal
|
||||
, Ubc.Parse.Language.symbol
|
||||
, Ubc.Parse.Language.lexeme
|
||||
, Ubc.Parse.Language.whiteSpace
|
||||
, Ubc.Parse.Language.parens
|
||||
, Ubc.Parse.Language.braces
|
||||
, Ubc.Parse.Language.angles
|
||||
, Ubc.Parse.Language.brackets
|
||||
, Ubc.Parse.Language.semicolon
|
||||
, Ubc.Parse.Language.comma
|
||||
, Ubc.Parse.Language.colon
|
||||
, Ubc.Parse.Language.dot
|
||||
, Ubc.Parse.Language.semicolonSeparated
|
||||
, Ubc.Parse.Language.semicolonSeparated1
|
||||
, Ubc.Parse.Language.commaSeparated
|
||||
, Ubc.Parse.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.Language.reserved "i32" $> "i32"
|
||||
, Ubc.Parse.Language.reserved "u32" $> "u32"
|
||||
, Ubc.Parse.Language.reserved "f32" $> "f32"
|
||||
, Ubc.Parse.Language.identifier
|
||||
]
|
Loading…
Add table
Add a link
Reference in a new issue