Changeset 3604


Ignore:
Timestamp:
Jan 8, 2014, 3:02:56 PM (6 years ago)
Author:
lindanl
Message:

Add unbounded Rep

File:
1 edited

Legend:

Unmodified
Added
Removed
  • proto/RE/Python/CanonicalRE.py

    r3603 r3604  
    8686    def show(self): return 'Assign("%s", %s)' % (self.s, self.expr.show())
    8787
     88class While(PabloS):
     89    def __init__(self, expr, S):
     90        self.expr = expr
     91        self.S = S
     92    def show(self):
     93        stmts = ""
     94        for stmt in self.S:
     95                stmts = stmts + stmt.show() + ", "
     96        return 'While(%s, [%s])' % (self.expr.show(), stmts[:-2])
     97
    8898
    8999def gensym(env, str):
     
    126136                if isinstance(expr, Rep):
    127137                        rslt_list = []
    128                         for i in range(expr.ub):
     138                        if expr.ub == "unbounded":
     139                                for i in range(expr.lb):
     140                                        self.gencode(expr.re)
     141                                        rslt_list.append(self.final_marker)
     142                                self.m = gensym(self.env,"while_test")
     143                                while_test = self.m
     144                                self.stmts.append(Assign (self.m, Var(self.final_marker)))
     145                                self.m = gensym(self.env,"while_accum")
     146                                while_accum = self.m
     147                                self.stmts.append(Assign (self.m, Var(self.final_marker)))
     148                                num_of_stmts = len(self.stmts)
     149                                self.final_marker = while_test
    129150                                self.gencode(expr.re)
    130                                 rslt_list.append(self.final_marker)
    131                         i = expr.lb
    132                         self.final_marker = rslt_list[0]
    133                         while  (i <= expr.ub):
    134                                 self.m = gensym(self.env,"alt_marker")
    135                                 self.stmts.append(Assign (self.m, Or(Var(self.final_marker), Var(rslt_list[i-1]))))
    136                                 self.final_marker = self.m
    137                                 i = i+1
     151                                while_stmts = self.stmts[num_of_stmts:]
     152                                self.stmts = self.stmts[:num_of_stmts]
     153                                while_stmts.append(Assign (while_test, And (Var(self.final_marker),Not (Var(while_accum)))))
     154                                while_stmts.append(Assign (while_accum,Or (Var(while_accum),Var(self.final_marker))))
     155                                self.stmts.append(While (Var(while_test), while_stmts))
     156                                self.final_marker = while_accum
     157                        else:
     158                                for i in range(expr.ub):
     159                                        self.gencode(expr.re)
     160                                        rslt_list.append(self.final_marker)
     161                                i = expr.lb
     162                                self.final_marker = rslt_list[0]
     163                                while  (i <= expr.ub):
     164                                        self.m = gensym(self.env,"alt_marker")
     165                                        self.stmts.append(Assign (self.m, Or(Var(self.final_marker), Var(rslt_list[i-1]))))
     166                                        self.final_marker = self.m
     167                                        i = i+1
    138168
    139169
     
    153183        for stmt in code2.stmts:
    154184                print stmt.show()
     185        print "*********************TEST*************************"
     186        print "Rep(CC(\"ab\"), 2, unbounded)"
     187        code3 = CodeGen()
     188        code3.gencode(Rep(Seq([CC("ab"),CC("cd")]), 2, "unbounded"))
     189        for stmt in code3.stmts:
     190                print stmt.show()
Note: See TracChangeset for help on using the changeset viewer.