fixing stuff
[dyninst.git] / testsuite / src / specification / parse.py
1 #! /usr/bin/python
2
3 # parse.py
4 #
5 # This program is intended to parse the output from the prolog query,
6 # and output the Makefiles needed to build the tests in the specification.
7
8 from sys import argv, exit
9 import re
10
11 record_str = r"""
12    \[
13    \[(?P<M_name>.+?),(?P<M_src>.+?)\],
14    \[(?P<m_name>.+?),(?P<m_src>.+?)\],
15    (?P<M_comp>.+?),
16    (?P<m_comp>.+?),
17    (?P<plat>.+?),
18    (?P<debug>.+?),
19    (?P<option>.*?)
20    \]$"""
21
22 prog_str = r"""
23    \[
24    (?P<name>.+?),\[(?P<src>.+?)\]
25    \]
26 """
27 record_re = re.compile(record_str, re.VERBOSE)
28 prog_re = re.compile(prog_str, re.VERBOSE)
29 records = []
30
31 def parse_flat_list(str):
32    if ( len(str) < 2 ):
33       print "error: ill formed list: " + str
34       exit(1)
35    return re.compile(",").split(str[1:-1])
36
37 # TODO: The program class is still a little preliminary,
38 #       it needs to incorporate the data from the Test class
39 #       like compiler names and options to actually instatiate
40 #       the Makefile template.
41 #      
42 #       Program is intended as a simplification of the Test class
43 #       to get the implementation right, before working on the
44 #       full thing
45 class Program:
46    '''Stores Mutator Data'''
47
48    so,aout = range(2)
49
50    # soname, dep names, comp name, comp options
51    make_so_template = '''
52    %.so: %s
53         %s %s
54    '''
55
56    # Constructor:
57    # Takes a string from the prolog output and parses
58    def __init__(self,record):
59       match = prog_re.match(record)
60
61       if ( match == None ):
62          print "failed match"
63          print record
64          exit(1)
65
66       self.name = match.group('name')
67       print "Parsing source: " + match.group('src')
68       self.src = parse_flat_list(match.group('src'))
69       self.type = self.so
70
71       print self.name
72       print self.src
73       print self.type
74    
75
76 class Test:
77    "Stores the full test tuple"
78
79    
80    def __init__(self, record):
81       match = record_re.match(record)
82
83       if ( match == None ):
84          print "failed match"
85          print record
86          exit(1)
87
88       self.name = match.group('M_name')
89       self.mutator_src = parse_flat_list(match.group('M_src'))
90       self.m_name = match.group('m_name')
91       self.mutatee_src = parse_flat_list(match.group('m_src'))
92       self.M_comp = match.group('M_comp')
93       self.m_comp = match.group('m_comp')
94       self.plat = match.group('plat')
95       self.debug = match.group('debug')
96       self.option = match.group('option')
97
98       '''
99       print record
100       print self.name
101       print self.mutator_src
102       print self.m_name
103       print self.mutatee_src
104       print self.M_comp
105       print self.m_comp
106       print self.plat
107       print self.debug
108       print self.option
109       print
110       '''
111       
112       
113
114 def parse_record(rec):
115    records.append(Program(rec))
116    
117
118 # Read in the data from 'filename' and parse each tuples in turn, and
119 # add them to the records list.
120 def read_data(filename):
121    bracket_depth = 0
122
123    file = open(filename, 'r')
124    
125    record = ""
126    iter = 0
127    
128    # Read a character at a time and feed it through the simple bracket
129    # counting state machine below to seperate the results into individual
130    # tuples
131    x = file.read(1)
132    while ( x != ""  ):
133       if ( bracket_depth == 0 ):
134          if ( x == "[" ):
135             bracket_depth += 1
136          elif (x == "]" ):
137             bracket_depth -= 1
138          elif (x == "\n"):
139            pass
140          elif (x == ","):
141            pass
142          else:
143             print "error: malformed file1: %s"%(iter)
144             exit(1)
145       elif ( bracket_depth == 1 ):
146          if ( x == "[" ):
147             bracket_depth += 1
148             record = record + x 
149          elif ( x == "]" ):
150             bracket_depth -= 1
151          elif ( x == "," ):
152             pass
153          else:
154             print "error: malformed file2: %s"%(iter)
155             exit(1)
156       elif ( bracket_depth >= 2 ):
157          record = record + x
158          if ( x == "[" ):
159             bracket_depth += 1
160          if ( x == "]" ):
161             bracket_depth -= 1
162             if ( bracket_depth < 2 ):
163                parse_record(record)
164                record = ""
165
166       x = file.read(1)
167       iter += 1
168
169 #   if (bracket_depth != 0):
170 #      print "error: file ended prematurely"
171
172    
173
174 def main():
175    filename = argv[1]
176
177    read_data(filename)
178
179
180 if __name__ == "__main__":
181    main()