2 files changed, 50 insertions(+)
viff/sfdl/grammar.py           |    7 ++++++
viff/test/sfdl/test_grammar.py |   43 ++++++++++++++++++++++++++++++++++++++++


# HG changeset patch
# User Martin Geisler <[EMAIL PROTECTED]>
# Date 1227518473 -3600
# Node ID f10262f030b9a3c42f031b61f82b8da5dcbc5286
# Parent  188dabcb4cdd7efeab8db6d88b26ef81c1348656
Parsing of function declarations, with tests.

diff --git a/viff/sfdl/grammar.py b/viff/sfdl/grammar.py
--- a/viff/sfdl/grammar.py
+++ b/viff/sfdl/grammar.py
@@ -74,6 +74,13 @@
         self.block_stm = block_stm = LCURLY + OneOrMore(stm) + RCURLY
         stm << Group(assign_stm | if_stm | for_stm | block_stm)
 
+        self.func_arg = func_arg = data_type + ident
+        self.func_var_dec = func_var_dec = Keyword("var") + data_type \
+            + Group(delimitedList(ident)) + SCOLON
+        self.func_body = func_body = ZeroOrMore(Group(func_var_dec)) + 
OneOrMore(stm)
+        self.func_dec = func_dec = Keyword("function") + data_type + ident \
+            + LPAREN + Optional(delimitedList(Group(func_arg))) + RPAREN \
+            + LCURLY + func_body + RCURLY
 
         self.program = program = Keyword("program") + ident \
             + LCURLY + RCURLY
diff --git a/viff/test/sfdl/test_grammar.py b/viff/test/sfdl/test_grammar.py
--- a/viff/test/sfdl/test_grammar.py
+++ b/viff/test/sfdl/test_grammar.py
@@ -279,6 +279,49 @@
                              '&&',
                              'z', '[', 'i', ']']]]])
 
+    def test_func_var_dec(self):
+        self.assertParse(self.grammar.func_var_dec, "var Boolean x;",
+                         ['var', 'Boolean', ['x']])
+        self.assertParse(self.grammar.func_var_dec, "var Byte a, b, c;",
+                         ['var', 'Byte', ['a', 'b', 'c']])
+        self.assertNoParse(self.grammar.func_var_dec, "var x;")
+
+    def test_func_body(self):
+        self.assertParse(self.grammar.func_body, "x = 1;", [['x', '1']])
+        self.assertParse(self.grammar.func_body, "var Byte x; x = 1;",
+                         [['var', 'Byte', ['x']], ['x', '1']])
+        self.assertParse(self.grammar.func_body,
+                         "var Byte x; var Boolean y; x = 1;",
+                         [['var', 'Byte', ['x']],
+                          ['var', 'Boolean', ['y']],
+                          ['x', '1']])
+
+        self.assertNoParse(self.grammar.func_body, "")
+        # Function body with no statements:
+        self.assertNoParse(self.grammar.func_body, "var Byte x;")
+
+    def test_func_dec(self):
+        self.assertParse(self.grammar.func_dec,
+                         "function Byte f() { f = 10; }",
+                         ['function', 'Byte', 'f', ['f', '10']])
+        self.assertParse(self.grammar.func_dec,
+                         "function Byte f(Byte x) { f = x+x; }",
+                         ['function', 'Byte', 'f', ['Byte', 'x'],
+                          ['f', ['x', '+', 'x']]])
+
+        self.assertNoParse(self.grammar.func_dec,
+                           "function foo bar f() { f = 10; }")
+        self.assertNoParse(self.grammar.func_dec,
+                           "function f();")
+        self.assertNoParse(self.grammar.func_dec,
+                           """
+                             function void f() {
+                               // Uhh, inner functions?!
+                               function void g() {
+                                 x = 1;
+                               }
+                             }
+                           """)
 
 if SFDLGrammar is None:
     TestGrammar.skip = "Could not import SFDLGrammar, missing pyparsing?"
_______________________________________________
viff-patches mailing list
[email protected]
http://lists.viff.dk/listinfo.cgi/viff-patches-viff.dk

Reply via email to