diff options
Diffstat (limited to 'ql/ast/visitors/model_generator.py')
| -rw-r--r-- | ql/ast/visitors/model_generator.py | 39 |
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) |