49 lines
1.7 KiB
Haskell
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 "" []
|