diff python/c3/parser.py @ 215:c1ccb1cb4cef

Major changes in c3 frontend
author Windel Bouwman
date Fri, 05 Jul 2013 13:00:03 +0200
parents 003c8a976fff
children 1fa3e0050b49
line wrap: on
line diff
--- a/python/c3/parser.py	Fri Jul 05 11:18:58 2013 +0200
+++ b/python/c3/parser.py	Fri Jul 05 13:00:03 2013 +0200
@@ -49,6 +49,8 @@
     def initLex(self, source):
       self.tokens = lexer.tokenize(source) # Lexical stage
       self.token = self.tokens.__next__()
+    def addDeclaration(self, decl):
+        self.currentPart.declarations.append(decl)
     
     def parseUses(self):
         pass
@@ -58,6 +60,7 @@
       name = self.Consume('ID')
       self.Consume(';')
       self.mod = astnodes.Package(name.val, name.loc)
+      self.currentPart = self.mod
       self.parseUses()
       # TODO: parse uses
       while self.Peak != 'END':
@@ -125,6 +128,7 @@
          v.loc = name.loc
          if self.hasConsumed('='):
             v.ival = self.parseExpression()
+         self.addDeclaration(v)
       parseVar()
       while self.hasConsumed(','):
          parseVar()
@@ -150,6 +154,9 @@
       returntype = self.parseTypeSpec()
       fname = self.Consume('ID').val
       f = astnodes.Function(fname, loc)
+      self.addDeclaration(f)
+      savePart = self.currentPart
+      self.currentPart = f
       self.Consume('(')
       parameters = []
       if not self.hasConsumed(')'):
@@ -158,12 +165,16 @@
             name = self.Consume('ID')
             param = astnodes.Variable(name.val, typ)
             param.loc = name.loc
+            self.addDeclaration(param)
             parameters.append(param)
          parseParameter()
          while self.hasConsumed(','):
             parseParameter()
          self.Consume(')')
-      body = self.parseCompoundStatement()
+      paramtypes = [p.typ for p in parameters]
+      f.typ = astnodes.FunctionType(paramtypes, returntype)
+      f.body = self.parseCompoundStatement()
+      self.currentPart = savePart
 
     # Statements:
     def parseAssignment(self, lval):