source: proto/RE/Python/CanonicalRE.py

Last change on this file was 3604, checked in by lindanl, 6 years ago

Add unbounded Rep

File size: 5.1 KB
RevLine 
[3603]1
2
3class RE ():
4        pass
5
6class CC (RE):
7        def __init__(self, chars):
8                self.chars = chars
9
10class Seq(RE):
11        def __init__(self, re_list):
12                self.re_list = re_list
13
14class Alt(RE):
15        def __init__(self, re_list):
16                self.re_list = re_list
17
18class Rep(RE):
19        def __init__(self, re, lb, ub):
20                self.re = re
21                self.lb = lb
22                self.ub = ub
23
24class Start(RE):
25        def __init__(self):
26                pass
27
28class End(RE):
29        def __init__(self):
30                pass
31
32class PabloE:
33   pass
34
35class Var(PabloE):
36    def __init__(self, varname):
37        self.varname = varname
38    def show(self): return 'Var("' + self.varname + '")'
39
40class Not(PabloE):
41    def __init__(self, expr):
42        self.operand = expr
43    def show(self): return 'Not(%s)' % (self.operand.show())
44
45class And(PabloE):
46    def __init__(self, expr1, expr2):
47        self.operand1 = expr1
48        self.operand2 = expr2
49    def show(self): return 'And(%s, %s)' % (self.operand1.show(), self.operand2.show())
50
51class Or(PabloE):
52    def __init__(self, expr1, expr2):
53        self.operand1 = expr1
54        self.operand2 = expr2
55    def show(self): return 'Or(%s, %s)' % (self.operand1.show(), self.operand2.show())
56
57class All(PabloE):
58    def __init__(self, val):
59        self.val = val
60    def show(self): return 'All("' + str(self.val) + '")'
61
62class CharClass(PabloE):
63    def __init__(self, chars):
64        self.chars = chars
65    def show(self): return 'CharClass("' + self.chars + '")'
66
67class Advance(PabloE):
68    def __init__(self, expr):
69        self.expr = expr
70    def show(self): return 'Advance(' + self.expr.show() + ')'
71
72class MatchStar(PabloE):
73    def __init__(self, expr1, expr2):
74        self.operand1 = expr1
75        self.operand2 = expr2
76    def show(self): return 'MatchStar(%s, %s)' % (self.operand1.show(), self.operand2.show())
77
78 
79class PabloS:
80   pass
81
82class Assign(PabloS):
83    def __init__(self, s, expr):
84        self.s = s
85        self.expr = expr
86    def show(self): return 'Assign("%s", %s)' % (self.s, self.expr.show())
87
[3604]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])
[3603]97
[3604]98
[3603]99def gensym(env, str):
100        if env.has_key(str): 
101                env[str] += 1
102        else:
103                env[str] = 0
104        return str + repr(env[str])
105
106class CodeGen():
107        def __init__(self):
108                self.env = {}
109                self.m = gensym(self.env, "start_marker")
110                self.stmts = [Assign(self.m, All(1))]
111                self.final_marker = self.m
112
113        def gencode(self, expr):
114                if isinstance(expr, CC): 
115                        self.m = gensym(self.env,"marker")
116                        self.stmts.append(Assign(self.m, Advance(And(Var(self.final_marker), CharClass(expr.chars)))))
117                        self.final_marker = self.m
118
119                if isinstance(expr, Seq): 
120                        for re in expr.re_list:
121                                self.gencode(re)
122
123                if isinstance(expr, Alt):
124                        final_marker = self.final_marker
125                        rslt_list = []
126                        for re in expr.re_list:
127                                self.gencode(re)
128                                rslt_list.append(self.final_marker)
129                                self.final_marker = final_marker
130                        self.final_marker = rslt_list[0]
131                        for i in range(len(rslt_list)-1):
132                                self.m = gensym(self.env,"alt_marker")
133                                self.stmts.append(Assign (self.m, Or(Var(self.final_marker), Var(rslt_list[i+1]))))
134                                self.final_marker = self.m
135
136                if isinstance(expr, Rep):
137                        rslt_list = []
[3604]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
[3603]150                                self.gencode(expr.re)
[3604]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
[3603]168
169
170
171
172if __name__ == "__main__":
173        print "*********************TEST*************************"
174        print "Alt([CC(\"ab\"),CC(\"cd\"),CC(\"ef\"),CC(\"gh\")])"
175        code1 = CodeGen()
176        code1.gencode(Alt([CC("ab"),CC("cd"),CC("ef"),CC("gh")]))
177        for stmt in code1.stmts:
178                print stmt.show()
179        print "*********************TEST*************************"
180        print "Rep(CC(\"ab\"), 2, 5)"
181        code2 = CodeGen()
182        code2.gencode(Rep(CC("ab"), 2, 5))
183        for stmt in code2.stmts:
184                print stmt.show()
[3604]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 TracBrowser for help on using the repository browser.