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

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

Added conceptual stages.

File size: 4.5 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) prototype code handles with modification to source input stream, ie. srli<1> input stream | pablo<8>.SetValue(0,LF)
22#
23#    pablo.SetValue<8>(integer index, integer value)
24#
25#       b) prototype code handles with modification to pablo.SpanUpTo, pablo.InclusiveSpan, pablo.ExclusiveSpan
26#
27#       c) prototype code handles with 'artificial 1 bit set at 0th byte index'
28#    then OR in a 1-bit at 0th position 'if while' versus 'while'
29#
30#
31# Ken Herdy
32# July 29, 2013
33#
34import sys
35import pablo
36
37class Basis(): 
38        bit_0 = 0
39        bit_1 = 0
40        bit_2 = 0
41        bit_3 = 0
42        bit_4 = 0
43        bit_5 = 0
44        bit_6 = 0
45        bit_7 = 0
46
47class Lex():
48        a  = 0
49        p  = 0
50        l  = 0
51        e  = 0
52        LF = 0
53       
54class Matches():
55        all_matches = 0
56
57class Lines():
58        all_lines = 0
59
60class Output():
61        lines = 0
62
63def ClassifyBytes(basis_bits, lex): 
64        temp1 = (basis_bits.bit_1 &~ basis_bits.bit_0)
65        temp2 = (basis_bits.bit_2 &~ basis_bits.bit_3)
66        temp3 = (temp1 & temp2)
67        temp4 = (basis_bits.bit_4 | basis_bits.bit_5)
68        temp5 = (basis_bits.bit_7 &~ basis_bits.bit_6)
69        temp6 = (temp5 &~ temp4)
70        lex.a = (temp3 & temp6)
71        temp7 = (basis_bits.bit_2 & basis_bits.bit_3)
72        temp8 = (temp1 & temp7)
73        temp9 = (basis_bits.bit_6 | basis_bits.bit_7)
74        temp10 = (temp4 | temp9)
75        lex.p = (temp8 &~ temp10)
76        temp11 = (basis_bits.bit_4 & basis_bits.bit_5)
77        temp12 = (temp11 &~ temp9)
78        lex.l = (temp3 & temp12)
79        temp13 = (basis_bits.bit_5 &~ basis_bits.bit_4)
80        temp14 = (temp13 & temp5)
81        lex.e = (temp3 & temp14)
82        temp15 = (basis_bits.bit_0 | basis_bits.bit_1)
83        temp16 = (basis_bits.bit_2 | basis_bits.bit_3)
84        temp17 = (temp15 | temp16)
85        temp18 = (basis_bits.bit_4 &~ basis_bits.bit_5)
86        temp19 = (basis_bits.bit_6 &~ basis_bits.bit_7)
87        temp20 = (temp18 & temp19)
88        lex.LF = (temp20 &~ temp17)
89       
90def Match(lex, matches):
91        m0 = lex.a
92        m1 = pablo.Advance(m0) & lex.p
93        m2 = pablo.Advance(m1) & lex.p
94        m3 = pablo.Advance(m2) & lex.l
95        m4 = pablo.Advance(m3) & lex.e
96        matches.all_matches = m4
97
98def MatchLines(lex, matches, lines):
99        last_start = 0 # last_start = pablo.First(), last_start = pablo.Mark(0) ?
100        LF_or_match = lex.LF | matches.all_matches
101        cursor = pablo.ScanToFirst(LF_or_match)
102
103        while(pablo.inFile(cursor)):
104                if(cursor & matches.all_matches):
105                        next_end = pablo.AdvanceThenScanTo(cursor, lex.LF)
106                        #next_end = pablo.Advance(cursor)
107                        #next_end = pablo.ScanTo(cursor, lex.LF)
108                        lines.all_lines |= pablo.ExclusiveSpan(last_start, next_end) | next_end
109                        cursor = next_end
110                if(cursor & lex.LF):
111                        last_start = cursor
112                cursor = pablo.AdvanceThenScanTo(cursor, LF_or_match)
113                #cursor = pablo.Advance(cursor)
114                #cursor = pablo.ScanTo(cursor, LF_or_match)
115               
116def FilterMatchLines(u8data, output):
117        output.lines = pablo.filter_bytes(u8data, ~lines.all_lines)
118       
119basis_bits      = Basis()
120lex           = Lex()
121matches     = Matches()
122lines       = Lines()
123output      = Output()
124
125if __name__ == "__main__":
126        #print "Starting ..."
127        if len(sys.argv) > 1:
128
129    # ReadStreamInput(u8data)
130                u8data = pablo.readfile(sys.argv[1]) 
131
132    # PrependLF(u8data)
133
134    # Transpose(u8data, basis)
135                pablo.EOF_mask = pablo.transpose_streams(u8data, basis_bits)
136                ClassifyBytes(basis_bits, lex)
137                Match(lex, matches)
138                MatchLines(lex, matches, lines)
139                FilterMatchLines(u8data, output)
140
141    # WriteStreamOutput(Output)
142                lgth = len(u8data)
143                print "\nstream input data:     \n\n" + u8data
144                print ""
145                print "lex.a                    " + pablo.bitstream2string(lex.a, lgth)
146                print "lex.p                    " + pablo.bitstream2string(lex.p, lgth)
147                print "lex.l                    " + pablo.bitstream2string(lex.l, lgth)
148                print "lex.e                    " + pablo.bitstream2string(lex.e, lgth)
149                print "lex.LF                   " + pablo.bitstream2string(lex.LF, lgth)
150                print "matches.all_matches      " + pablo.bitstream2string(matches.all_matches, lgth)
151                print "lines.all_lines          " + pablo.bitstream2string(lines.all_lines, lgth)
152                print "\nstream output data:    \n\n" + output.lines
153               
154        else:
155                print("Usage: python grep.py <file>")
156       
157
158
Note: See TracBrowser for help on using the repository browser.