Source code for pycropml.transpiler.generators.checkGenerator

# coding: utf8
from pycropml.transpiler.codeGenerator import CodeGenerator
from pycropml.transpiler.rules.pythonRules import PythonRules
from pycropml.transpiler.generators.docGenerator import DocGenerator
import os
from pycropml.render_cyml import signature
from path import Path
from pycropml.transpiler.Parser import parser
from pycropml.transpiler.ast_transform import AstTransformer, transform_to_syntax_tree

[docs] class CheckGenerator(CodeGenerator, PythonRules): """This class contains the specific properties of python language and use the NodeVisitor to generate a python code source from a well formed syntax tree. """ def __init__(self, tree, model=None, name = None): CodeGenerator.__init__(self) PythonRules.__init__(self) self.tree=tree self.model=model self.name = name #self.indent_with=' '*4 self.imp=True if self.model: self.doc=DocGenerator(self.model, " ")
[docs] def visit_import(self, node): pass
[docs] def visit_local(self, node): if 'unit' in dir(node): self.write(node.unit) else: self.write(node.name)
[docs] def visit_notAnumber(self, node): pass
[docs] def visit_assignment(self, node): if "value" not in dir(node.value): self.newline(node) self.visit(node.target) self.write(' == ') self.visit(node.value)
[docs] def visit_cond_expr_node(self, node): self.visit(node.true_val) self.visit(node.test) self.visit(node.false_val)
[docs] def visit_if_statement(self, node): self.newline(node) self.visit(node.test) self.body(node.block) while True: else_ = node.otherwise if len(else_) == 0: break elif len(else_) == 1 and else_[0].type=='elseif_statement': self.visit(else_[0]) else: self.visit(else_) break break
[docs] def visit_elseif_statement(self, node): self.newline() self.visit(node.test) self.body(node.block)
[docs] def visit_else_statement(self, node): self.newline() self.body(node.block)
[docs] def visit_float(self, node): self.write(node.value)
[docs] def visit_bool(self, node): self.write(node.value)
[docs] def visit_str(self, node): self.write(node.value)
[docs] def visit_tuple(self, node): pass
[docs] def visit_dict(self, node): pass
[docs] def visit_pair(self, node): pass
[docs] def visit_ExprStatNode(self, node): self.newline(node) self.visit(node.expr)
[docs] def visit_list(self, node): pass
[docs] def visit_datetime(self, node): pass
[docs] def visit_standard_method_call(self, node): l = node.receiver.pseudo_type if isinstance(l, list): l = l[0] z = self.methods[l][node.message] if callable(z): self.visit(z(node)) else: if not node.args: self.write(node.message) self.write('(') self.visit(node.receiver) self.write(')') else: "%s.%s"%(self.visit(node.receiver),self.write(z)) self.write("(") self.comma_separated_list(node.args) self.write(")")
[docs] def visit_custom_call(self, node): self.visit_call(node)
[docs] def visit_index(self, node): pass
[docs] def visit_sliceindex(self, node): pass
[docs] def visit_module(self, node): self.newline(extra=1) self.newline(node) self.write("# coding: utf8") self.newline(node) self.visit(node.body)
[docs] def visit_comparison(self, node): if "value" not in dir(node.right): #self.write('(') self.visit_binary_op(node)
#self.write(')')
[docs] def visit_method_call(self, node): pass
[docs] def visit_binary_op(self, node): op = node.op prec = self.binop_precedence.get(op, 0) self.operator_enter(prec) self.visit(node.left) self.write(u" %s " % self.binary_op[op].replace('_', ' ')) if "type" in dir(node.right): if node.right.type=="binary_op" and node.right.op not in ("+","-") : self.write("(") self.visit(node.right) self.write(")") else: self.visit(node.right) else: self.visit(node.right) self.operator_exit()
[docs] def visit_unary_op(self, node): op = node.operator prec = self.unop_precedence[op] self.operator_enter(prec) self.write(u"%s" % self.unary_op[op]) self.visit(node.value) self.operator_exit()
[docs] def visit_function_definition(self, node): self.body(node.block)
[docs] def visit_implicit_return(self, node): pass
[docs] def visit_declaration(self, node): self.newline(node) for n in node.decl : if 'value' in dir(n) and n.type in ("int", "float"): self.newline(node) self.write(n.name) self.write(" = ") self.write(n.value) elif 'value' in dir(n) and n.type=="bool": self.newline(node) self.write(n.name) self.write(" = ") self.write(str(n.value)) elif 'value' in dir(n) and n.type=="str": self.newline(node) self.write(n.name) self.write(" = ") self.emit_string(n) elif 'elements' in dir(n) and n.type in ("list", "tuple"): self.newline(node) self.write(n.name) self.write(" = ") if n.type=="list": self.visit_list(n) else: self.visit_tuple(n) elif 'args' in dir(n) and n.type=='datetime': self.newline(node) self.write(n.name) self.write(" = datetime") self.visit_datetime elif 'pairs' in dir(n) and n.type=="dict": self.newline(node) self.write(n.name) self.write(" = ") self.visit_dict(n) elif n.type=="array" and 'elements' in dir(n): self.visit_array(n) elif n.type in ("list", "array"): self.newline(node) self.write(n.name) self.write(" = []")
[docs] def visit_array(self,node): self.write(node.name)
[docs] def visit_continuestatnode(self, node): pass
[docs] def visit_breakstatnode(self, node): pass
[docs] def visit_call(self, node): want_comma = [] def write_comma(): if want_comma: self.write(', ') else: want_comma.append(True) if "attrib" in dir(node): self.write(u"%s.%s"%(node.namespace,self.visit(node.function))) else: self.write(self.visit(node.function)) self.write('(') for arg in node.args: write_comma() self.visit(arg) self.write(')')
[docs] def visit_standard_call(self, node): node.function = self.functions[node.namespace][node.function] self.visit_call(node)
[docs] def visit_importfrom(self, node): pass
[docs] def visit_for_statement(self, node): self.newline(node) self.body(node.block)
[docs] def visit_for_iterator_with_index(self, node): pass
[docs] def visit_for_sequence_with_index(self, node): pass
[docs] def visit_for_iterator(self, node): pass
[docs] def visit_for_sequence(self, node): pass
[docs] def visit_for_range_statement(self, node): pass
[docs] def visit_while_statement(self, node): self.visit(node.test) self.body_or_else(node)
[docs] class CheckCompo(CheckGenerator): """ This class used to generates states, rates and auxiliary classes for C# languages. """ def __init__(self, tree, model=None, name=None): self.tree = tree self.model = model self.name = name CheckGenerator.__init__(self,tree, model, self.name)