Mercurial > lcfOS
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 |