Mercurial > lcfOS
comparison python/c3/builder.py @ 251:6ed3d3a82a63
Added another c3 example. First import attempt
author | Windel Bouwman |
---|---|
date | Mon, 29 Jul 2013 20:23:13 +0200 |
parents | 240111e0456f |
children | bd26dc13f270 |
comparison
equal
deleted
inserted
replaced
250:f5fba5b554d7 | 251:6ed3d3a82a63 |
---|---|
1 import ppci | 1 import ppci |
2 from . import Parser, TypeChecker, Analyzer, CodeGenerator | 2 from . import Parser, TypeChecker, Analyzer, CodeGenerator |
3 from . astprinter import AstPrinter | 3 from . astprinter import AstPrinter |
4 import glob | |
4 | 5 |
5 class Builder: | 6 class Builder: |
6 """ | 7 """ |
7 Generates IR-code from c3 source. | 8 Generates IR-code from c3 source. |
8 Reports errors to the diagnostics system | 9 Reports errors to the diagnostics system |
11 self.diag = diag | 12 self.diag = diag |
12 self.parser = Parser(diag) | 13 self.parser = Parser(diag) |
13 self.tc = TypeChecker(diag) | 14 self.tc = TypeChecker(diag) |
14 self.al = Analyzer(diag) | 15 self.al = Analyzer(diag) |
15 self.cg = CodeGenerator() | 16 self.cg = CodeGenerator() |
16 def build(self, src): | 17 self.packages = {} |
17 """ Create IR-code from sources """ | 18 |
19 def getPackage(self, pname): | |
20 """ package provider for use when analyzing """ | |
21 if pname in self.packages: | |
22 return self.packages[pname] | |
23 else: | |
24 # Try to lookup package from file | |
25 fns = glob.glob('./*/{}.c3'.format(pname)) | |
26 if fns: | |
27 with open(fns[0]) as f: | |
28 src = f.read() | |
29 self.build(src) | |
30 if pname in self.packages: | |
31 return self.packages[pname] | |
32 | |
33 def parse(self, src): | |
18 pkg = self.parser.parseSource(src) | 34 pkg = self.parser.parseSource(src) |
19 if not pkg: | 35 if not pkg: |
20 return | 36 return |
21 self.pkg = pkg | 37 |
22 # TODO: merge the two below? | 38 # TODO: merge the two below? |
23 #AstPrinter().printAst(pkg) | 39 #AstPrinter().printAst(pkg) |
24 if not self.al.analyzePackage(pkg): | 40 if not self.al.analyzePackage(pkg, self): |
25 return | 41 return |
26 if not self.tc.checkPackage(pkg): | 42 if not self.tc.checkPackage(pkg): |
27 return | 43 return |
28 | 44 |
45 # Store for later use: | |
46 self.packages[pkg.name] = pkg | |
47 return pkg | |
48 | |
49 def build(self, src): | |
50 """ Create IR-code from sources """ | |
51 pkg = self.parse(src) | |
52 | |
29 # Only return ircode when everything is OK | 53 # Only return ircode when everything is OK |
30 return self.cg.gencode(pkg) | 54 if pkg: |
55 return self.cg.gencode(pkg) | |
31 | 56 |