|
@@ -91,54 +91,61 @@ tPair a b = tList $ do
|
|
|
rb <- b
|
|
|
return (ra, rb)
|
|
|
|
|
|
-tKnownTypeName :: Parser ParseEnv TypeName
|
|
|
-tKnownTypeName = do
|
|
|
+tKnownPrimType :: Parser ParseEnv PrimType
|
|
|
+tKnownPrimType = do
|
|
|
+ t <- tKnownType
|
|
|
+ case t of
|
|
|
+ PrimType p -> return p
|
|
|
+ StructType n _ -> fail ("expected a known primitive type name, got " ++ n)
|
|
|
+
|
|
|
+tKnownType :: Parser ParseEnv Type
|
|
|
+tKnownType = do
|
|
|
s <- tSymbol
|
|
|
te <- getTypeEnv
|
|
|
case lookupTypeName s te of
|
|
|
- Just _ -> return s
|
|
|
+ Just t -> return t
|
|
|
Nothing -> fail ("expected a known type name, got " ++ s)
|
|
|
|
|
|
-tStructRow :: Parser ParseEnv (Identifier, TypeName)
|
|
|
-tStructRow = tPair tSymbol tKnownTypeName
|
|
|
+tStructRow :: Parser ParseEnv (Identifier, PrimType)
|
|
|
+tStructRow = tPair tSymbol tKnownPrimType
|
|
|
<?> "struct row"
|
|
|
|
|
|
-tStructBody :: Parser ParseEnv [(Identifier, TypeName)]
|
|
|
+tStructBody :: Parser ParseEnv [(Identifier, PrimType)]
|
|
|
tStructBody = tList (many1 (tWhiteSpace >> tStructRow))
|
|
|
<?> "struct body"
|
|
|
|
|
|
-tStructDecl :: Parser ParseEnv (TypeName, TypeDescr)
|
|
|
+tStructDecl :: Parser ParseEnv (TypeName, Type)
|
|
|
tStructDecl = tList $ do
|
|
|
tIdentifier "def-struct"
|
|
|
tWhiteSpace
|
|
|
n <- tSymbol
|
|
|
b <- tStructBody
|
|
|
- return (n, StructType (Struct b))
|
|
|
+ return (n, StructType n b)
|
|
|
|
|
|
-defineType :: (TypeName, TypeDescr) -> Parser ParseEnv ()
|
|
|
+defineType :: (TypeName, Type) -> Parser ParseEnv ()
|
|
|
defineType (tn, t) = do
|
|
|
te <- getTypeEnv
|
|
|
case lookupTypeName tn te of
|
|
|
Just _ -> fail ("type named '" ++ tn ++ "' already exists")
|
|
|
Nothing -> setTypeEnv (insertType tn t te)
|
|
|
|
|
|
-defineInterface :: (InterfaceName, InterfaceDescr) -> Parser ParseEnv ()
|
|
|
+defineInterface :: (InterfaceName, Interface) -> Parser ParseEnv ()
|
|
|
defineInterface (ina, i) = do
|
|
|
ie <- getInterfaceEnv
|
|
|
case lookupInterface ina ie of
|
|
|
Just _ -> fail ("interface named '" ++ ina ++ "' already exists")
|
|
|
Nothing -> setInterfaceEnv (insertInterface ina i ie)
|
|
|
|
|
|
-tNewtypeDecl :: Parser ParseEnv (TypeName, TypeDescr)
|
|
|
+tNewtypeDecl :: Parser ParseEnv (TypeName, Type)
|
|
|
tNewtypeDecl = tList $ do
|
|
|
tIdentifier "def-newtype"
|
|
|
tWhiteSpace
|
|
|
n <- tSymbol
|
|
|
tWhiteSpace
|
|
|
- c <- tKnownTypeName
|
|
|
- return (n, NewtypeType (Newtype c))
|
|
|
+ c <- tKnownPrimType
|
|
|
+ return (n, PrimType (Newtype n c))
|
|
|
|
|
|
-tEnumDecl :: Parser ParseEnv (TypeName, TypeDescr)
|
|
|
+tEnumDecl :: Parser ParseEnv (TypeName, Type)
|
|
|
tEnumDecl = tList $ do
|
|
|
tIdentifier "def-enum"
|
|
|
tWhiteSpace
|
|
@@ -158,7 +165,7 @@ tEnumDecl = tList $ do
|
|
|
when (not_unique (map snd vs)) $
|
|
|
fail "enum values were not unique"
|
|
|
-- XXX make it possible to implicitly assign numbers
|
|
|
- return (n, EnumType (EnumT width vs))
|
|
|
+ return (n, PrimType (EnumType n width vs))
|
|
|
|
|
|
not_unique :: (Eq a) => [a] -> Bool
|
|
|
not_unique l = nub l /= l
|
|
@@ -175,7 +182,7 @@ tPermission = do
|
|
|
"rw" -> return ReadWrite
|
|
|
_ -> fail "expected permission"
|
|
|
|
|
|
-tInterfaceMethod :: Parser ParseEnv (MethodName, Method TypeName)
|
|
|
+tInterfaceMethod :: Parser ParseEnv (MethodName, Method)
|
|
|
tInterfaceMethod = tList $ do
|
|
|
n <- tSymbol
|
|
|
m <- choice [ try tAttr, try tStream ]
|
|
@@ -186,25 +193,25 @@ tInterfaceMethod = tList $ do
|
|
|
tWhiteSpace
|
|
|
p <- tPermission
|
|
|
tWhiteSpace
|
|
|
- tn <- tKnownTypeName
|
|
|
+ tn <- tKnownType
|
|
|
return (AttrMethod p tn)
|
|
|
tStream = tList $ do
|
|
|
tIdentifier "stream"
|
|
|
tWhiteSpace
|
|
|
r <- tInteger
|
|
|
tWhiteSpace
|
|
|
- tn <- tKnownTypeName
|
|
|
+ tn <- tKnownType
|
|
|
return (StreamMethod r tn)
|
|
|
|
|
|
-tKnownInterfaceName :: Parser ParseEnv InterfaceName
|
|
|
-tKnownInterfaceName = do
|
|
|
+tKnownInterface :: Parser ParseEnv Interface
|
|
|
+tKnownInterface = do
|
|
|
n <- tSymbol
|
|
|
ie <- getInterfaceEnv
|
|
|
case lookupInterface n ie of
|
|
|
- Just _ -> return n
|
|
|
+ Just i -> return i
|
|
|
Nothing -> fail ("expected a known interface name, got " ++ n)
|
|
|
|
|
|
-tInterfaceDecl :: Parser ParseEnv (InterfaceName, InterfaceDescr)
|
|
|
+tInterfaceDecl :: Parser ParseEnv (InterfaceName, Interface)
|
|
|
tInterfaceDecl = tList $ do
|
|
|
tIdentifier "def-interface"
|
|
|
tWhiteSpace
|
|
@@ -214,7 +221,7 @@ tInterfaceDecl = tList $ do
|
|
|
when (not_unique (map fst ms)) $
|
|
|
fail "expected unique interface method names"
|
|
|
tWhiteSpace
|
|
|
- ps <- optionMaybe (tList (many1 tKnownInterfaceName))
|
|
|
+ ps <- optionMaybe (tList (many1 tKnownInterface))
|
|
|
-- XXX require the ms not shadow names in inherited interfaces
|
|
|
case ps of
|
|
|
Just p -> return (n, Interface p ms)
|