comparison python/c3/builder.py @ 287:1c7c1e619be8

File movage
author Windel Bouwman
date Thu, 21 Nov 2013 11:57:27 +0100
parents e64bae57cda8
children a747a45dcd78
comparison
equal deleted inserted replaced
286:d9df72971cbf 287:1c7c1e619be8
1 import logging 1 import logging
2 import ppci 2 import ppci
3 from . import Parser, TypeChecker, Analyzer, CodeGenerator 3 from . import Parser, TypeChecker, Analyzer, CodeGenerator
4 from . astprinter import AstPrinter 4 from . astprinter import AstPrinter
5 import glob 5 import glob
6
6 7
7 class Builder: 8 class Builder:
8 """ 9 """
9 Generates IR-code from c3 source. 10 Generates IR-code from c3 source.
10 Reports errors to the diagnostics system 11 Reports errors to the diagnostics system
11 """ 12 """
12 def __init__(self, diag): 13 def __init__(self, diag):
13 self.pack_dir = None
14 self.logger = logging.getLogger('c3') 14 self.logger = logging.getLogger('c3')
15 self.diag = diag 15 self.diag = diag
16 self.parser = Parser(diag) 16 self.parser = Parser(diag)
17 self.tc = TypeChecker(diag) 17 self.tc = TypeChecker(diag)
18 self.al = Analyzer(diag) 18 self.al = Analyzer(diag)
21 21
22 def getPackage(self, pname): 22 def getPackage(self, pname):
23 """ package provider for use when analyzing """ 23 """ package provider for use when analyzing """
24 if pname in self.packages: 24 if pname in self.packages:
25 return self.packages[pname] 25 return self.packages[pname]
26 else:
27 # Try to lookup package from file
28 fns = glob.glob('./**/{}.c3'.format(pname))
29 if fns:
30 with open(fns[0]) as f:
31 src = f.read()
32 self.build(src)
33 if self.pack_dir:
34 fns = glob.glob('{}/{}.c3'.format(self.pack_dir, pname))
35 if fns:
36 with open(fns[0]) as f:
37 src = f.read()
38 self.build(src)
39 if pname in self.packages:
40 return self.packages[pname]
41 26
42 def parse(self, src): 27 def checkSource(self, srcs, imps=[]):
43 pkg = self.parser.parseSource(src) 28 """ Performs syntax and type check. """
44 if not pkg: 29 # Parse source:
45 return 30 for src in srcs:
31 pkg = self.parser.parseSource(src)
32 src.close()
33 if not pkg:
34 return
35 # Store for later use:
36 self.packages[pkg.name] = pkg
46 37
47 # TODO: merge the two below? 38 for pkg in self.packages.values():
48 #AstPrinter().printAst(pkg) 39 # Only return ircode when everything is OK
49 if not self.al.analyzePackage(pkg, self): 40 # TODO: merge the two below?
50 return 41 if not self.al.analyzePackage(pkg, self):
51 if not self.tc.checkPackage(pkg): 42 return
52 return 43 if not self.tc.checkPackage(pkg):
44 return
45 yield pkg
53 46
54 # Store for later use: 47 def build(self, srcs, imps=[]):
55 self.packages[pkg.name] = pkg 48 """ Create IR-code from sources """
56 return pkg 49 for pkg in self.checkSource(srcs, imps):
50 yield self.cg.gencode(pkg)
57 51
58 def build(self, src, pack_dir=None):
59 """ Create IR-code from sources """
60 self.pack_dir = pack_dir
61 pkg = self.parse(src)
62
63 # Only return ircode when everything is OK
64 if pkg:
65 return self.cg.gencode(pkg)
66