source: proto/RE/Python/CanonicalRE.py @ 3603

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

python version of RE compiler

File size: 3.8 KB
Line 
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
88
89def gensym(env, str):
90        if env.has_key(str): 
91                env[str] += 1
92        else:
93                env[str] = 0
94        return str + repr(env[str])
95
96class CodeGen():
97        def __init__(self):
98                self.env = {}
99                self.m = gensym(self.env, "start_marker")
100                self.stmts = [Assign(self.m, All(1))]
101                self.final_marker = self.m
102
103        def gencode(self, expr):
104                if isinstance(expr, CC): 
105                        self.m = gensym(self.env,"marker")
106                        self.stmts.append(Assign(self.m, Advance(And(Var(self.final_marker), CharClass(expr.chars)))))
107                        self.final_marker = self.m
108
109                if isinstance(expr, Seq): 
110                        for re in expr.re_list:
111                                self.gencode(re)
112
113                if isinstance(expr, Alt):
114                        final_marker = self.final_marker
115                        rslt_list = []
116                        for re in expr.re_list:
117                                self.gencode(re)
118                                rslt_list.append(self.final_marker)
119                                self.final_marker = final_marker
120                        self.final_marker = rslt_list[0]
121                        for i in range(len(rslt_list)-1):
122                                self.m = gensym(self.env,"alt_marker")
123                                self.stmts.append(Assign (self.m, Or(Var(self.final_marker), Var(rslt_list[i+1]))))
124                                self.final_marker = self.m
125
126                if isinstance(expr, Rep):
127                        rslt_list = []
128                        for i in range(expr.ub):
129                                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
138
139
140
141
142if __name__ == "__main__":
143        print "*********************TEST*************************"
144        print "Alt([CC(\"ab\"),CC(\"cd\"),CC(\"ef\"),CC(\"gh\")])"
145        code1 = CodeGen()
146        code1.gencode(Alt([CC("ab"),CC("cd"),CC("ef"),CC("gh")]))
147        for stmt in code1.stmts:
148                print stmt.show()
149        print "*********************TEST*************************"
150        print "Rep(CC(\"ab\"), 2, 5)"
151        code2 = CodeGen()
152        code2.gencode(Rep(CC("ab"), 2, 5))
153        for stmt in code2.stmts:
154                print stmt.show()
Note: See TracBrowser for help on using the repository browser.