def _assignment(self): word = self.pascal_parser.current_word assignment = self.symbol_table.get(word, None) if not assignment: raise ValueError("Identifier does not exist: '%s'" % word) if self.pascal_parser.get_next_token() != TK_ASSIGNMENT: raise ValueError("Expected Assignment: Got %s" % self.pascal_parser.current_word) self.pascal_parser.get_next_token() result = evaluate_expression(self.pascal_parser, self.symbol_table) handle_int_real_conversion(assignment['data_type'], result[0], assignment=True) assignment['value'] = result[1] OutputBuffer.add("pusha %s" % assignment['address'])
def _write(self): if self.pascal_parser.get_next_token() != TK_LEFT_PAREN: raise ValueError("Expected '(': Got '%s'" % self.pascal_parser.current_word) evaluate_expression(self.pascal_parser, self.symbol_table) OutputBuffer.add("write")
def evaluate_expression_f(token_parser, symbol_table): """ :param token_parser: :param symbol_table: Table of avlailbe symbols for lookups :return: """ if token_parser.current_token == TK_LEFT_PAREN: token_parser.get_next_token() result = evaluate_expression(token_parser, symbol_table) if token_parser.current_token != TK_RIGHT_PAREN: raise ValueError("Invalid Token '%s': Expecting ')'" % token_parser.print_token()) # --------- IDS ------------ elif token_parser.current_token == TK_IDENTIFIER: lookup = symbol_table.get(token_parser.current_word) if not lookup: raise ValueError("Invalid Variable: '%s'" % token_parser.print_token()) value = lookup.get('value') if value is None: raise ValueError("Variable Not Initialized: '%s'" % token_parser.current_word) result = (lookup['data_type'], value) OutputBuffer.add('addr %s' % lookup.get('address')) # --------- Literals --------- elif token_parser.current_token == TK_A_BOOL: value = bool(token_parser.current_word == 'true') result = TK_A_BOOL, value OutputBuffer.add("push %s" % value) elif token_parser.current_token == TK_QUOTE: value = handle_char(token_parser) result = TK_A_CHAR, value OutputBuffer.add("push %s" % value) elif token_parser.current_token == TK_A_DIGIT: value = float(token_parser.current_word) if token_parser.is_real() else int(token_parser.current_word) result = token_parser.current_token, value OutputBuffer.add("push %s" % value) elif token_parser.current_token == TK_NOT: token_parser.get_next_token() result = evaluate_expression_f(token_parser) if result[0] not in [TK_AN_INTEGER, TK_A_BOOL]: raise TypeError("Invalid Type for Not Operation: '%s'" % result[0]) OutputBuffer.add("not") elif token_parser.current_token == TK_PLUS: token_parser.get_next_token() result = evaluate_expression_f(token_parser) if result[0] not in [TK_AN_INTEGER, TK_A_REAL]: raise TypeError("Invalid Type for Plus Operation: '%s'" % result[0]) elif token_parser.current_token == TK_MINUS: token_parser.get_next_token() result = evaluate_expression_f(token_parser) if result[0] not in [TK_AN_INTEGER, TK_A_REAL]: raise TypeError("Invalid Type for Minus Operation: '%s'" % result[0]) result = (result[0], result[1]*-1) OutputBuffer.add("neg") else: raise ValueError("Invalid Variable: '%s'" % token_parser.print_token()) token_parser.get_next_token() return result