示例#1
0
        public override void write(CCodeWriter writer)
        {
            writer.write_string("(");
            writer.write_string(type_name);
            writer.write_string(") ");

            inner.write_inner(writer);
        }
示例#2
0
 public override void write(CCodeWriter writer)
 {
     writer.write_indent(line);
     writer.write_string("case ");
     expression.write(writer);
     writer.write_string(":");
     writer.write_newline();
 }
示例#3
0
 public override void write(CCodeWriter writer)
 {
     writer.write_indent();
     writer.write_string("goto ");
     writer.write_string(name);
     writer.write_string(";");
     writer.write_newline();
 }
 public override void write(CCodeWriter writer)
 {
     condition.write_inner(writer);
     writer.write_string(" ? ");
     true_expression.write_inner(writer);
     writer.write_string(" : ");
     false_expression.write_inner(writer);
 }
示例#5
0
        public override void write(CCodeWriter writer)
        {
            writer.write_indent(line);
            writer.write_string("switch (");
            expression.write(writer);
            writer.write_string(")");

            base.write(writer);
        }
 private void write_expression(CCodeWriter writer, CCodeExpression expr)
 {
     writer.write_indent(line);
     if (expr != null)
     {
         expr.write(writer);
     }
     writer.write_string(";");
     writer.write_newline();
 }
示例#7
0
        public override void write(CCodeWriter writer)
        {
            writer.write_indent(line);
            writer.write_string("while (");

            condition.write(writer);

            writer.write_string(")");

            body.write(writer);
        }
示例#8
0
        public override void write(CCodeWriter writer)
        {
            bool first;

            writer.write_indent(line);
            writer.write_string("for (");

            first = true;
            foreach (CCodeExpression init_expr in initializer)
            {
                if (!first)
                {
                    writer.write_string(", ");
                }
                else
                {
                    first = false;
                }
                if (init_expr != null)
                {
                    init_expr.write(writer);
                }
            }

            writer.write_string("; ");
            if (condition != null)
            {
                condition.write(writer);
            }
            writer.write_string("; ");

            first = true;
            foreach (CCodeExpression it_expr in iterator)
            {
                if (!first)
                {
                    writer.write_string(", ");
                }
                else
                {
                    first = false;
                }
                if (it_expr != null)
                {
                    it_expr.write(writer);
                }
            }

            writer.write_string(")");
            body.write(writer);
        }
示例#9
0
        public override void write(CCodeWriter writer)
        {
            writer.write_indent(line);
            writer.write_string("return");

            if (return_expression != null)
            {
                writer.write_string(" ");
                return_expression.write(writer);
            }

            writer.write_string(";");
            writer.write_newline();
        }
示例#10
0
        public override void write(CCodeWriter writer)
        {
            left.write_inner(writer);

            switch (Operator)
            {
            case CCodeBinaryOperator.PLUS: writer.write_string(" + "); break;

            case CCodeBinaryOperator.MINUS: writer.write_string(" - "); break;

            case CCodeBinaryOperator.MUL: writer.write_string(" * "); break;

            case CCodeBinaryOperator.DIV: writer.write_string(" / "); break;

            case CCodeBinaryOperator.MOD: writer.write_string(" % "); break;

            case CCodeBinaryOperator.SHIFT_LEFT: writer.write_string(" << "); break;

            case CCodeBinaryOperator.SHIFT_RIGHT: writer.write_string(" >> "); break;

            case CCodeBinaryOperator.LESS_THAN: writer.write_string(" < "); break;

            case CCodeBinaryOperator.GREATER_THAN: writer.write_string(" > "); break;

            case CCodeBinaryOperator.LESS_THAN_OR_EQUAL: writer.write_string(" <= "); break;

            case CCodeBinaryOperator.GREATER_THAN_OR_EQUAL: writer.write_string(" >= "); break;

            case CCodeBinaryOperator.EQUALITY: writer.write_string(" == "); break;

            case CCodeBinaryOperator.INEQUALITY: writer.write_string(" != "); break;

            case CCodeBinaryOperator.BITWISE_AND: writer.write_string(" & "); break;

            case CCodeBinaryOperator.BITWISE_OR: writer.write_string(" | "); break;

            case CCodeBinaryOperator.BITWISE_XOR: writer.write_string(" ^ "); break;

            case CCodeBinaryOperator.AND: writer.write_string(" && "); break;

            case CCodeBinaryOperator.OR: writer.write_string(" || "); break;

            default: assert_not_reached(); break;
            }

            right.write_inner(writer);
        }
