File: Synopsis/Parsers/Cxx/__init__.py 1
2
3
4
5
6
7
8"""Parser for C++ using OpenC++ for low-level parsing.
9This parser is written entirely in C++, and compiled into shared libraries for
10use by python.
11@see C++/Synopsis
12@see C++/SWalker
13"""
14
15from Synopsis.Processor import *
16import ParserImpl
17
18import os, os.path, tempfile
19
20class Parser(Processor):
21
22 preprocess = Parameter(True, 'whether or not to preprocess the input')
23 emulate_compiler = Parameter('', 'a compiler to emulate')
24 compiler_flags = Parameter([], 'list of flags for the emulated compiler')
25 cppflags = Parameter([], 'list of preprocessor flags such as -I or -D')
26 primary_file_only = Parameter(True, 'should only primary file be processed')
27 base_path = Parameter('', 'path prefix to strip off of the file names')
28 sxr_prefix = Parameter(None, 'path prefix (directory) to contain sxr info')
29
30 def process(self, ir, **kwds):
31
32 self.set_parameters(kwds)
33 if not self.input: raise MissingArgument('input')
34 self.ir = ir
35
36 if self.preprocess:
37
38 from Synopsis.Parsers import Cpp
39 cpp = Cpp.Parser(base_path = self.base_path,
40 language = 'C++',
41 flags = self.cppflags,
42 emulate_compiler = self.emulate_compiler,
43 compiler_flags = self.compiler_flags)
44
45 for file in self.input:
46
47 ii_file = file
48 if self.preprocess:
49
50 if self.output:
51 ii_file = os.path.splitext(self.output)[0] + '.ii'
52 else:
53 ii_file = os.path.join(tempfile.gettempdir(),
54 'synopsis-%s.ii'%os.getpid())
55 self.ir = cpp.process(self.ir,
56 cpp_output = ii_file,
57 input = [file],
58 primary_file_only = self.primary_file_only,
59 verbose = self.verbose,
60 debug = self.debug)
61
62 try:
63 self.ir = ParserImpl.parse(self.ir, ii_file,
64 os.path.abspath(file),
65 self.primary_file_only,
66 os.path.abspath(self.base_path) + os.sep,
67 self.sxr_prefix,
68 self.verbose,
69 self.debug)
70 finally:
71 if self.preprocess: os.remove(ii_file)
72
73 return self.output_and_return_ir()
74
Generated on Thu Apr 16 16:27:14 2009 by
synopsis (version devel)