From e9d882f1aeb60dee5322182b6d33092b9e083ed2 Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Thu, 23 Aug 2007 18:44:22 +0000 Subject: [PATCH] Rain: fixed the dataType parser to accept user-named types --- RainParse.hs | 3 ++- RainParseTest.hs | 7 ++++--- TestUtil.hs | 3 +++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/RainParse.hs b/RainParse.hs index d3847dd..ccec8df 100644 --- a/RainParse.hs +++ b/RainParse.hs @@ -132,6 +132,7 @@ dataType <|> 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 {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" 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)} 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) } topLevelDecl :: RainParser A.Structured diff --git a/RainParseTest.hs b/RainParseTest.hs index d6366e8..886357f 100644 --- a/RainParseTest.hs +++ b/RainParseTest.hs @@ -295,9 +295,10 @@ testDataType = ,pass ("sint16",RP.dataType,assertEqual "testDataType 7" A.Int16) ,pass ("sint32",RP.dataType,assertEqual "testDataType 8" A.Int32) ,pass ("sint64",RP.dataType,assertEqual "testDataType 9" A.Int64) - ,fail ("boolean",RP.dataType) - ,fail ("uint24",RP.dataType) - ,fail ("int0",RP.dataType) + ,pass ("boolean",RP.dataType,assertEqual "testDataType 10" $ A.UserDataType $ typeName "boolean") + ,pass ("uint24",RP.dataType,assertEqual "testDataType 11" $ A.UserDataType $ typeName "uint24") + ,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 ("! bool",RP.dataType,assertEqual "testDataType 103" $ A.Chan A.DirOutput nonShared A.Bool) diff --git a/TestUtil.hs b/TestUtil.hs index 49d3b68..5e47122 100644 --- a/TestUtil.hs +++ b/TestUtil.hs @@ -42,6 +42,9 @@ simpleName s = A.Name { A.nameName = s , A.nameMeta = emptyMeta , A.nameType = A procName :: String -> A.Name 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 s = tag3 A.Name DontCare A.VariableName s