Browse Source

Got Example 7 from Day & Atlee working!

Joeri Exelmans 5 years ago
parent
commit
09cc364711

+ 3 - 1
src/sccd/parser/statechart_parser.py

@@ -10,7 +10,9 @@ class SkipFile(Exception):
 
 
 _blank_eval_context = EvalContext(current_state=None, events=[], memory=None)
 _blank_eval_context = EvalContext(current_state=None, events=[], memory=None)
 
 
-def create_statechart_parser(globals, src_file, load_external = True) -> Rules:
+parse_f = functools.partial(parse, decorate_exceptions=(StaticTypeError,))
+
+def create_statechart_parser(globals, src_file, load_external = True, parse = parse_f) -> Rules:
   def parse_statechart(el):
   def parse_statechart(el):
     ext_file = el.get("src")
     ext_file = el.get("src")
     if ext_file is None:
     if ext_file is None:

+ 4 - 2
test/lib/test.py

@@ -1,4 +1,5 @@
 import unittest
 import unittest
+import functools
 from dataclasses import *
 from dataclasses import *
 from sccd.model.model import *
 from sccd.model.model import *
 from sccd.controller.controller import *
 from sccd.controller.controller import *
@@ -16,9 +17,10 @@ class Test(unittest.TestCase):
     return self.src
     return self.src
 
 
   def runTest(self):
   def runTest(self):
-    parser = create_test_parser(self.src)
+    statechart_parser = functools.partial(create_statechart_parser, src_file=self.src)
+    test_parser = create_test_parser(statechart_parser)
     try:
     try:
-      test_variants = parse(self.src, parser, decorate_exceptions=(StaticTypeError))
+      test_variants = parse_f(self.src, test_parser)
     except Exception as e:
     except Exception as e:
       print_debug(e)
       print_debug(e)
       raise e
       raise e

+ 17 - 22
test/lib/test_parser.py

@@ -11,26 +11,18 @@ class TestVariant:
   input: list
   input: list
   output: list
   output: list
 
 
-def create_test_parser(src_file, load_external = True):
+def create_test_parser(create_statechart_parser):
   globals = Globals(fixed_delta=None)
   globals = Globals(fixed_delta=None)
-  statechart_parser = create_statechart_parser(globals, src_file, load_external)
+  statechart_parser = create_statechart_parser(globals)
   input = []
   input = []
   output = []
   output = []
 
 
   def parse_test(el):
   def parse_test(el):
     def parse_input(el):
     def parse_input(el):
       def parse_input_event(el):
       def parse_input_event(el):
-        name = el.get("name")
-        port = el.get("port")
-        time = el.get("time")
-
-        if name is None:
-          raise XmlError("missing attribute 'name'")
-        if port is None:
-          raise XmlError("missing attribute 'port'")
-        if time is None:
-          raise XmlError("missing attribute 'time'")
-
+        name = require_attribute(el, "name")
+        port = require_attribute(el, "port")
+        time = require_attribute(el, "time")
         duration = parse_duration(globals, time)
         duration = parse_duration(globals, time)
         input.append(InputEvent(name=name, port=port, params=[], time_offset=duration))
         input.append(InputEvent(name=name, port=port, params=[], time_offset=duration))
 
 
@@ -42,15 +34,18 @@ def create_test_parser(src_file, load_external = True):
         output.append(big_step)
         output.append(big_step)
 
 
         def parse_output_event(el):
         def parse_output_event(el):
-          name = el.get("name")
-          port = el.get("port")
-
-          if name is None:
-            raise XmlError("missing attribute 'name'")
-          if port is None:
-            raise XmlError("missing attribute 'port'")
-
-          big_step.append(Event(id=0, name=name, port=port, params=[]))
+          name = require_attribute(el, "name")
+          port = require_attribute(el, "port")
+          params = []
+          big_step.append(Event(id=0, name=name, port=port, params=params))
+
+          def parse_param(el):
+            val_text = require_attribute(el, "val")
+            val_expr = parse_expression(globals, val_text)
+            val = val_expr.eval(EvalContext(current_state=None, events=[], memory=None))
+            params.append(val)
+
+          return [("param*", parse_param)]
 
 
         return [("event+", parse_output_event)]
         return [("event+", parse_output_event)]
 
 

+ 4 - 11
test/test_files/day_atlee/statechart_fig1_redialer.xml

@@ -13,7 +13,9 @@
     <var id="p" expr="0"/>
     <var id="p" expr="0"/>
 
 
     <func id="digit(i:int, pos:int)">
     <func id="digit(i:int, pos:int)">
-      return i // 10**pos % 10;
+      result = i // 10**pos % 10;
+      log("digit " + int_to_str(pos) + " of " + int_to_str(i) + " is " + int_to_str(result));
+      return result;
     </func>
     </func>
 
 
     <func id="numdigits(i:int)">
     <func id="numdigits(i:int)">
@@ -70,9 +72,6 @@
           <transition event="redial" cond="c == 0" target="../RedialDigits">
           <transition event="redial" cond="c == 0" target="../RedialDigits">
             <code>
             <code>
               p = lp;
               p = lp;
-              log("p:  " + int_to_str(p));
-              log("lp: " + int_to_str(lp));
-              log("c:  " + int_to_str(c));
             </code>
             </code>
             <raise event="dial">
             <raise event="dial">
               <param expr="digit(lp, 0)"/>
               <param expr="digit(lp, 0)"/>
@@ -80,16 +79,10 @@
           </transition>
           </transition>
         </state>
         </state>
         <state id="RedialDigits">
         <state id="RedialDigits">
-          <onentry>
-            <code>
-              log("p: " + int_to_str(p));
-              log("lp: " + int_to_str(lp));
-            </code>
-          </onentry>
           <!-- t6 -->
           <!-- t6 -->
           <transition cond="c &lt; numdigits(p)" target=".">
           <transition cond="c &lt; numdigits(p)" target=".">
             <raise event="dial">
             <raise event="dial">
-              <param expr="digit(p, c+1)"/>
+              <param expr="digit(p, c)"/>
             </raise>
             </raise>
           </transition>
           </transition>
           <!-- t7 -->
           <!-- t7 -->

+ 30 - 1
test/test_files/day_atlee/test_07_redialer_same.xml

@@ -11,7 +11,36 @@
 
 
   <output>
   <output>
     <big_step>
     <big_step>
-      <event port="out" name="done"/>
+      <event port="out" name="out">
+        <param val="0"/>
+      </event>
+      <event port="out" name="out">
+        <param val="9"/>
+      </event>
+      <event port="out" name="out">
+        <param val="8"/>
+      </event>
+      <event port="out" name="out">
+        <param val="7"/>
+      </event>
+      <event port="out" name="out">
+        <param val="6"/>
+      </event>
+      <event port="out" name="out">
+        <param val="5"/>
+      </event>
+      <event port="out" name="out">
+        <param val="4"/>
+      </event>
+      <event port="out" name="out">
+        <param val="3"/>
+      </event>
+      <event port="out" name="out">
+        <param val="2"/>
+      </event>
+      <event port="out" name="out">
+        <param val="1"/>
+      </event>
     </big_step>
     </big_step>
   </output>
   </output>
 </test>
 </test>