Esempio n. 1
0
        public UnifiedElement VisitUnaryOperatorExpression(
            UnaryOperatorExpression unary, object data)
        {
            var op      = LookupUnaryOperator(unary.Operator);
            var operand = unary.Expression.TryAcceptForExpression(this);

            return(UnifiedUnaryExpression.Create(operand, op));
        }
 private static UnifiedExpression CreateBlockPass(XElement node)
 {
     Contract.Requires(node != null);
     Contract.Requires(node.Name() == "block_pass");
     return(UnifiedUnaryExpression.Create(
                CreateExpresion(node.FirstElement()),
                UnifiedUnaryOperator.Create(
                    "&", UnifiedUnaryOperatorKind.BlockPass)));
 }
 private static UnifiedExpression CreateNot(XElement node)
 {
     Contract.Requires(node != null);
     Contract.Requires(node.Name() == "not");
     return(UnifiedUnaryExpression.Create(
                CreateExpresion(node.FirstElement()),
                UnifiedUnaryOperator.Create(
                    "!", UnifiedUnaryOperatorKind.Not)));
 }
 /// <summary>
 ///   指定したXMLノードから演算子が項の前に付くUnaryExpressionを作成します.
 /// </summary>
 /// <param name="node"> </param>
 /// <param name="createExpression"> </param>
 /// <param name="op2Kind"> </param>
 /// <returns> </returns>
 public static UnifiedExpression CreatePrefixUnaryExpression(
     XElement node,
     Func <XElement, UnifiedExpression> createExpression,
     IDictionary <string, UnifiedUnaryOperator> op2Kind)
 {
     return(UnifiedUnaryExpression.Create(
                createExpression(node.NthElement(1)),
                op2Kind[node.FirstElement().Value].DeepCopy()));
 }
Esempio n. 5
0
        public static UnifiedExpression CreateUntil(XElement node)
        {
            Contract.Requires(node != null);
            Contract.Requires(node.Name() == "until");
            var cond =
                UnifiedUnaryExpression.Create(
                    CreateExpresion(node.FirstElement()),
                    UnifiedUnaryOperator.Create(
                        "!", UnifiedUnaryOperatorKind.Not));
            var secondNode = node.NthElement(1);

            if (node.LastElement().Name() == "TrueClass")
            {
                return(UnifiedWhile.Create(cond, CreateSmartBlock(secondNode)));
            }
            return(UnifiedDoWhile.Create(cond, CreateSmartBlock(secondNode)));
        }
Esempio n. 6
0
 public override bool Visit(
     UnifiedUnaryExpression element, VisitorArgument arg)
 {
     if (element.Operator.Kind
         == UnifiedUnaryOperatorKind.PostIncrementAssign ||
         element.Operator.Kind
         == UnifiedUnaryOperatorKind.PostDecrementAssign)
     {
         element.Operand.TryAccept(this, arg.Set(Paren));
         element.Operator.TryAccept(this, arg);
     }
     else
     {
         element.Operator.TryAccept(this, arg);
         element.Operand.TryAccept(this, arg.Set(Paren));
     }
     return(false);
 }
Esempio n. 7
0
 //単項式
 public override bool Visit(
     UnifiedUnaryExpression element, VisitorArgument arg)
 {
     //後置演算子が付く場合 : a++ || a--
     if (element.Operator.Kind
         == UnifiedUnaryOperatorKind.PostIncrementAssign ||
         element.Operator.Kind
         == UnifiedUnaryOperatorKind.PostDecrementAssign)
     {
         element.Operand.TryAccept(this, arg.Set(Paren));
         element.Operator.TryAccept(this, arg);
     }
     //それ以外の場合は前置演算子(または演算子なし)
     else
     {
         element.Operator.TryAccept(this, arg);
         element.Operand.TryAccept(this, arg.Set(Paren));
     }
     return(true);
 }
