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)
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)
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)
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)
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