annotate python/c3/builder.py @ 281:4496cae24d7f

Improved logview
author Windel Bouwman
date Sat, 02 Nov 2013 11:11:40 +0100
parents e64bae57cda8
children 1c7c1e619be8
rev   line source
254
bd26dc13f270 Added logger
Windel Bouwman
parents: 251
diff changeset
1 import logging
165
598d3888a11c Added front class and fided AST view
Windel Bouwman
parents:
diff changeset
2 import ppci
215
c1ccb1cb4cef Major changes in c3 frontend
Windel Bouwman
parents: 213
diff changeset
3 from . import Parser, TypeChecker, Analyzer, CodeGenerator
225
1c7364bd74c7 Fixed pointer deref
Windel Bouwman
parents: 215
diff changeset
4 from . astprinter import AstPrinter
251
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
5 import glob
165
598d3888a11c Added front class and fided AST view
Windel Bouwman
parents:
diff changeset
6
598d3888a11c Added front class and fided AST view
Windel Bouwman
parents:
diff changeset
7 class Builder:
186
46d62dadd61b Improved testsuite
Windel Bouwman
parents: 168
diff changeset
8 """
46d62dadd61b Improved testsuite
Windel Bouwman
parents: 168
diff changeset
9 Generates IR-code from c3 source.
46d62dadd61b Improved testsuite
Windel Bouwman
parents: 168
diff changeset
10 Reports errors to the diagnostics system
46d62dadd61b Improved testsuite
Windel Bouwman
parents: 168
diff changeset
11 """
46d62dadd61b Improved testsuite
Windel Bouwman
parents: 168
diff changeset
12 def __init__(self, diag):
272
e64bae57cda8 refactor ir
Windel Bouwman
parents: 255
diff changeset
13 self.pack_dir = None
254
bd26dc13f270 Added logger
Windel Bouwman
parents: 251
diff changeset
14 self.logger = logging.getLogger('c3')
226
240111e0456f Work on named types
Windel Bouwman
parents: 225
diff changeset
15 self.diag = diag
240111e0456f Work on named types
Windel Bouwman
parents: 225
diff changeset
16 self.parser = Parser(diag)
240111e0456f Work on named types
Windel Bouwman
parents: 225
diff changeset
17 self.tc = TypeChecker(diag)
240111e0456f Work on named types
Windel Bouwman
parents: 225
diff changeset
18 self.al = Analyzer(diag)
240111e0456f Work on named types
Windel Bouwman
parents: 225
diff changeset
19 self.cg = CodeGenerator()
251
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
20 self.packages = {}
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
21
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
22 def getPackage(self, pname):
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
23 """ package provider for use when analyzing """
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
24 if pname in self.packages:
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
25 return self.packages[pname]
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
26 else:
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
27 # Try to lookup package from file
272
e64bae57cda8 refactor ir
Windel Bouwman
parents: 255
diff changeset
28 fns = glob.glob('./**/{}.c3'.format(pname))
251
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
29 if fns:
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
30 with open(fns[0]) as f:
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
31 src = f.read()
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
32 self.build(src)
272
e64bae57cda8 refactor ir
Windel Bouwman
parents: 255
diff changeset
33 if self.pack_dir:
e64bae57cda8 refactor ir
Windel Bouwman
parents: 255
diff changeset
34 fns = glob.glob('{}/{}.c3'.format(self.pack_dir, pname))
e64bae57cda8 refactor ir
Windel Bouwman
parents: 255
diff changeset
35 if fns:
e64bae57cda8 refactor ir
Windel Bouwman
parents: 255
diff changeset
36 with open(fns[0]) as f:
e64bae57cda8 refactor ir
Windel Bouwman
parents: 255
diff changeset
37 src = f.read()
e64bae57cda8 refactor ir
Windel Bouwman
parents: 255
diff changeset
38 self.build(src)
251
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
39 if pname in self.packages:
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
40 return self.packages[pname]
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
41
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
42 def parse(self, src):
226
240111e0456f Work on named types
Windel Bouwman
parents: 225
diff changeset
43 pkg = self.parser.parseSource(src)
240111e0456f Work on named types
Windel Bouwman
parents: 225
diff changeset
44 if not pkg:
186
46d62dadd61b Improved testsuite
Windel Bouwman
parents: 168
diff changeset
45 return
251
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
46
226
240111e0456f Work on named types
Windel Bouwman
parents: 225
diff changeset
47 # TODO: merge the two below?
240111e0456f Work on named types
Windel Bouwman
parents: 225
diff changeset
48 #AstPrinter().printAst(pkg)
251
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
49 if not self.al.analyzePackage(pkg, self):
186
46d62dadd61b Improved testsuite
Windel Bouwman
parents: 168
diff changeset
50 return
226
240111e0456f Work on named types
Windel Bouwman
parents: 225
diff changeset
51 if not self.tc.checkPackage(pkg):
186
46d62dadd61b Improved testsuite
Windel Bouwman
parents: 168
diff changeset
52 return
194
b01429a5d695 Fixed test
Windel Bouwman
parents: 186
diff changeset
53
251
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
54 # Store for later use:
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
55 self.packages[pkg.name] = pkg
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
56 return pkg
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
57
272
e64bae57cda8 refactor ir
Windel Bouwman
parents: 255
diff changeset
58 def build(self, src, pack_dir=None):
251
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
59 """ Create IR-code from sources """
272
e64bae57cda8 refactor ir
Windel Bouwman
parents: 255
diff changeset
60 self.pack_dir = pack_dir
251
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
61 pkg = self.parse(src)
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
62
226
240111e0456f Work on named types
Windel Bouwman
parents: 225
diff changeset
63 # Only return ircode when everything is OK
251
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
64 if pkg:
6ed3d3a82a63 Added another c3 example. First import attempt
Windel Bouwman
parents: 226
diff changeset
65 return self.cg.gencode(pkg)
165
598d3888a11c Added front class and fided AST view
Windel Bouwman
parents:
diff changeset
66