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