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