ubcc/src/Data/String/Ubc/Parse/Struct.hs

49 lines
1.7 KiB
Haskell

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 "" []