Exemplo n.º 1
0
 def total_print(self):
     pre('main' in self.defns, 'entry point `main` undefined!')
     ccode = indent(
         main_template.replace('/*TYPE_DEFNS*/',
                               self.render_type_defns()).replace(
                                   '/*FUNCTION_DECLS*/',
                                   self.render_func_decls()).replace(
                                       '/*FUNCTION_IMPLS*/',
                                       self.render_func_impls()))
     return ccode
Exemplo n.º 2
0
 def process_function(self, tree):
     pre(tree.label == 'FUNCTION', 'unexpected tree label')
     header, body = tree.relevant_kids()
     ident, functype = header.relevant_kids()
     arglist, out_type = functype.relevant_kids()
     arg_types_by_nm = {}
     arglist = list(arglist.relevant_kids())
     while arglist:
         judgement = arglist[0]
         argident, argtype = judgement.relevant_kids()
         arg_types_by_nm[argident.get_source()] = argtype.get_source()
         arglist = arglist[1:]
         if arglist:
             arglist = list(arglist[0].relevant_kids())
     return (ident.get_source(), arg_types_by_nm, out_type.get_source(),
             body)
Exemplo n.º 3
0
 def translate_expr(self, tree, types_by_nm):
     expansions = {'or': ' || ', 'and': ' && ', 'not': '!', '+': ' + '}
     ccode = ''.join(((
         lambda s: (expansions[s] if s in expansions else s)
     )(k.strip())) if type(k) == str else ((
         lambda ident:
         ('_{}'.format(ident) if ident in types_by_nm else '_{}'.format(
             ident) if ident in self.globals else self.defns[ident]['cname']
          if ident in self.defns and self.defns[ident]['kind'] == 'function'
          else pre(
              False, '`{}` not declared! (ctxt {})'.format(
                  ident, self.curr_ctxt())))
     )(k.get_source())) if k.label == 'LOWER_IDENT' else (
         (lambda ident: ('_make_{}'.format(ident) if ident in self.defns and
                         self.defns[ident]['alg'] == 'struct' else pre(
                             False, '`{}` not declared! (ctxt {})'.format(
                                 ident, self.curr_ctxt())))
          )(k.get_source())) if k.label == 'UPPER_IDENT' else (
              self.translate_expr(k, types_by_nm)) for k in tree.kids)
     #if tree.label == 'EQ_EXPR':
     #    ccode = '({})'.format(ccode)
     return ccode
Exemplo n.º 4
0
 def final(self):
     return (lambda text:
             (lambda tree:
              (pre(text.is_at_end(), 'failed to parse to end!:{}'.format(
                  text.context())), tree)[1])(self.parsers['MAIN'](text)))
