Пример #1
0
def p_unary_expr(p):
    '''UnaryExpr : PrimaryExpr
                             | UnaryOp UnaryExpr
                             | NOT UnaryExpr'''
    p[0] = Node('UnaryExpr')
    if len(p) == 2:
        p[0].typeList = p[1].typeList
        p[0].placeList = p[1].placeList
        p[0].sizeList = p[1].sizeList
        p[0].code = p[1].code
    elif p[1] == '!':
        if p[2].typeList[0] != ['bool']:
            compilation_errors.add('TypeMismatch', line_number.get()+1, 'Type should be boolean')
        else:
            p[0].typeList = p[2].typeList
            p[0].placeList = p[2].placeList
            p[0].sizeList = p[2].sizeList
            p[0].code = p[2].code
            newVar = helper.newVar(p[0].typeList[0], p[0].sizeList[0])
            p[0].code.append(['!', newVar, p[2].placeList[0]])
    else:
        if p[2].typeList[0][0] not in p[1].extra:
            compilation_errors.add('TypeMismatch', line_number.get()+1, 'Invalid type for unary expression')
        else:
            p[0].typeList = p[2].typeList
            p[0].placeList = p[2].placeList
            p[0].sizeList = p[2].sizeList
            p[0].code = p[2].code
            newVar = helper.newVar(p[0].typeList[0], p[0].sizeList[0])
            p[0].code.append([p[1].extra['opcode'], newVar, p[2].placeList[0]])
Пример #2
0
def p_expr(p):
    '''Expression : UnaryExpr
                              | Expression BinaryOp Expression'''
    p[0] = Node('Expression')
    if len(p) == 2:
        p[0].typeList = p[1].typeList
        p[0].placeList = p[1].placeList
        p[0].sizeList = p[1].sizeList
        p[0].code = p[1].code
    else:
        if p[1].typeList[0] != p[3].typeList[0]:
            compilation_errors.add('TypeMismatch', line_number.get()+1, 'Type should be same across binary operator')
        elif p[1].typeList[0][0] not in p[2].extra:
            compilation_errors.add('TypeMismatch', line_number.get()+1, 'Invalid type for binary expression')
        else:
            if len(p[2].typeList) > 0:
                # for boolean
                p[0].typeList = p[2].typeList
            else:
                p[0].typeList = p[1].typeList
            newVar = helper.newVar(p[0].typeList[0], p[1].sizeList[0])
            p[0].code = p[1].code
            p[0].code += p[3].code
            if len(p[2].extra) < 3:
                p[0].code.append([p[2].extra['opcode'], newVar, p[1].placeList[0], p[3].placeList[0]])
            else:
                p[0].code.append([p[2].extra['opcode'] + p[1].typeList[0][0], newVar, p[1].placeList[0], p[3].placeList[0]])
            p[0].sizeList = p[1].sizeList
            p[0].placeList.append(newVar)