コード例 #1
0
ファイル: program.py プロジェクト: TheLampshady/pascompiler
    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'])
コード例 #2
0
ファイル: compiler.py プロジェクト: TheLampshady/pascompiler
def main():
    pascal_program = Program(args.filename)

    pascal_program.run()
    OutputBuffer.print_output(args.out_filename or None)
    sys.exit(0)
コード例 #3
0
ファイル: program.py プロジェクト: TheLampshady/pascompiler
 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")
コード例 #4
0
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