Exemplo n.º 5
0
    def analyze_block(self, tree, types_by_nm={}):
        ''' assume no function defns within
        '''
        # copy:
        types_by_nm = types_by_nm.copy()

        node_stack = list(tree.relevant_kids())
        while node_stack:
            k, node_stack = node_stack[0], node_stack[1:]

            if k.label == 'SKIP':
                pass
            elif k.label == 'ABORT':
                self.write_code('ABORT;')
            elif k.label == 'DECLARATION':
                ident, typename = self.process_declaration(k)
                pre(
                    ident not in types_by_nm and ident not in self.globals,
                    'variable {} already declared as {}!'.format(
                        ident, types_by_nm[ident]
                        if ident in types_by_nm else self.globals[ident]
                        if ident in self.globals else None))
                types_by_nm[ident] = typename

                self.write_code('{} _{};', typename, ident)
            elif k.label == 'ASSIGNMENT':
                lvalue, expr = self.process_assignment(k)
                if lvalue.get_source().strip() == 'return':
                    self.write_code('return {};',
                                    self.translate_expr(expr, types_by_nm))
                else:
                    self.write_code('{} = {};',
                                    self.translate_expr(lvalue, types_by_nm),
                                    self.translate_expr(expr, types_by_nm))
            elif k.label == 'MATCH':
                expr, guardeds = k.relevant_kids()
                expr_type = self.get_type(expr, types_by_nm)
                pre(self.defns[expr_type]['alg'] == 'enum',
                    'can only match on sum types!')
                alternatives = self.defns[expr_type]['child_fields']

                temp_nm = self.fresh_var_nm()
                cond_cons_pairs = self.process_guarded_sequence(guardeds)
                self.write_code('{} {} = {};', expr_type, temp_nm,
                                self.translate_expr(expr, types_by_nm))
                self.write_code('switch ({}.tag) {{', temp_nm)
                for i, (cond, cons) in enumerate(cond_cons_pairs):
                    alt, name = cond.relevant_kids()
                    alt = alt.get_source()
                    name = name.get_source()
                    idx = alternatives.index(alt)
                    self.write_code('case {} /*{}*/ : {{', idx, alt)
                    self.write_code('{} _{} = {}.data.{};',
                                    self.defns[expr_type]['child_types'][idx],
                                    name, temp_nm, alt)
                    self.analyze_block(cons, types_by_nm)
                    self.write_code('}} break;')
                self.write_code('}}')
            elif k.label == 'IF':
                guardeds, = k.relevant_kids()
                cond_cons_pairs = self.process_guarded_sequence(guardeds)
                pre(cond_cons_pairs,
                    'alternative constructs must have at least one branch')
                for i, (cond, cons) in enumerate(cond_cons_pairs):
                    self.write_code(
                        '{} ({}) {{', 'if' if i == 0 else '} else if',
                        self.translate_expr(cond, types_by_nm).strip())
                    self.analyze_block(cons, types_by_nm)
                self.write_code('}} else {{')
                self.write_code('ABORT;')
                self.write_code('}}')
            elif k.label == 'DO':
                cond_cons_pairs = self.process_guarded_sequence(k)
                pre(cond_cons_pairs,
                    'repetitive constructs must have at least one branch')
                self.write_code('while (true) {')
                for i, (cond, cons) in enumerate(cond_cons_pairs):
                    self.write_code(
                        '{} ({}) {{', 'if' if i == 0 else '} else if',
                        self.translate_expr(cond, types_by_nm).strip())
                    self.analyze_block(cons, types_by_nm)
                self.write_code('}} else {{')
                self.write_code('break;')
                self.write_code('}}')
                self.write_code('}}')
            elif k.label == 'TYPE_DEFN':
                self.process_type_defn(k)
            elif k.label == 'FUNCTION':
                ident, arg_types_by_nm, out_type, body = self.process_function(
                    k)
                print(CC + '@R creating ctxt {}...@D '.format(ident))
                self.push_ctxt(ident)
                self.make_defn('function',
                               ident=ident,
                               out_type=out_type,
                               arg_types_by_nm=arg_types_by_nm.copy())
                self.analyze_block(body, arg_types_by_nm)
                self.pop_ctxt()
            elif k.label == 'PRINT':
                ident, = k.relevant_kids()
                ident = ident.get_source()
                pre(
                    ident in types_by_nm,
                    '{} not declared! (print ctxt {})'.format(
                        ident, self.curr_ctxt()))
                typename = types_by_nm[ident]

                if typename == 'Float':
                    self.write_code('printf("{} \\t %f\\n", _{});', ident,
                                    ident)
                elif typename == 'Int':
                    self.write_code('printf("{} \\t %d\\n", _{});', ident,
                                    ident)
                elif typename == 'Bool':
                    self.write_code(
                        'printf("{} \\t %s\\n", _{}?"true":"false");', ident,
                        ident)
                else:
                    pre(False, 'unknown typename!')
            else:
                node_stack = list(k.relevant_kids()) + node_stack

        if self.ctxt_stack:
            for nm in types_by_nm:
                self.destroy(nm, types_by_nm[nm])
Exemplo n.º 6
0
 def process_assignment(self, tree):
     pre(tree.label == 'ASSIGNMENT', 'unexpected tree label')
     lvalue, expr = tree.relevant_kids()
     return lvalue, expr
Exemplo n.º 7
0
     data1 = data1.cuda()
     p = model(data1)
     p = p.cpu()
     s = p.data.numpy()
     P[i] = s
 print('P:' + str(Count))
 print(np.max(P))
 print(np.min(P))
 P[P > 0.5] = 1
 P[P <= 0.5] = 0
 T.append(P)
 pp = P.transpose(1, 2, 0)
 dice1 = dice(pp, y1)
 sen1 = sen(pp, y1)
 spe1 = spe(pp, y1)
 pre1 = pre(pp, y1)
 TolD = TolD + dice1
 TolS = TolS + sen1
 TolP = TolP + spe1
 TolR = TolR + pre1
 print(dice1)
 print(sen1)
 print(spe1)
 print(pre1)
 print(TolD / Count)
 print(TolS / Count)
 print(TolP / Count)
 print(TolR / Count)
 print(s.shape)
 plt.subplot(231)
 plt.imshow(pp[:, :, f[2, 1] - 2], cmap=plt.get_cmap('gray'))