Advertisement
Guest User

Untitled

a guest
Sep 29th, 2016
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.62 KB | None | 0 0
  1. #!/usr/bin/python
  2.  
  3. import sys;
  4. import ply.lex as lex;
  5. import ply.yacc as yacc;
  6. import AST
  7.  
  8. def addToClass(cls):
  9.  
  10.     def decorator(func):
  11.         setattr(cls,func.__name__,func)
  12.         return func
  13.     return decorator
  14.  
  15.  
  16. class TypeChecker:
  17.  
  18.     @addToClass(AST.Node)
  19.     def check(self):
  20.         raise Exception("check not defined in class " + self.__class__.__name__);
  21.  
  22.  
  23.     #@addToClass( ... )
  24.     #def check(self):
  25.     # ...
  26.  
  27.  
  28. class CodeGenerator:
  29.  
  30.     @addToClass(AST.Node)
  31.     def eval(self):
  32.         raise Exception("eval not defined in class " + self.__class__.__name__);
  33.  
  34.  
  35.     #@addToClass( ... )
  36.     #def eval(self):
  37.     # ...
  38.  
  39.  
  40. literals = "{}()<>=;,+-*/"
  41.  
  42.  
  43. tokens = ( "ID", "FLOAT", "INTEGER", "STRING",
  44.            "TYPE", "IF", "ELSE", "WHILE", "EQ", "NEQ", "LE", "GE" );
  45.  
  46.  
  47. t_ignore = ' \t'
  48.  
  49. def t_newline(t):
  50.     r'\n+'
  51.     t.lexer.lineno += len(t.value)
  52.  
  53. def t_error(t):
  54.     print("Illegal character %s" % t.value[0])
  55.     t.lexer.skip(1)
  56.  
  57.  
  58. def t_FLOAT(t):
  59.     r"\d+(\.\d*)|\.\d+"
  60.     return t
  61.  
  62. def t_INTEGER(t):
  63.     r"\d+"
  64.     return t
  65.  
  66. def t_STRING(t):
  67.     r'\"([^\\\n]|(\\.))*?\"'
  68.     return t
  69.  
  70. def t_IF(t):
  71.     r"if"
  72.     return t
  73.  
  74. def t_ELSE(t):
  75.     r"else"
  76.     return t
  77.  
  78. def t_WHILE(t):
  79.     r"while"
  80.     return t
  81.  
  82. def t_LE(t):
  83.     r"<="
  84.     return t
  85.  
  86. def t_GE(t):
  87.     r">="
  88.     return t
  89.  
  90. def t_EQ(t):
  91.     r"=="
  92.     return t
  93.  
  94. def t_NEQ(t):
  95.     r"!="
  96.     return t
  97.  
  98. def t_TYPE(t):
  99.     r"int|float|string"
  100.     return t
  101.  
  102. def t_ID(t):
  103.     r"[a-zA-Z_]\w*"
  104.     return t
  105.  
  106.  
  107. precedence = (
  108.    ("nonassoc", 'IFX'),
  109.    ("nonassoc", 'ELSE'),
  110.    ("nonassoc", '<', '>', 'EQ', 'NEQ', 'LE', 'GE'),
  111.    ("left", '+', '-'),
  112.    ("left", '*', '/') )
  113.  
  114.  
  115.  
  116. def p_error(p):
  117.     print("Syntax error at token", p.type)
  118.  
  119. def p_program(p):
  120.     """program : declarations instructions"""
  121.  
  122. def p_declarations(p):
  123.     """declarations : declarations declaration
  124.                    | """
  125.  
  126. def p_declaration(p):
  127.     """declaration : TYPE vars ';' """
  128.  
  129. def p_vars(p):
  130.     """vars : vars ',' ID
  131.            | ID """
  132.  
  133. def p_instructions(p):
  134.     """instructions : instructions instruction
  135.                    | instruction"""
  136.    
  137.  
  138. def p_instruction(p):
  139.     """instruction : assignment
  140.                   | choice_instr
  141.                   | while_instr """
  142.    
  143.  
  144. def p_assignment(p):
  145.     """assignment : ID '=' expression ';' """
  146.  
  147. def p_expression(p):
  148.     """expression : ID
  149.                  | const
  150.                  | expression '+' expression
  151.                  | expression '-' expression
  152.                  | expression '*' expression
  153.                  | expression '/' expression
  154.                  | '(' expression ')' """
  155.  
  156.  
  157. def p_const(p):
  158.     """const : INTEGER
  159.             | FLOAT
  160.             | STRING"""
  161.  
  162.  
  163. def p_choice_instr(p):
  164.     """choice_instr : IF '(' condition ')' stmt %prec IFX
  165.                    | IF '(' condition ')' stmt ELSE stmt """
  166.  
  167. def p_while_instr(p):
  168.     """while_instr : WHILE '(' condition ')' stmt """
  169.  
  170. def p_condition(p):
  171.     """condition : expression EQ  expression
  172.                 | expression NEQ expression
  173.                 | expression GE  expression
  174.                 | expression LE  expression
  175.                 | expression '<' expression
  176.                 | expression '>' expression """
  177.  
  178. def p_stmt(p):
  179.     """stmt : assignment
  180.            | '{' instructions '}'
  181.            | choice_instr
  182.            | while_instr """
  183.  
  184.  
  185.  
  186. file = open(sys.argv[1] if len(sys.argv) > 1 else "example.txt", "r");
  187.  
  188.  
  189. lexer = lex.lex()
  190. parser = yacc.yacc()
  191. text = file.read()
  192. parser.parse(text, lexer=lexer)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement