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