Advertisement
Guest User

Untitled

a guest
Mar 24th, 2018
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.24 KB | None | 0 0
  1. # Code generator, generates a C program that prints the first 100 integers.
  2.  
  3. def printGenerator(gen):
  4.     for line in gen:
  5.         print(line)
  6.  
  7. def generateCProgram(headers,functions):
  8.     for line in headers:
  9.         yield line
  10.  
  11.     for function in functions:
  12.         if function.implemented:
  13.             yield ''
  14.             for statement in function.yieldStatement():
  15.                 yield statement
  16.  
  17.  
  18. def headerInclude(name):
  19.     return '#include<' + name + '>'
  20.  
  21.  
  22. class CSymbol:
  23.     symbolTable = {}
  24.  
  25.     def __init__(self,name):
  26.         if name[-1].isdigit():
  27.             raise ValueError("Invalid variable name: " + name +  " , cannot end with digit!")
  28.         self.rawname = name
  29.         if name in self.symbolTable:
  30.             self.symbolTable[name] += 1
  31.             self.name = name + str(symbolTable[name])
  32.         else:
  33.             self.symbolTable[name] = 0
  34.             self.name = name
  35.  
  36.     def __str__(self):
  37.         return self.name
  38.  
  39.  
  40.  
  41. class CVariable(CSymbol):
  42.     def __init__(self,name,vartype):
  43.         super().__init__(name)
  44.         self.type = vartype
  45.  
  46.  
  47.  
  48. class CFunction(CSymbol):
  49.     def __init__(self,name,returntype):
  50.         super().__init__(name)
  51.         self.returntype = returntype
  52.         self.implemented = False
  53.  
  54.     def call(self,*args):  # Todo: Implement some form of preliminary type checking.
  55.         output = self.__str__() + '('
  56.         for i,arg in enumerate(args):
  57.             if i > 0:
  58.                 output += ' ,'
  59.             output += str(arg)
  60.         output += ')'
  61.         return output
  62.  
  63.     def implementFunction(self,parameters,body): # Expects a CBlock as the body argument.
  64.         self.parameters = parameters
  65.         self.body = body
  66.         self.implemented = True
  67.  
  68.     def yieldStatement(self):     # For printing the function implementation body.
  69.         if not self.implemented:
  70.             raise Error("Function not implemented.")
  71.         top = self.returntype + ' ' + self.name + '('
  72.         for i,parameter in enumerate(self.parameters):
  73.             if i > 0:
  74.                 top += ' ,'
  75.             top += parameter.type + ' ' + parameter.name
  76.         top += ')'
  77.         yield top
  78.         for statement in self.body.yieldStatement():
  79.             yield statement
  80.  
  81. class CBlock():
  82.     def __init__(self,*args):
  83.         self.statements = list(args)
  84.  
  85.     def addStatement(self,statement):
  86.         self.statements.append(statement)
  87.  
  88.     def yieldStatement(self):
  89.         yield '{'
  90.         for statement in self.statements:
  91.             yield statement
  92.         yield '}'
  93.  
  94. class ExprStatement:
  95.     def __init__(self,expr):
  96.         self.expr = expr
  97.  
  98.     def __str__(self):
  99.         return self.expr.__str__() + ';'
  100.  
  101. ## Script part starts here:
  102.  
  103.  
  104.  
  105. cprintf = CFunction('printf','void')
  106.  
  107. printnumber = CFunction('printnumber','void')
  108. pnnumber = CVariable("number",'int')
  109. printnumber.implementFunction([pnnumber],
  110.         CBlock(
  111.             ExprStatement(cprintf.call("%f",pnnumber))
  112.             ))
  113.  
  114. main = CFunction('main','void')
  115. mainblock = CBlock()
  116. for i in range(1,101):
  117.     mainblock.addStatement(ExprStatement(printnumber.call(i)))
  118. main.implementFunction([],mainblock)
  119.  
  120. printGenerator(generateCProgram([headerInclude("stdio")],[printnumber,main]))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement