summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2024-08-02 00:09:57 +0300
committerEugen Wissner <belka@caraus.de>2024-08-02 00:09:57 +0300
commit5f8d9abe76187669cd7d4f691a2c40db2b4c8a6f (patch)
tree26e9f18c2b73c7533c674070f1df21e2a6ff6268
parentd4471ca2fa765c8c4c4f1e8bec59fc0c441eb824 (diff)
downloadelna-5f8d9abe76187669cd7d4f691a2c40db2b4c8a6f.tar.gz
Require trailing semicolon for type declarations
-rw-r--r--lib/Language/Elna/NameAnalysis.hs1
-rw-r--r--lib/Language/Elna/Parser.hs1
-rw-r--r--tests/Language/Elna/NameAnalysisSpec.hs16
-rw-r--r--tests/Language/Elna/ParserSpec.hs4
4 files changed, 13 insertions, 9 deletions
diff --git a/lib/Language/Elna/NameAnalysis.hs b/lib/Language/Elna/NameAnalysis.hs
index 49b7915..4acde39 100644
--- a/lib/Language/Elna/NameAnalysis.hs
+++ b/lib/Language/Elna/NameAnalysis.hs
@@ -51,7 +51,6 @@ declaration :: SymbolTable -> AST.Declaration -> NameAnalysis SymbolTable
declaration globalTable (AST.TypeDefinition identifier typeExpression)
= flip (SymbolTable.enter identifier) globalTable . TypeInfo
<$> withSymbolTable globalTable (dataType typeExpression)
-
declaration globalTable (AST.ProcedureDefinition identifier _parameters _variables _body) =
let localTable = SymbolTable.empty
in pure $ SymbolTable.enter identifier (ProcedureInfo localTable mempty) globalTable
diff --git a/lib/Language/Elna/Parser.hs b/lib/Language/Elna/Parser.hs
index 23e09d9..cee533e 100644
--- a/lib/Language/Elna/Parser.hs
+++ b/lib/Language/Elna/Parser.hs
@@ -88,6 +88,7 @@ typeDefinitionP :: Parser Declaration
typeDefinitionP = TypeDefinition
<$> (symbol "type" *> identifierP)
<*> (symbol "=" *> typeExpressionP)
+ <* semicolonP
<?> "type definition"
variableDeclarationP :: Parser VariableDeclaration
diff --git a/tests/Language/Elna/NameAnalysisSpec.hs b/tests/Language/Elna/NameAnalysisSpec.hs
index c94e6c7..f0b133e 100644
--- a/tests/Language/Elna/NameAnalysisSpec.hs
+++ b/tests/Language/Elna/NameAnalysisSpec.hs
@@ -4,7 +4,7 @@ module Language.Elna.NameAnalysisSpec
import Data.Text (Text)
import Text.Megaparsec (runParser)
-import Test.Hspec (Spec, describe, it, shouldBe, shouldSatisfy, pendingWith)
+import Test.Hspec (Spec, describe, it, shouldBe, shouldSatisfy)
import Language.Elna.NameAnalysis (Error(..), nameAnalysis)
import Language.Elna.SymbolTable (Info(..), SymbolTable)
import qualified Language.Elna.SymbolTable as SymbolTable
@@ -19,21 +19,21 @@ nameAnalysisOnText sourceText = nameAnalysis
spec :: Spec
spec = describe "nameAnalysis" $ do
it "adds type to the symbol table" $ do
- let given = "type A = int"
+ let given = "type A = int;"
expected = Right $ Just $ TypeInfo intType
actual <- nameAnalysisOnText given
actual `shouldSatisfy` (expected ==) . fmap (SymbolTable.lookup "A")
it "errors when the aliased type is not defined" $ do
- let given = "type A = B"
+ let given = "type A = B;"
expected = Left $ UndefinedTypeError "B"
actual <- nameAnalysisOnText given
actual `shouldBe` expected
it "errors if the aliased identifier is not a type" $ do
- let given = "proc main() {} type A = main"
+ let given = "proc main() {} type A = main;"
expected = Left
$ UnexpectedTypeInfoError
$ ProcedureInfo mempty mempty
@@ -41,5 +41,9 @@ spec = describe "nameAnalysis" $ do
actual `shouldBe` expected
- it "replaces the alias with an equivalent base type" $
- pendingWith "Not implemented"
+ it "replaces the alias with an equivalent base type" $ do
+ let given = "type A = int; type B = A; type C = B;"
+ expected = Right $ Just $ TypeInfo intType
+ actual <- nameAnalysisOnText given
+
+ actual `shouldSatisfy` (expected ==) . fmap (SymbolTable.lookup "C")
diff --git a/tests/Language/Elna/ParserSpec.hs b/tests/Language/Elna/ParserSpec.hs
index c230797..6c91a11 100644
--- a/tests/Language/Elna/ParserSpec.hs
+++ b/tests/Language/Elna/ParserSpec.hs
@@ -25,12 +25,12 @@ spec =
it "parses type definition for a type starting like array" $
let expected = Program [TypeDefinition "t" $ NamedType "arr"]
- actual = parse programP "" "type t = arr"
+ actual = parse programP "" "type t = arr;"
in actual `shouldParse` expected
it "parses array type definition" $
let expected = Program [TypeDefinition "t" $ ArrayType 10 (NamedType "int")]
- actual = parse programP "" "type t = array[10] of int"
+ actual = parse programP "" "type t = array[10] of int;"
in actual `shouldParse` expected
it "parses parameters" $