Fix parsing of memory accesses in tests
authorMichal Terepeta <michal.terepeta@gmail.com>
Sat, 27 Jun 2015 14:32:12 +0000 (16:32 +0200)
committerMichal Terepeta <michal.terepeta@gmail.com>
Tue, 30 Jun 2015 18:57:03 +0000 (20:57 +0200)
Apparently the current parser would fail on any memory accesses, both
loads and stores. In case of the former it's enough to try parsing the
memory accesses before variables. For stores, we can use backtracking
so that we don't consume the initial "m" of memory assignemnt thinking
that it's a variable identifier.

testing/Main.hs
testing/Parse.hs
testing/tests/test5 [new file with mode: 0644]
testing/tests/test5.expected [new file with mode: 0644]

index 8b5d0ca..3728be6 100644 (file)
@@ -30,6 +30,7 @@ goldensTests = Framework.testGroup "Goldens tests"
         , "test2"
         , "test3"
         , "test4"
+        , "test5"
         , "if-test"
         , "if-test2"
         , "if-test3"
index 2d8594d..121734b 100644 (file)
@@ -47,6 +47,9 @@ reservedOp = P.reservedOp lexer
 whitespace :: CharParser () ()
 whitespace = P.whiteSpace lexer
 
+brackets :: CharParser () a -> CharParser () a
+brackets = P.brackets lexer
+
 -- Expressions:
 expr :: Parser Expr
 expr = buildExpressionParser table factor
@@ -60,8 +63,8 @@ expr = buildExpressionParser table factor
     op o f assoc = Infix (do {reservedOp o; return f} <?> "operator") assoc
     factor =   parens expr
            <|> lit
-           <|> fetchVar
            <|> load
+           <|> fetchVar
            <?> "simple Expression"
 
 bool :: Parser Bool
@@ -75,12 +78,7 @@ lit =  (natural >>= (return . Lit . Int))
    <?> "lit"
 
 loc :: Char -> Parser x -> Parser x
-loc s addr = try (lexeme (do { char' s
-                             ; char' '['
-                             ; a <- addr
-                             ; char' ']'
-                             ; return a
-                             }))
+loc s addr = try (lexeme (char' s >> brackets addr))
           <?> "loc"
 
 var :: Parser String
@@ -104,7 +102,7 @@ labl = lexeme (do { id <- identifier
   <?> "label"
 
 mid :: Parser Insn
-mid =   asst
+mid =   try asst
     <|> store
     <?> "assignment or store"
 
diff --git a/testing/tests/test5 b/testing/tests/test5
new file mode 100644 (file)
index 0000000..49423b3
--- /dev/null
@@ -0,0 +1,6 @@
+-- Tests parsing of memory stores and loads.
+procName(mm, aa) {
+L0:
+  m[aa] = m[mm] + m[aa]
+  ret(m[aa])
+}
diff --git a/testing/tests/test5.expected b/testing/tests/test5.expected
new file mode 100644 (file)
index 0000000..49423b3
--- /dev/null
@@ -0,0 +1,6 @@
+-- Tests parsing of memory stores and loads.
+procName(mm, aa) {
+L0:
+  m[aa] = m[mm] + m[aa]
+  ret(m[aa])
+}