Beispiel #1
0
    def p_logical_expression_not(self, p):
        '''logical_expression : BOOL_NOT logical_expression'''
        t = Token('NOT', '!')
        p[0] = UnaryOp(p[2], t)

        if p[2].dtype != ('bool', 0):
            print('invalid usage of operator logical NOT.')
            sys.exit(0)

        p[0].dtype = ('bool', 0)
Beispiel #2
0
    def p_exression_deref(self, p):
        '''expression : STAR expression'''
        t = Token('DEREF', p[1])
        p[0] = UnaryOp(p[2], t)

        dtype = p[2].dtype
        if dtype[1] <= 0:
            print('invalid usage of pointer.')
            sys.exit(0)

        p[0].dtype = (dtype[0], dtype[1] - 1)
Beispiel #3
0
    def p_lhs(self, p):
        '''lhs : STAR lhs'''
        t = Token('DEREF', p[1])
        p[0] = UnaryOp(p[2], t)

        dtype = p[2].dtype
        if dtype[1] <= 0:
            print('invalid usage of pointer.')
            sys.exit(0)

        p[0].dtype = (dtype[0], dtype[1] - 1)
Beispiel #4
0
    def p_addr(self, p):
        '''addr : AND id'''

        if p[2].entry['type'] == 'function':
            print('invalid usage of function %s.' % (p[2].value))
            sys.exit(0)

        t = Token('ADDR', p[1])
        p[0] = UnaryOp(p[2], t)

        dtype = p[2].entry['type']
        p[0].dtype = (dtype[0], dtype[1] + 1)
Beispiel #5
0
    def p_expression_uminus(self, p):
        '''expression : MINUS expression %prec UMINUS'''
        t = Token('UMINUS', '-')
        p[0] = UnaryOp(p[2], t)

        check_direct_access(p[2])

        dtype = p[2].dtype
        if dtype[0] == 'void' or dtype[1] != 0:
            print(
                'invalid use of operator unary minus on expression of type: ',
                dtype)
            sys.exit(0)

        p[0].dtype = dtype