aboutsummaryrefslogtreecommitdiff
path: root/ql/ast/visitors/model_generator.py
diff options
context:
space:
mode:
Diffstat (limited to 'ql/ast/visitors/model_generator.py')
-rw-r--r--ql/ast/visitors/model_generator.py39
1 files changed, 39 insertions, 0 deletions
diff --git a/ql/ast/visitors/model_generator.py b/ql/ast/visitors/model_generator.py
new file mode 100644
index 0000000..f2cf5d8
--- /dev/null
+++ b/ql/ast/visitors/model_generator.py
@@ -0,0 +1,39 @@
+from multimethods import multimethod
+
+from gui.model.form import FormModel
+from gui.model.question import QuestionModel
+from ql.ast.nodes.expressions.binary_operators.and_operator import AndOperatorNode
+from ql.ast.nodes.statements.form_statement import FormNode
+from ql.ast.nodes.statements.if_statement import IfNode
+from ql.ast.nodes.statements.question_statement import QuestionNode
+from ql.types.boolean import QLBoolean
+from ql.types.undefined import QLUndefined
+
+
+class ModelGenerator:
+ def __init__(self):
+ self.form = None
+ self.condition = QLBoolean.get_literal_node(True)
+
+ @multimethod(FormNode)
+ def visit(self, node):
+ self.form = FormModel(node.identifier)
+
+ for child in node.block:
+ child.accept(self)
+
+ @multimethod(IfNode)
+ def visit(self, node):
+ previous_condition = self.condition
+ self.condition = AndOperatorNode(None, QLBoolean, self.condition, node.condition, QLUndefined())
+
+ for child in node.block:
+ child.accept(self)
+
+ self.condition = previous_condition
+
+ @multimethod(QuestionNode)
+ def visit(self, node):
+ question_model = QuestionModel(node.label, node.identifier, node.answer_type,
+ node.answer, node.computed, self.condition)
+ self.form.block.append(question_model)