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