示例#11
0
        public override void write(CCodeWriter writer)
        {
            switch (Operator)
            {
            case CCodeUnaryOperator.PLUS: writer.write_string("+"); inner.write_inner(writer); break;

            case CCodeUnaryOperator.MINUS: writer.write_string("-"); inner.write_inner(writer); break;

            case CCodeUnaryOperator.LOGICAL_NEGATION: writer.write_string("!"); inner.write_inner(writer); break;

            case CCodeUnaryOperator.BITWISE_COMPLEMENT: writer.write_string("~"); inner.write_inner(writer); break;

            case CCodeUnaryOperator.POINTER_INDIRECTION:
                var inner_unary = inner as CCodeUnaryExpression;
                if (inner_unary != null && inner_unary.Operator == CCodeUnaryOperator.ADDRESS_OF)
                {
                    // simplify expression
                    inner_unary.inner.write(writer);
                    return;
                }
                writer.write_string("*");
                inner.write_inner(writer);
                break;

            case CCodeUnaryOperator.ADDRESS_OF:
                var _inner_unary_ = inner as CCodeUnaryExpression;
                if (_inner_unary_ != null && _inner_unary_.Operator == CCodeUnaryOperator.POINTER_INDIRECTION)
                {
                    // simplify expression
                    _inner_unary_.inner.write(writer);
                    return;
                }
                writer.write_string("&");
                inner.write_inner(writer);
                break;

            case CCodeUnaryOperator.PREFIX_INCREMENT: writer.write_string("++"); break;

            case CCodeUnaryOperator.PREFIX_DECREMENT: writer.write_string("--"); break;

            case CCodeUnaryOperator.POSTFIX_INCREMENT: inner.write_inner(writer); writer.write_string("++"); break;

            case CCodeUnaryOperator.POSTFIX_DECREMENT: inner.write_inner(writer); writer.write_string("--"); break;

            default: assert_not_reached(); break;
            }
        }
示例#12
0
        public override void write(CCodeWriter writer)
        {
            if (!else_if)
            {
                writer.write_indent(line);
            }
            else
            {
                writer.write_string(" ");
            }
            writer.write_string("if (");
            if (condition != null)
            {
                condition.write(writer);
            }
            writer.write_string(")");

            /* else shouldn't be on a separate line */
            if (false_statement != null && true_statement is CCodeBlock)
            {
                var cblock = (CCodeBlock)true_statement;
                cblock.suppress_newline = true;
            }

            true_statement.write(writer);
            if (false_statement != null)
            {
                if (writer.bol)
                {
                    writer.write_indent();
                    writer.write_string("else");
                }
                else
                {
                    writer.write_string(" else");
                }

                /* else if should be on one line */
                if (false_statement is CCodeIfStatement)
                {
                    var cif = (CCodeIfStatement)false_statement;
                    cif.else_if = true;
                }

                false_statement.write(writer);
            }
        }
示例#13
0
        public override void write(CCodeWriter writer)
        {
            bool first = true;

            writer.write_string("(");
            foreach (CCodeExpression expr in inner)
            {
                if (!first)
                {
                    writer.write_string(", ");
                }
                else
                {
                    first = false;
                }
                expr.write(writer);
            }
            writer.write_string(")");
        }
示例#14
0
        public override void write(CCodeWriter writer)
        {
            if (name != null)
            {
                writer.write_string("typedef ");
            }
            writer.write_string("enum ");
            writer.write_begin_block();
            bool first = true;

            foreach (CCodeEnumValue value in values)
            {
                if (!first)
                {
                    writer.write_string(",");
                    writer.write_newline();
                }
                writer.write_indent();
                value.write(writer);
                first = false;
            }
            if (!first)
            {
                writer.write_newline();
            }
            writer.write_end_block();
            if (name != null)
            {
                writer.write_string(" ");
                writer.write_string(name);
            }
            if (modifiers.HasFlag(CCodeModifiers.DEPRECATED))
            {
                writer.write_string(" G_GNUC_DEPRECATED");
            }
            writer.write_string(";");
            writer.write_newline();
        }
        public override void write(CCodeWriter writer)
        {
            if (expression is CCodeCommaExpression)
            {
                // expand comma expression into multiple statements
                // to improve code readability
                var ccomma = expression as CCodeCommaExpression;

                foreach (CCodeExpression expr in ccomma.get_inner())
                {
                    write_expression(writer, expr);
                }
            }
            else if (expression is CCodeParenthesizedExpression)
            {
                var cpar = expression as CCodeParenthesizedExpression;

                write_expression(writer, cpar.inner);
            }
            else
            {
                write_expression(writer, expression);
            }
        }
示例#16
0
 public override void write_inner(CCodeWriter writer)
 {
     writer.write_string("(");
     this.write(writer);
     writer.write_string(")");
 }
示例#17
0
 public virtual void write_inner(CCodeWriter writer)
 {
     this.write(writer);
 }
示例#18
0
 public override void write(CCodeWriter writer)
 {
     writer.write_indent(line);
     writer.write_string("break;");
     writer.write_newline();
 }
示例#19
0
 public override void write(CCodeWriter writer)
 {
     assert_not_reached();
 }