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