Esempio n. 8
0
        public override bool Visit(
            UnifiedUnaryExpression element, VisitorArgument arg)
        {
            var paren = GetRequiredParen(element)
                                                ? Tuple.Create("(", ")") : Tuple.Create("", "");

            Writer.Write(paren.Item1);
            if (element.Operator.Kind
                == UnifiedUnaryOperatorKind.PostIncrementAssign ||
                element.Operator.Kind
                == UnifiedUnaryOperatorKind.PostDecrementAssign)
            {
                element.Operand.TryAccept(this, arg.Set(Paren));
                element.Operator.TryAccept(this, arg);
            }
            else
            {
                element.Operator.TryAccept(this, arg);
                element.Operand.TryAccept(this, arg.Set(Paren));
            }
            Writer.Write(paren.Item2);
            return(true);
        }
        public static UnifiedExpression CreatePostfixExpression(XElement node)
        {
            Contract.Requires(node != null);
            Contract.Requires(node.Name() == "postfix_expression");

            /*
             * postfix_expression
             * :   primary_expression
             *      (   '[' expression ']'
             |   '(' ')'
             |   '(' argument_expression_list ')'
             |   '.' IDENTIFIER
             |   '->' IDENTIFIER
             |   '++'
             |   '--'
             |      )*
             */

            var result =
                CreatePrimaryExpression(node.Element("primary_expression"));
            var elements = node.Elements().Skip(1);             //先頭以外のすべての要素を取得
            var length   = elements.Count();

            for (var i = 0; i < length; i++)
            {
                switch (elements.ElementAt(i++).Value)
                {
                case "[":
                    result = UnifiedIndexer.Create(
                        result,
                        UnifiedSet <UnifiedArgument> .Create(
                            UnifiedArgument.Create(
                                CreateExpression(
                                    elements.ElementAt(i++)).
                                ElementAt(0))));
                    i++;                     // ']'読み飛ばし
                    break;

                case "(":
                    if (elements.ElementAt(i).Name == "argument_expression_list")
                    {
                        result = UnifiedCall.Create(
                            result,
                            CreateArgumentExpressionList(
                                elements.ElementAt(i++)));
                    }
                    else
                    {
                        result = UnifiedCall.Create(
                            result, UnifiedSet <UnifiedArgument> .Create());
                    }
                    i++;                     // ')'読み飛ばし
                    break;

                case ".":
                    result = UnifiedProperty.Create(
                        ".", result,
                        UnifiedIdentifier.CreateVariable(
                            elements.ElementAt(i++).Value));
                    break;

                case "->":
                    result = UnifiedProperty.Create(
                        "->", result,
                        UnifiedIdentifier.CreateVariable(
                            elements.ElementAt(i++).Value));
                    // TODO ポインタ型に展開してから処理するのか?
                    break;

                case "++":
                    result = UnifiedUnaryExpression.Create(
                        result,
                        UnifiedUnaryOperator.Create(
                            "++",
                            UnifiedUnaryOperatorKind.PostIncrementAssign));
                    break;

                case "--":
                    result = UnifiedUnaryExpression.Create(
                        result,
                        UnifiedUnaryOperator.Create(
                            "--",
                            UnifiedUnaryOperatorKind.PostDecrementAssign));
                    break;

                default:
                    throw new InvalidOperationException();
                }
            }

            return(result);
        }
 //単項式
 public override bool Visit(
         UnifiedUnaryExpression element, VisitorArgument arg)
 {
     //後置演算子が付く場合 : a++ || a--
     if (element.Operator.Kind
         == UnifiedUnaryOperatorKind.PostIncrementAssign ||
         element.Operator.Kind
         == UnifiedUnaryOperatorKind.PostDecrementAssign) {
         element.Operand.TryAccept(this, arg.Set(Paren));
         element.Operator.TryAccept(this, arg);
     }
             //それ以外の場合は前置演算子(または演算子なし)
     else {
         element.Operator.TryAccept(this, arg);
         element.Operand.TryAccept(this, arg.Set(Paren));
     }
     return true;
 }
        // 単項式(UnifiedUnaryExpression)
        public override bool Visit(
            UnifiedUnaryExpression element, VisitorArgument arg)
        {
            var paren = GetRequiredParen(element)
                                ? Tuple.Create("(", ")") : Tuple.Create("", "");
            Writer.Write(paren.Item1);

            // TODO 後置演算子が++と--以外にないか確認
            // 前置演算子か後置演算子かで、演算子を先に出力するか決定します
            if (element.Operator.Kind
                == UnifiedUnaryOperatorKind.PostIncrementAssign ||
                element.Operator.Kind
                == UnifiedUnaryOperatorKind.PostDecrementAssign) {
                element.Operand.TryAccept(this, arg.Set(Paren));
                element.Operator.TryAccept(this, arg);
            } else {
                element.Operator.TryAccept(this, arg);
                element.Operand.TryAccept(this, arg.Set(Paren));
            }
            Writer.Write(paren.Item2);
            return true;
        }
 public override bool Visit(
     UnifiedUnaryExpression element, VisitorArgument arg)
 {
     if (element.Operator.Kind
         == UnifiedUnaryOperatorKind.PostIncrementAssign ||
         element.Operator.Kind
         == UnifiedUnaryOperatorKind.PostDecrementAssign) {
         element.Operand.TryAccept(this, arg.Set(Paren));
         element.Operator.TryAccept(this, arg);
     } else {
         element.Operator.TryAccept(this, arg);
         element.Operand.TryAccept(this, arg.Set(Paren));
     }
     return false;
 }