コード例 #1
0
ファイル: cgrammar.py プロジェクト: sebastic/grass
def p_postfix_expression(p):
    '''postfix_expression : primary_expression
                  | postfix_expression '[' expression ']'
                  | postfix_expression '(' ')'
                  | postfix_expression '(' argument_expression_list ')'
                  | postfix_expression PERIOD IDENTIFIER
                  | postfix_expression PTR_OP IDENTIFIER
                  | postfix_expression INC_OP
                  | postfix_expression DEC_OP
    '''

    if len(p) == 2:
        p[0] = p[1]

    elif p[2] == '[':
        p[0] = expressions.BinaryExpressionNode(
            "array access", (lambda a, b: a[b]),
            "(%s [%s])", (True, False),
            p[1],
            p[3])

    elif p[2] == '(':
        if p[3] == ')':
            p[0] = expressions.CallExpressionNode(p[1], [])
        else:
            p[0] = expressions.CallExpressionNode(p[1], p[3])

    elif p[2] == '.':
        p[0] = expressions.AttributeExpressionNode(
            (lambda x, a: getattr(x, a)), "(%s.%s)", p[1], p[3])

    elif p[2] == '->':
        p[0] = expressions.AttributeExpressionNode(
            (lambda x, a: getattr(x.contents, a)), "(%s.contents.%s)", p[1], p[3])

    elif p[2] == '++':
        p[0] = expressions.UnaryExpressionNode("increment", (lambda x: x + 1),
                                               "(%s + 1)", False, p[1])

    elif p[2] == '--':
        p[0] = expressions.UnaryExpressionNode("decrement", (lambda x: x - 1),
                                               "(%s - 1)", False, p[1])
コード例 #2
0
ファイル: cgrammar.py プロジェクト: starseeker/archival
def p_unary_expression(p):
    '''unary_expression : postfix_expression
                        | INC_OP unary_expression
                        | DEC_OP unary_expression
                        | unary_operator cast_expression
                        | SIZEOF unary_expression
                        | SIZEOF '(' type_name ')'
                        | asm_expression
    '''
    if len(p) == 2:
        p[0] = p[1]

    elif p[1] == 'sizeof':
        if len(p) == 5:
            p[0] = expressions.SizeOfExpressionNode(p[3])
        else:
            p[0] = expressions.SizeOfExpressionNode(p[2])

    else:
        name, op, format, can_be_ctype = prefix_ops_dict[p[1]]
        p[0] = expressions.UnaryExpressionNode(name, op, format, can_be_ctype,
                                               p[2])