def __init__(self, options): self.preprocessor_parser = preprocessor.PreprocessorParser( options, self) self.parser = yacc.Parser() prototype = yacc.yacc(method='LALR', debug=False, module=cgrammar, write_tables=True, outputdir=os.path.dirname(__file__), optimize=True) # If yacc is reading tables from a file, then it won't find the error # function... need to set it manually prototype.errorfunc = cgrammar.p_error prototype.init_parser(self.parser) self.parser.cparser = self self.lexer = CLexer(self) if not options.no_stddef_types: self.lexer.type_names.add('wchar_t') self.lexer.type_names.add('ptrdiff_t') self.lexer.type_names.add('size_t') if not options.no_gnu_types: self.lexer.type_names.add('__builtin_va_list') if sys.platform == 'win32' and not options.no_python_types: self.lexer.type_names.add('__int64')
def get_cached_tokens(self, header): '''Return a list of tokens for `header`. If there is no cached copy, return None. ''' try: now = os.stat(header).st_mtime except OSError: now = time.time() current_memento = self.preprocessor_parser.get_memento() if header in self.header_cache: timestamp, memento, tokens, namespace = self.header_cache[header] if self.preprocessor_parser.system_headers: self.handle_status('Not using cached header "%s" because ' \ 'of overridden system_headers.' % header) elif now < timestamp: self.handle_status('Not using cached header "%s" because ' \ 'cached copy is stale.' % header) elif memento != current_memento: self.handle_status('Not using cached header "%s" because ' \ 'memento differs.' % header) else: self.handle_status('Using cached header "%s"' % header) self.preprocessor_parser.namespace = namespace return tokens if self.cache_headers and not self.preprocessor_parser.system_headers: self.handle_status('Caching header "%s"' % header) self.cache_headers = False ppp = preprocessor.PreprocessorParser() ppp.include_path = self.preprocessor_parser.include_path ppp.parse(filename=header, namespace=self.preprocessor_parser.namespace) self.header_cache[header] = (now, current_memento, ppp.output, ppp.namespace.copy()) self.save_header_cache() self.cache_headers = True return ppp.output return None