source: proto/RE/demo/grep.py @ 3416

Last change on this file since 3416 was 3416, checked in by ksherdy, 6 years ago

Updated demo.

File size: 4.0 KB
Line 
1#
2# grep - A very simple example to match lines containing the fixed string 'apple'.
3#
4# grep Program flow.
5#
6# StreamInput -> PrependLF -> Transpose -> ClassifyBytes -> Match -> MatchLines -> (FilterMatchLines) -> StreamOutput
7#                                                                     
8# Notes/Observations:
9#
10# 1) Both sequential and parallel work is performed.
11#   
12#       For example,
13#       
14#       a) sequential iteration over the matches and line feed streams in the 'Match' routine
15#       b) sequential and/or parallel output of marked lines in the 'CompressLines' / 'WriteLines' routine     
16#
17# 2) Creation of spans are problematic at the start of streams.
18#
19#       Potential solutions:
20#
21#       a) manipulate source input stream, ie. prepend LF
22#       b) compiler code handles
23#       c) developer code handles (shift both
24#
25#
26# Ken Herdy
27# July 29, 2013
28#
29import sys
30import pablo
31
32class Basis(): 
33        bit_0 = 0
34        bit_1 = 0
35        bit_2 = 0
36        bit_3 = 0
37        bit_4 = 0
38        bit_5 = 0
39        bit_6 = 0
40        bit_7 = 0
41
42class Lex():
43        a  = 0
44        p  = 0
45        l  = 0
46        e  = 0
47        LF = 0
48       
49class Matches():
50        all_matches = 0
51
52class Lines():
53        all_lines = 0
54
55class Output():
56        lines = 0
57
58def ClassifyBytes(basis_bits, lex): 
59        temp1 = (basis_bits.bit_1 &~ basis_bits.bit_0)
60        temp2 = (basis_bits.bit_2 &~ basis_bits.bit_3)
61        temp3 = (temp1 & temp2)
62        temp4 = (basis_bits.bit_4 | basis_bits.bit_5)
63        temp5 = (basis_bits.bit_7 &~ basis_bits.bit_6)
64        temp6 = (temp5 &~ temp4)
65        lex.a = (temp3 & temp6)
66        temp7 = (basis_bits.bit_2 & basis_bits.bit_3)
67        temp8 = (temp1 & temp7)
68        temp9 = (basis_bits.bit_6 | basis_bits.bit_7)
69        temp10 = (temp4 | temp9)
70        lex.p = (temp8 &~ temp10)
71        temp11 = (basis_bits.bit_4 & basis_bits.bit_5)
72        temp12 = (temp11 &~ temp9)
73        lex.l = (temp3 & temp12)
74        temp13 = (basis_bits.bit_5 &~ basis_bits.bit_4)
75        temp14 = (temp13 & temp5)
76        lex.e = (temp3 & temp14)
77        temp15 = (basis_bits.bit_0 | basis_bits.bit_1)
78        temp16 = (basis_bits.bit_2 | basis_bits.bit_3)
79        temp17 = (temp15 | temp16)
80        temp18 = (basis_bits.bit_4 &~ basis_bits.bit_5)
81        temp19 = (basis_bits.bit_6 &~ basis_bits.bit_7)
82        temp20 = (temp18 & temp19)
83        lex.LF = (temp20 &~ temp17)
84       
85def Match(lex, matches):
86        m0 = lex.a
87        m1 = pablo.Advance(m0) & lex.p
88        m2 = pablo.Advance(m1) & lex.p
89        m3 = pablo.Advance(m2) & lex.l
90        m4 = pablo.Advance(m3) & lex.e
91        matches.all_matches = m4
92
93def MatchLines(lex, matches, lines):
94        last_start = 0 # last_start = pablo.First(), last_start = pablo.Mark(0) ?
95        LF_or_match = lex.LF | matches.all_matches
96        cursor = pablo.ScanToFirst(LF_or_match)
97
98        while(pablo.inFile(cursor)):
99                if(cursor & matches.all_matches):
100                        next_end = pablo.AdvanceThenScanTo(cursor, lex.LF)
101                        #next_end = pablo.Advance(cursor)
102                        #next_end = pablo.ScanTo(cursor, lex.LF)
103                        lines.all_lines |= pablo.ExclusiveSpan(last_start, next_end) | next_end # e but not s hmmm?
104                        cursor = next_end
105                if(cursor & lex.LF):
106                        last_start = cursor
107                cursor = pablo.AdvanceThenScanTo(cursor, LF_or_match)
108                #cursor = pablo.Advance(cursor)
109                #cursor = pablo.ScanTo(cursor, LF_or_match)
110               
111def FilterMatchLines(u8data, output):
112        output.lines = pablo.filter_bytes(u8data, ~lines.all_lines)
113       
114
115
116basis   = Basis()
117lex     = Lex()
118matches = Matches()
119lines   = Lines()
120output  = Output()
121
122if __name__ == "__main__":
123        #print "Starting ..."
124        if len(sys.argv) > 1:
125                u8data = pablo.readfile(sys.argv[1]) 
126                pablo.EOF_mask = pablo.transpose_streams(u8data, basis)
127                ClassifyBytes(basis, lex)
128                Match(lex, matches)
129                MatchLines(lex, matches, lines)
130                FilterMatchLines(u8data, output)
131
132                lgth = len(u8data)
133                print "\nstream input data:     \n\n" + u8data
134                print ""
135                print "lex.a                    " + pablo.bitstream2string(lex.a, lgth)
136                print "lex.p                    " + pablo.bitstream2string(lex.p, lgth)
137                print "lex.l                    " + pablo.bitstream2string(lex.l, lgth)
138                print "lex.e                    " + pablo.bitstream2string(lex.e, lgth)
139                print "lex.LF                   " + pablo.bitstream2string(lex.LF, lgth)
140                print "matches.all_matches      " + pablo.bitstream2string(matches.all_matches, lgth)
141                print "lines.all_lines          " + pablo.bitstream2string(lines.all_lines, lgth)
142                print "\nstream output data:    \n\n" + output.lines
143               
144        else:
145                print("Usage: python grep.py <file>")
146       
147
148
Note: See TracBrowser for help on using the repository browser.