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

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

Progress towards a compilable grep demo.

File size: 3.9 KB
Line 
1#
2# grep - A very simple 'streams' language example to match lines containing the fixed string 'apple'.
3#
4# grep Program flow.
5#
6# StreamInput (STDIN) -> Transpose -> ClassifyBytes -> Match -> MatchLines -> (FilterMatchLines) -> StreamOutput (STDOUT)
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) insert a start of span marker in the source byte stream
22#       b) push to the problem onto the developer
23#       c) add code to handle this case
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, lex): 
59        temp1 = (basis.bit_1 &~ basis.bit_0)
60        temp2 = (basis.bit_2 &~ basis.bit_3)
61        temp3 = (temp1 & temp2)
62        temp4 = (basis.bit_4 | basis.bit_5)
63        temp5 = (basis.bit_7 &~ basis.bit_6)
64        temp6 = (temp5 &~ temp4)
65        lex.a = (temp3 & temp6)
66        temp7 = (basis.bit_2 & basis.bit_3)
67        temp8 = (temp1 & temp7)
68        temp9 = (basis.bit_6 | basis.bit_7)
69        temp10 = (temp4 | temp9)
70        lex.p = (temp8 &~ temp10)
71        temp11 = (basis.bit_4 & basis.bit_5)
72        temp12 = (temp11 &~ temp9)
73        lex.l = (temp3 & temp12)
74        temp13 = (basis.bit_5 &~ basis.bit_4)
75        temp14 = (temp13 & temp5)
76        lex.e = (temp3 & temp14)
77        temp15 = (basis.bit_0 | basis.bit_1)
78        temp16 = (temp2 &~ temp15)
79        temp17 = (basis.bit_6 & basis.bit_7)
80        temp18 = (temp17 &~ temp4)
81        lex.LF = (temp16 & temp18)
82       
83def Match(lex, matches):
84        m0 = lex.a
85        m1 = pablo.Advance(m0) & lex.p
86        m2 = pablo.Advance(m1) & lex.p
87        m3 = pablo.Advance(m2) & lex.l
88        m4 = pablo.Advance(m3) & lex.e
89        matches.all_matches = m4
90
91def MatchLines(lex, matches, lines):
92        last_start = 0 # last_start = pablo.First(), last_start = pablo.Mark(0) ?
93        LF_or_match = lex.LF | matches.all_matches
94        cursor = pablo.ScanToFirst(LF_or_match)
95
96        while(pablo.inFile(cursor)):
97                if(cursor & matches.all_matches):
98                        next_end = pablo.AdvanceThenScanTo(cursor, lex.LF)
99                        #next_end = pablo.Advance(cursor)
100                        #next_end = pablo.ScanTo(cursor, lex.LF)
101                        lines.all_lines |= pablo.ExclusiveSpan(last_start, next_end) | next_end # e but not s hmmm?
102                        cursor = next_end
103                if(cursor & lex.LF):
104                        last_start = cursor
105                cursor = pablo.AdvanceThenScanTo(cursor, LF_or_match)
106                #cursor = pablo.Advance(cursor)
107                #cursor = pablo.ScanTo(cursor, LF_or_match)
108               
109def FilterMatchLines(u8data, output):
110        output.lines = pablo.filter_bytes(u8data, ~lines.all_lines)
111       
112
113
114basis   = Basis()
115lex     = Lex()
116matches = Matches()
117lines   = Lines()
118output  = Output()
119
120if __name__ == "__main__":
121        #print "Starting ..."
122        if len(sys.argv) > 1:
123                u8data = pablo.readfile(sys.argv[1]) 
124                pablo.EOF_mask = pablo.transpose_streams(u8data, basis)
125                ClassifyBytes(basis, lex)
126                Match(lex, matches)
127                MatchLines(lex, matches, lines)
128                FilterMatchLines(u8data, output)
129
130                lgth = len(u8data)
131                print "stream input data:       " + u8data
132                print "lex.a                    " + pablo.bitstream2string(lex.a, lgth)
133                print "lex.p                    " + pablo.bitstream2string(lex.p, lgth)
134                print "lex.l                    " + pablo.bitstream2string(lex.l, lgth)
135                print "lex.e                    " + pablo.bitstream2string(lex.e, lgth)
136                print "lex.LF                   " + pablo.bitstream2string(lex.LF, lgth)
137                print "matches.all_matches      " + pablo.bitstream2string(matches.all_matches, lgth)
138                print "lines.all_lines          " + pablo.bitstream2string(lines.all_lines, lgth)
139                print "stream output data       " + output.lines
140               
141        else:
142                print("Usage: python grep.py <file>")
143       
144
145
Note: See TracBrowser for help on using the repository browser.