Rain: fixed the dataType parser to accept user-named types

This commit is contained in:
Neil Brown 2007-08-23 18:44:22 +00:00
parent 1d0426ac77
commit e9d882f1ae
3 changed files with 9 additions and 4 deletions

View File

@ -132,6 +132,7 @@ dataType
<|> do {sChannel ; inner <- dataType ; return $ A.Chan A.DirUnknown (A.ChanAttributes {A.caWritingShared = False, A.caReadingShared = False}) inner} <|> do {sChannel ; inner <- dataType ; return $ A.Chan A.DirUnknown (A.ChanAttributes {A.caWritingShared = False, A.caReadingShared = False}) inner}
<|> do {sIn ; inner <- dataType ; return $ A.Chan A.DirInput (A.ChanAttributes {A.caWritingShared = False, A.caReadingShared = False}) inner} <|> do {sIn ; inner <- dataType ; return $ A.Chan A.DirInput (A.ChanAttributes {A.caWritingShared = False, A.caReadingShared = False}) inner}
<|> do {sOut ; inner <- dataType ; return $ A.Chan A.DirOutput (A.ChanAttributes {A.caWritingShared = False, A.caReadingShared = False}) inner} <|> do {sOut ; inner <- dataType ; return $ A.Chan A.DirOutput (A.ChanAttributes {A.caWritingShared = False, A.caReadingShared = False}) inner}
<|> do {(m,n) <- identifier ; return $ A.UserDataType A.Name {A.nameMeta = m, A.nameName = n, A.nameType = A.DataTypeName}}
<?> "data type" <?> "data type"
variableId :: RainParser A.Variable variableId :: RainParser A.Variable
@ -260,7 +261,7 @@ tupleDef = do {sLeftR ; tm <- sepBy tupleDefMember sComma ; sRightR ; return tm}
tupleDefMember = do {t <- dataType ; sColon ; n <- name ; return (n,t)} tupleDefMember = do {t <- dataType ; sColon ; n <- name ; return (n,t)}
declaration :: RainParser (Meta,A.Structured -> A.Structured) declaration :: RainParser (Meta,A.Structured -> A.Structured)
declaration = do {t <- dataType; sColon ; n <- name ; sSemiColon ; declaration = try $ do {t <- dataType; sColon ; n <- name ; sSemiColon ;
return (findMeta t, A.Spec (findMeta t) $ A.Specification (findMeta t) n $ A.Declaration (findMeta t) t) } return (findMeta t, A.Spec (findMeta t) $ A.Specification (findMeta t) n $ A.Declaration (findMeta t) t) }
topLevelDecl :: RainParser A.Structured topLevelDecl :: RainParser A.Structured

View File

@ -295,9 +295,10 @@ testDataType =
,pass ("sint16",RP.dataType,assertEqual "testDataType 7" A.Int16) ,pass ("sint16",RP.dataType,assertEqual "testDataType 7" A.Int16)
,pass ("sint32",RP.dataType,assertEqual "testDataType 8" A.Int32) ,pass ("sint32",RP.dataType,assertEqual "testDataType 8" A.Int32)
,pass ("sint64",RP.dataType,assertEqual "testDataType 9" A.Int64) ,pass ("sint64",RP.dataType,assertEqual "testDataType 9" A.Int64)
,fail ("boolean",RP.dataType) ,pass ("boolean",RP.dataType,assertEqual "testDataType 10" $ A.UserDataType $ typeName "boolean")
,fail ("uint24",RP.dataType) ,pass ("uint24",RP.dataType,assertEqual "testDataType 11" $ A.UserDataType $ typeName "uint24")
,fail ("int0",RP.dataType) ,pass ("int0",RP.dataType,assertEqual "testDataType 12" $ A.UserDataType $ typeName "int0")
,fail ("bool bool",RP.dataType)
,pass ("?int",RP.dataType,assertEqual "testDataType 102" $ A.Chan A.DirInput nonShared A.Int) ,pass ("?int",RP.dataType,assertEqual "testDataType 102" $ A.Chan A.DirInput nonShared A.Int)
,pass ("! bool",RP.dataType,assertEqual "testDataType 103" $ A.Chan A.DirOutput nonShared A.Bool) ,pass ("! bool",RP.dataType,assertEqual "testDataType 103" $ A.Chan A.DirOutput nonShared A.Bool)

View File

@ -42,6 +42,9 @@ simpleName s = A.Name { A.nameName = s , A.nameMeta = emptyMeta , A.nameType = A
procName :: String -> A.Name procName :: String -> A.Name
procName s = A.Name { A.nameName = s , A.nameMeta = emptyMeta , A.nameType = A.ProcName } procName s = A.Name { A.nameName = s , A.nameMeta = emptyMeta , A.nameType = A.ProcName }
typeName :: String -> A.Name
typeName s = A.Name { A.nameName = s , A.nameMeta = emptyMeta , A.nameType = A.DataTypeName }
simpleNamePattern :: String -> Pattern simpleNamePattern :: String -> Pattern
simpleNamePattern s = tag3 A.Name DontCare A.VariableName s simpleNamePattern s = tag3 A.Name DontCare A.VariableName s