module Data.String.Ubc.Parse.Struct ( Struct(..) , parseStruct ) where import Text.Parsec import Data.String.Ubc.Parse.StructVariable (StructVariable) import Data.String.Ubc.Parse.ParserState (ParserState) import Data.String.Ubc.Parse.Error.StructError (StructError) import Data.String.Ubc.Parse.StructScope (StructScope(..)) import Data.String.Ubc.Parse.Scope (Scope(..)) import qualified Data.String.Ubc.Parse.Language as UbcLanguage import qualified Data.String.Ubc.Parse.Error.StructError as StructError import qualified Data.String.Ubc.Parse.StructScope as StructScope import qualified Data.String.Ubc.Parse.ParserState as ParserState data Struct = Struct { name :: String , memberVariables :: [StructVariable] } parseStruct :: Monad m => ParsecT String ParserState m (Either StructError Struct) parseStruct = do _ <- UbcLanguage.reserved "struct" structName <- choice [ UbcLanguage.identifier >>= return . Right , getPosition >>= return . Left . StructError.MissingNameError ] let structScope = StructScope { structName = either (const Nothing) (Just) structName , errors = [] } updateState (ParserState.pushScope . ScopeStruct $ structScope) openingBrace <- choice [ UbcLanguage.symbol "{" >>= return . Right , getPosition >>= return . Left . StructError.MissingBraceError . Left ] closingBrace <- choice [ UbcLanguage.symbol "}" >>= return . Right , getPosition >>= return . Left . StructError.MissingBraceError . Right ] return $ Right $ Struct "" []