Changeset 972
- Timestamp:
- Jun 24, 2012 11:39:20 PM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
specdomain/trunk/src/specdomain/sphinxcontrib/specmacrofileparser.py
r966 r972 37 37 extended_comment_match = r'(' + extended_comment_marker + r')' 38 38 39 macro_sig_re = re.compile( 40 r'''^ ([a-zA-Z_]\w*) # macro name 41 ''', re.VERBOSE) 42 43 func_sig_re = re.compile(word_match + r'\(' 44 + r'(' + match_all + r')' 45 + r'\)', 46 re.IGNORECASE|re.DOTALL) 47 48 cdef_name_sig_re = re.compile(double_quote_string_match, 49 re.IGNORECASE|re.DOTALL) 50 51 52 extended_comment_flag_sig_re = re.compile(extended_comment_marker, 53 re.IGNORECASE|re.DOTALL) 54 extended_comment_start_sig_re = re.compile(string_start 55 + non_greedy_whitespace 56 + extended_comment_match, 57 re.IGNORECASE|re.VERBOSE) 58 extended_comment_end_sig_re = re.compile(non_greedy_whitespace 59 + extended_comment_match 60 + non_greedy_whitespace 61 + r'#' + non_greedy_filler 62 + string_end, 63 re.IGNORECASE|re.VERBOSE) 64 extended_comment_block_sig_re = re.compile(string_start 65 + non_greedy_whitespace 66 + extended_comment_marker 67 + r'(' + non_greedy_filler + r')' 68 + extended_comment_marker 69 + non_greedy_filler 70 + string_end, 71 re.IGNORECASE|re.DOTALL|re.MULTILINE) 72 lgc_variable_sig_re = re.compile(string_start 73 + non_greedy_whitespace 74 + r'(local|global|constant)' 75 + r'((?:,?\s*@?[\w.eE+-]+\[?\]?)*)' 76 + non_greedy_whitespace 77 + r'#' + non_greedy_filler 78 + string_end, 79 re.VERBOSE) 39 # macro_sig_re = re.compile( 40 # r'''^ ([a-zA-Z_]\w*) # macro name 41 # ''', re.VERBOSE) 42 # 43 # func_sig_re = re.compile(word_match + r'\(' 44 # + r'(' + match_all + r')' 45 # + r'\)', 46 # re.IGNORECASE|re.DOTALL) 47 # 48 # cdef_name_sig_re = re.compile(double_quote_string_match, 49 # re.IGNORECASE|re.DOTALL) 50 # 51 # 52 # extended_comment_flag_sig_re = re.compile(extended_comment_marker, 53 # re.IGNORECASE|re.DOTALL) 80 54 81 55 # TODO: handle "#: " indicating a description of a variable on the preceding line … … 92 66 The first and simplest thing to do is to read the .mac file and only extract 93 67 all the extended comments and add them as nodes to the current document. 68 69 Assume macro definitions are not nested (but test for this). 94 70 95 71 An additional step would be to parse for: … … 111 87 'rdef macro', # inside a multiline rdef macro definition 112 88 'cdef macro', # inside a multiline cdef macro definition 89 'parsed', # parsing of file is complete 113 90 ) 114 91 … … 143 120 self.state_stack = [] 144 121 for line in self.buf.split('\n'): 145 m = None 122 123 line_number += 1 146 124 if self.state not in self.states: 147 raise RuntimeError, "unexpected parser state: " + self.state 148 line_number += 1 125 # this quickly points out a programmer error 126 msg = "unexpected parser state: %s, line %s" % (self.state, line_number) 127 raise RuntimeError, msg 128 149 129 if self.state == 'global': 150 151 130 if self._is_lgc_variable(line, line_number): 152 131 continue 153 154 132 if self._is_one_line_extended_comment(line, line_number): 155 133 continue 156 157 134 if self._is_multiline_start_extended_comment(line, line_number): 158 135 continue 159 160 136 elif self.state == 'extended comment': 161 162 137 if not self._is_multiline_end_extended_comment(line, line_number): 163 138 # multiline extended comment continues 164 139 self.ec['text'].append(line) 165 140 continue 166 167 141 elif self.state == 'def macro': 168 142 pass 169 170 143 elif self.state == 'cdef macro': 171 144 pass 172 173 145 elif self.state == 'rdef macro': 174 146 pass 175 147 148 if len(self.state_stack) > 0: 149 fmt = "encountered EOF while parsing %s, line %d, in state %s, stack=%s" 150 msg = fmt % (self.filename, line_number, self.state, self.state_stack) 151 raise RuntimeWarning, msg 152 153 self.state = 'parsed' 154 155 lgc_variable_sig_re = re.compile(string_start 156 + non_greedy_whitespace 157 + r'(local|global|constant)' 158 + r'((?:,?\s*@?[\w.eE+-]+\[?\]?)*)' 159 + non_greedy_whitespace 160 + r'#' + non_greedy_filler 161 + string_end, 162 re.VERBOSE) 163 176 164 def _is_lgc_variable(self, line, line_number): 177 165 ''' local, global, or constant variable declaration ''' 178 m = self._ match(lgc_variable_sig_re, line)166 m = self._search(self.lgc_variable_sig_re, line) 179 167 if m is None: 180 168 return False 181 objtype, args = lgc_variable_sig_re.match(line).groups() 169 170 objtype, args = self.lgc_variable_sig_re.match(line).groups() 182 171 pos = args.find('#') 183 172 if pos > -1: … … 193 182 # TODO: consider not indexing "global" inside a def 194 183 # TODO: consider not indexing "local" at global level 184 # or leave these decisions for later, including some kind of analyzer 195 185 for var in args.split(): 196 186 m['text'] = var.rstrip(',') … … 199 189 return True 200 190 191 extended_comment_block_sig_re = re.compile(string_start 192 + non_greedy_whitespace 193 + extended_comment_marker 194 + r'(' + non_greedy_filler + r')' 195 + extended_comment_marker 196 + non_greedy_filler 197 + string_end, 198 re.IGNORECASE|re.DOTALL|re.MULTILINE) 199 201 200 def _is_one_line_extended_comment(self, line, line_number): 202 m = self._ match(extended_comment_block_sig_re, line)201 m = self._search(self.extended_comment_block_sig_re, line) 203 202 if m is None: 204 203 return False … … 209 208 self.findings.append(dict(m)) 210 209 return True 210 extended_comment_start_sig_re = re.compile(string_start 211 + non_greedy_whitespace 212 + extended_comment_match, 213 re.IGNORECASE|re.VERBOSE) 211 214 212 215 def _is_multiline_start_extended_comment(self, line, line_number): 213 m = self._ match(extended_comment_start_sig_re, line)216 m = self._search(self.extended_comment_start_sig_re, line) 214 217 if m is None: 215 218 return False … … 224 227 return True 225 228 229 extended_comment_end_sig_re = re.compile(non_greedy_whitespace 230 + extended_comment_match 231 + non_greedy_whitespace 232 + r'#' + non_greedy_filler 233 + string_end, 234 re.IGNORECASE|re.VERBOSE) 235 226 236 def _is_multiline_end_extended_comment(self, line, line_number): 227 m = self._ match(extended_comment_end_sig_re, line)237 m = self._search(self.extended_comment_end_sig_re, line) 228 238 if m is None: 229 239 return False … … 237 247 return True 238 248 239 def _match(self, regexp, line): 249 def _search(self, regexp, line): 250 '''regular expression search of line, returns a match as a dictionary or None''' 240 251 m = regexp.search(line) 241 252 if m is None: 242 253 return None 254 # TODO: define a parent key somehow 243 255 d = { 244 256 'start': m.start(1), … … 266 278 def ReST(self): 267 279 """create the ReStructured Text from what has been found""" 280 if self.state == 'parsed': 281 raise RuntimeWarning, "state = %s, should be 'parsed'" % self.filename 282 268 283 s = [] 269 284 declarations = [] … … 282 297 if len(declarations) > 0: 283 298 col_keys = ('text', 'objtype', 'start_line', 'end_line', ) 284 widths = {} 285 for key in col_keys: 286 widths[key] = len( str(key) ) 299 widths = dict([( key, len(str(key)) ) for key in col_keys]) 287 300 for d in declarations: 288 for key, w in widths.items(): 289 widths[key] = max(w, len( str(d[key]) ) ) 301 widths = dict([( key, max(w, len(str(d[key])))) for key, w in widths.items()]) 290 302 separator = " ".join( ["="*widths[key] for key in col_keys] ) 291 f ormat = " ".join( ["%%-%ds"%widths[key] for key in col_keys] )303 fmt = " ".join( ["%%-%ds"%widths[key] for key in col_keys] ) 292 304 s.append( '' ) 293 s.append( '.. rubric:: Variable Declarations:' ) 305 # s.append( '.. rubric:: Variable Declarations:' ) 306 s.append( 'Variable Declarations' ) 307 s.append( '=====================' ) 294 308 s.append( '' ) 295 309 s.append( separator ) 296 #s.append( " ".join( [str(key) for key in col_keys]) ) 297 s.append( format % tuple([str(key) for key in col_keys]) ) 310 s.append( fmt % tuple([str(key) for key in col_keys]) ) 298 311 s.append( separator ) 299 312 for d in declarations: 300 s.append( f ormat % tuple([str(d[key]) for key in col_keys]) )313 s.append( fmt % tuple([str(d[key]) for key in col_keys]) ) 301 314 s.append( separator ) 302 315 return '\n'.join(s)
Note: See TracChangeset
for help on using the changeset viewer.