def p_array_type(p): '''ArrayType : LBRACK ArrayLength RBRACK ElementType''' p[0] = Node('ArrayType') if p[2].extra['count'] == -208016: # slice p[0].typeList.append(['slice', p[4].typeList[0], 0]) p[0].sizeList.append(0) else: if p[2].extra['count'] < 0: compilation_errors.add('Size Error', line_number.get()+1, 'array bound must be non-negative') return p[0].typeList.append(['array', p[4].typeList[0], p[2].extra['count']]) p[0].sizeList.append(int(p[2].extra['count']*p[4].sizeList[0])) p[0].name = 'ArrayType'
def p_add_mul_op(p): '''AddMulOp : UnaryOp | OR | XOR | QUO | REM | SHL | SHR''' if isinstance(p[1], str): p[0] = Node('AddMulOp') p[0].extra['opcode'] = p[1] p[0].extra['int'] = True if p[1] == '/': p[0].extra['float'] = True else: p[0] = p[1] p[0].name = 'AddMulOp'
def p_binary_op(p): '''BinaryOp : LOR | LAND | RelOp | AddMulOp''' if isinstance(p[1], str): p[0] = Node('BinaryOp') p[0].extra['opcode'] = p[1] p[0].extra['bool'] = True p[0].typeList.append(['bool']) elif p[1].name == 'RelOp': p[0] = p[1] p[0].typeList.append(['bool']) else: p[0] = p[1] p[0].name = 'BinaryOp'