Пример #1
0
 public UnifiedType WrapGeneric(
     UnifiedSet<UnifiedGenericArgument> arguments = null)
 {
     return new UnifiedGenericType {
             Type = this,
             Arguments = arguments,
     };
 }
 public override bool Visit(
         UnifiedSet<UnifiedCase> element, VisitorArgument arg)
 {
     arg = arg.IncrementDepth();
     foreach (var caseElement in element) {
         WriteIndent(arg.IndentDepth);
         caseElement.TryAccept(this, arg);
     }
     return false;
 }
Пример #3
0
 public override bool Visit(
     UnifiedSet <UnifiedCase> element, VisitorArgument arg)
 {
     arg = arg.IncrementDepth();
     foreach (var caseElement in element)
     {
         WriteIndent(arg.IndentDepth);
         caseElement.TryAccept(this, arg);
     }
     return(false);
 }
        public override MutableSet <V> Collect <V, T1>(LongToObjectFunction <T1> function) where T1 : V
        {
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final org.eclipse.collections.api.set.MutableSet<V> result = new org.eclipse.collections.impl.set.mutable.UnifiedSet<>(size());
            MutableSet <V> result = new UnifiedSet <V>(Size());

            Each(element =>
            {
                result.add(function.apply(element));
            });
            return(result);
        }
Пример #5
0
 // e.g. Foo<T1, T2> where T1 : string
 public override bool Visit(
     UnifiedSet<UnifiedGenericParameter> element, VisitorArgument arg)
 {
     VisitCollection(element, arg.Set(InequalitySignParen));
     foreach (var genericParameter in element) {
         if (genericParameter.Constrains != null) {
             foreach (var constrain in genericParameter.Constrains) {
                 Writer.Write(" where ");
                 genericParameter.Type.TryAccept(this, arg);
                 constrain.TryAccept(this, arg.Set(ColonDelimiter));
             }
         }
     }
     return false;
 }
        public override bool Visit(
                UnifiedSet<UnifiedCatch> element, VisitorArgument arg)
        {
            //TODO VisitCollection()に置き換えられるか確認

            Writer.Write(arg.Decoration.MostLeft);
            var delimiter = "";
            foreach (var e in element) {
                Writer.Write(delimiter);
                e.TryAccept(this, arg);
                delimiter = arg.Decoration.Delimiter;
            }
            Writer.Write(arg.Decoration.MostRight);
            return false;
        }
Пример #7
0
        public static UnifiedSet <UnifiedParameter> CreateDeclaratorSuffix(
            XElement node)
        {
            Contract.Requires(node != null);
            Contract.Requires(node.Name() == "declarator_suffix");

            /* declarator_suffix
             * :   '[' constant_expression ']'
             * |   '[' ']'
             * |   '(' parameter_type_list ')'
             * |   '(' identifier_list ')'
             * |   '(' ')'
             * ;
             */

            // 空のパラメータリストを生成する
            var parameters = UnifiedSet <UnifiedParameter> .Create();

            // ()の場合
            if (node.FirstElement().Value.Equals("(") &&
                node.LastElement().Value.Equals(")"))
            {
                if (node.Element("parameter_type_list") != null)
                {
                    parameters =
                        CreateParameterTypeList(
                            node.Element("parameter_type_list"));
                }
                else if (node.Element("identifier_list") != null)
                {
                    // TODO どう考えてもargumentCollectionだが、対応するプログラムをまずは検証する
                    throw new NotImplementedException();
                }
                // []の場合
            }
            else if (node.FirstElement().Value.Equals("[") &&
                     node.LastElement().Value.Equals("]"))
            {
                // TODO []がくるケースがまだ未検証
                throw new NotImplementedException();
            }
            else
            {
                throw new InvalidOperationException();
            }
            return(parameters);
        }
Пример #8
0
        CreateSpecifierQualifierList(XElement node)
        {
            Contract.Requires(node != null);
            Contract.Requires(node.Name() == "specifier_qualifier_list");

            /*
             * specifier_qualifier_list
             * : ( type_qualifier | type_specifier )+
             */
            var modifiers = UnifiedSet <UnifiedModifier> .Create();

            var types = new List <UnifiedType>();

            foreach (var e in node.Elements())
            {
                switch (e.Name())
                {
                case "type_qualifier":
                    modifiers.Add(CreateTypeQualifier(e));
                    break;

                case "type_specifier":
                    types.Add((UnifiedType)CreateTypeSpecifier(e));
                    break;
                }
            }
            // 修飾子が空の場合はnullにする
            if (modifiers.IsEmpty())
            {
                modifiers = null;
            }

            var s      = "";
            var prefix = "";

            foreach (var t in types)
            {
                s     += prefix + t.BasicTypeName;
                prefix = " ";
            }
            var type = s.Equals("")
                                                           ? null
                                                           : UnifiedType.Create(
                UnifiedVariableIdentifier.Create(s));

            return(Tuple.Create(modifiers, type));
        }
        // Expressions
        public static UnifiedSet <UnifiedArgument> CreateArgumentExpressionList(
            XElement node)
        {
            Contract.Requires(node != null);
            Contract.Requires(node.Name() == "argument_expression_list");

            /*
             * argument_expression_list
             * :   assignment_expression (',' assignment_expression)*
             */

            var arguments = node.Elements("assignment_expression").
                            Select(CreateAssignmentExpression).
                            Select(e => UnifiedArgument.Create(e));

            return(UnifiedSet <UnifiedArgument> .Create(arguments));
        }
Пример #10
0
        public static UnifiedFunctionDefinition CreateFunctionDefinition(
            XElement node)
        {
            Contract.Requires(node != null);
            Contract.Requires(node.Name() == "function_definition");

            /* function_definition
             * :	declaration_specifiers? declarator
             * (	declaration+ compound_statement	// K&R style
             *   |	compound_statement				// ANSI style
             * )
             */

            UnifiedSet <UnifiedModifier> modifiers = null;
            UnifiedType type = null;
            UnifiedSet <UnifiedGenericParameter> genericParameters = null;
            UnifiedIdentifier             name       = null;
            UnifiedSet <UnifiedParameter> parameters = null;
            UnifiedBlock body = null;

            var first = node.FirstElement();

            if (first.Name() == "declaration_specifiers")
            {
                var modifiersAndType = CreateDeclarationSpecifiers(first);
                modifiers = modifiersAndType.Item1;
                type      = (UnifiedType)modifiersAndType.Item2;
            }

            var declarator = CreateDeclarator(node.Element("declarator"));

            name       = declarator.Item1;
            parameters = declarator.Item2;

            if (node.Elements("declaration").Count() != 0)
            {
                // TODO declaration+ compound_statement に該当するケースが未検出
                throw new NotImplementedException();
            }

            body = CreateCompoundStatement(node.Element("compound_statement"));

            return(UnifiedFunctionDefinition.Create(
                       null, modifiers, type, genericParameters, name, parameters,
                       null, body));
        }
        public override bool Visit(
            UnifiedSet <UnifiedCatch> element, VisitorArgument arg)
        {
            //TODO VisitCollection()に置き換えられるか確認

            Writer.Write(arg.Decoration.MostLeft);
            var delimiter = "";

            foreach (var e in element)
            {
                Writer.Write(delimiter);
                e.TryAccept(this, arg);
                delimiter = arg.Decoration.Delimiter;
            }
            Writer.Write(arg.Decoration.MostRight);
            return(false);
        }
Пример #12
0
 // e.g. Foo<T1, T2> where T1 : string
 public override bool Visit(
     UnifiedSet <UnifiedGenericParameter> element, VisitorArgument arg)
 {
     VisitCollection(element, arg.Set(InequalitySignParen));
     foreach (var genericParameter in element)
     {
         if (genericParameter.Constrains != null)
         {
             foreach (var constrain in genericParameter.Constrains)
             {
                 Writer.Write(" where ");
                 genericParameter.Type.TryAccept(this, arg);
                 constrain.TryAccept(this, arg.Set(ColonDelimiter));
             }
         }
     }
     return(false);
 }
        public void compares_different_calls()
        {
            var o1 =
                UnifiedCall.Create(
                    UnifiedVariableIdentifier.Create("f"),
                    UnifiedSet <UnifiedArgument> .Create(
                        UnifiedArgument.Create(
                            UnifiedVariableIdentifier.Create(
                                "a"), null, null),
                        UnifiedArgument.Create(
                            UnifiedBinaryExpression.Create(
                                UnifiedVariableIdentifier.
                                Create("n"),
                                UnifiedBinaryOperator.Create
                                (
                                    "-",
                                    UnifiedBinaryOperatorKind
                                    .Add),
                                UnifiedInt32Literal.Create(
                                    1)
                                ), null, null)));
            var o2 =
                UnifiedCall.Create(
                    UnifiedVariableIdentifier.Create("f"),
                    UnifiedSet <UnifiedArgument> .Create(
                        UnifiedArgument.Create(
                            UnifiedVariableIdentifier.Create(
                                "a"), null, null),
                        UnifiedArgument.Create(
                            UnifiedBinaryExpression.Create(
                                UnifiedVariableIdentifier.
                                Create("n2"),
                                UnifiedBinaryOperator.Create
                                (
                                    "-",
                                    UnifiedBinaryOperatorKind
                                    .Add),
                                UnifiedInt32Literal.Create(
                                    1)), null, null)));

            Assert.That(
                StructuralEqualityComparer.StructuralEquals(o1, o2),
                Is.False);
        }
Пример #14
0
        public override bool Visit(
            UnifiedSet <UnifiedTypeConstrain> element, VisitorArgument arg)
        {
            UnifiedTypeConstrain last = null;

            foreach (var current in element)
            {
                if (last == null)
                {
                    current.TryAccept(this, arg.Set(NullDelimiter));
                }
                else
                {
                    current.TryAccept(this, arg.Set(ColonDelimiter));
                }
                last = current;
            }
            return(false);
        }
Пример #15
0
        CreateDirectDeclarator(XElement node)
        {
            Contract.Requires(node != null);
            Contract.Requires(node.Name() == "direct_declarator");

            /* direct_declarator
             * :   (	IDENTIFIER  | '(' declarator ')' ) declarator_suffix*
             */

            var identifier = node.Element("IDENTIFIER");
            UnifiedIdentifier name;

            if (identifier != null)
            {
                name = UnifiedVariableIdentifier.Create(identifier.Value);
            }
            else if (node.Element("declarator") != null)
            {
                // TODO (test())(){ }が許されるとして、その場合はどうするのか
                return(CreateDeclarator(node.Element("declarator")));
            }
            else
            {
                throw new InvalidOperationException();
            }

            UnifiedSet <UnifiedParameter> parameters = null;

            if (node.Elements("declarator_suffix").Count() > 1)
            {
                // TODO test()()となるケースが未検出
                throw new NotImplementedException();
            }
            else if (node.Elements("declarator_suffix").Count() == 1)
            {
                parameters =
                    CreateDeclaratorSuffix(
                        node.Element("declarator_suffix"));
            }

            return(Tuple.Create(name, parameters));
        }
Пример #16
0
        public static UnifiedSet <UnifiedParameter> CreateParameterList(
            XElement node)
        {
            Contract.Requires(node != null);
            Contract.Requires(node.Name() == "parameter_list");

            /*
             * parameter_list
             * : parameter_declaration (',' parameter_declaration)*
             */

            var parameters = UnifiedSet <UnifiedParameter> .Create();

            foreach (var parameterNode in node.Elements("parameter_declaration")
                     )
            {
                parameters.Add(CreateParameterDeclaration(parameterNode));
            }
            return(parameters);
        }
Пример #17
0
        private static UnifiedCatch CreateResbody(XElement node)
        {
            Contract.Requires(node != null);
            Contract.Requires(node.Name() == "resbody");
            Contract.Requires(node.FirstElement().Name() == "array");
            // TODO: UnifiedType.Create(ident) => identをUnifiedTypeIdentifierにべきでは?
            var children = node.FirstElement().Elements().ToList();
            var block    = CreateSmartBlock(node.LastElement());

            if (children.Count == 0)
            {
                return(UnifiedCatch.Create(
                           UnifiedSet <UnifiedType> .Create(), null, block));
            }
            var assign = CreateExpresion(children.Last().FirstElement());
            var types  = children.SkipLast()
                         .Select(CreateConst)
                         .Select(UnifiedType.Create)
                         .ToSet();

            return(UnifiedCatch.Create(types, assign, block));
        }
Пример #18
0
        public static UnifiedSet <UnifiedParameter> CreateParameterTypeList(
            XElement node)
        {
            Contract.Requires(node != null);
            Contract.Requires(node.Name() == "parameter_type_list");

            /*
             * parameter_type_list
             * : parameter_list (',' '...')?
             */
            var parameters = CreateParameterList(node.Element("parameter_list"));

            // TODO 可変長引数はmodifierなのか確認
            if (node.LastElement().Value == "...")
            {
                parameters.Add(
                    UnifiedParameter.Create(
                        modifiers:
                        UnifiedSet <UnifiedModifier> .Create(
                            UnifiedModifier.Create("..."))));
            }
            return(parameters);
        }
 //JavaScriptでは型パラメータは出現しない
 public override bool Visit(
     UnifiedSet <UnifiedGenericParameter> element, VisitorArgument arg)
 {
     return(false);
 }
 //JavaScriptでは例外型の列挙は出現しない
 public override bool Visit(
     UnifiedSet <UnifiedType> element, VisitorArgument arg)
 {
     return(false);
 }
 //現在は使用されていない
 public override bool Visit(
     UnifiedSet <UnifiedExpression> element, VisitorArgument arg)
 {
     throw new InvalidOperationException();
 }
Пример #22
0
        CreateDeclarationSpecifiers(XElement node)
        {
            Contract.Requires(node != null);
            Contract.Requires(node.Name() == "declaration_specifiers");

            /*	declaration_specifiers
             * :   ( storage_class_specifier
             *       |   type_specifier
             *       |   type_qualifier      )+
             */
            var modifiers = UnifiedSet <UnifiedModifier> .Create();

            IList <UnifiedType> types       = new List <UnifiedType>();
            UnifiedExpression   declaration = null;

            foreach (var e in node.Elements())
            {
                switch (e.Name())
                {
                case "storage_class_specifier":
                    modifiers.Add(CreateStorageClassSpecifier(e));
                    break;

                case "type_specifier":
                    var typeSpecifier = CreateTypeSpecifier(e);
                    if (typeSpecifier.GetType().Equals(typeof(UnifiedType)))
                    {
                        types.Add((UnifiedType)CreateTypeSpecifier(e));
                    }
                    else
                    {
                        declaration = typeSpecifier;
                    }
                    break;

                case "type_qualifier":
                    //TODO: const または volatileのことであるが、安直にリストに追加していいか要確認
                    modifiers.Add(CreateTypeQualifier(e));
                    break;

                default:
                    throw new InvalidOperationException();
                }
            }
            // 修飾子が空の場合はnullにする
            if (modifiers.IsEmpty())
            {
                modifiers = null;
            }

            if (declaration != null)
            {
                return(Tuple.Create(modifiers, declaration));
            }

            UnifiedExpression type;

            if (types.Count == 1)
            {
                type = types[0];
            }
            else
            {
                var s      = "";
                var prefix = "";
                // TODO unsigned int, long long int などは そのまま1つの型で表されるのか?
                foreach (var t in types)
                {
                    s += prefix
                         + ((UnifiedVariableIdentifier)t.BasicTypeName).Name;
                    prefix = " ";
                }
                type = UnifiedType.Create(UnifiedVariableIdentifier.Create(s));
            }
            return(Tuple.Create(modifiers, type));
        }
 //現在は使用されていない
 public override bool Visit(
         UnifiedSet<UnifiedExpression> element, VisitorArgument arg)
 {
     throw new InvalidOperationException();
 }
 public override bool Visit(
         UnifiedSet<UnifiedModifier> element, VisitorArgument arg)
 {
     VisitCollection(element, arg.Set(SpaceDelimiter));
     return false;
 }
Пример #25
0
 public override bool Visit(
     UnifiedSet<UnifiedTypeConstrain> element, VisitorArgument arg)
 {
     UnifiedTypeConstrain last = null;
     foreach (var current in element) {
         if (last == null) {
             current.TryAccept(this, arg.Set(NullDelimiter));
         } else {
             current.TryAccept(this, arg.Set(ColonDelimiter));
         }
         last = current;
     }
     return false;
 }
Пример #26
0
 // e.g. Foo<A, B> ?
 public override bool Visit(
     UnifiedSet <UnifiedGenericParameter> element, VisitorArgument arg)
 {
     VisitCollection(element, arg.Set(InequalitySignParen));
     return(false);
 }
 public override bool Visit(
         UnifiedSet<UnifiedAnnotation> element, VisitorArgument arg)
 {
     return false;
 }
Пример #28
0
		public static UnifiedVariableDefinition CreateVariableDeclarator
				(
				XElement node, UnifiedSet<UnifiedAnnotation> annotations,
				UnifiedSet<UnifiedModifier> modifiers, UnifiedType type) {
			Contract.Requires(node != null);
			Contract.Requires(node.Name() == "variableDeclarator");
			/*
			 * variableDeclarator 
			 * :   IDENTIFIER ('[' ']')* ('=' variableInitializer)? 
			 */
			var initializer = node.HasElement("variableInitializer")
									? CreateVariableInitializer(
											node.Element(
													"variableInitializer"))
									: null;
			var dimension = node.ElementsByContent("[").Count();
			type = type.WrapArrayRepeatedly(dimension);

			return UnifiedVariableDefinition.Create(
					annotations, modifiers, type,
					UnifiedVariableIdentifier.Create(node.FirstElement().Value),
					initializer
					);
		}
 //継承 : JavaScriptでは出現しない
 public override bool Visit(
         UnifiedSet<UnifiedTypeConstrain> element, VisitorArgument arg)
 {
     return false;
 }
 public override bool Visit(
         UnifiedSet<UnifiedExpression> element, VisitorArgument arg)
 {
     VisitCollection(element, arg);
     return false;
 }
Пример #31
0
 public UnifiedType WrapRectangleArray(
     UnifiedSet<UnifiedArgument> arguments = null)
 {
     return new UnifiedArrayType {
             Type = this,
             Arguments = arguments,
     };
 }
 public override bool Visit(
     UnifiedSet <UnifiedIdentifier> element, VisitorArgument arg)
 {
     VisitCollection(element, arg.Set(CommaDelimiter));
     return(false);
 }
Пример #33
0
        public UnifiedElement VisitTypeDeclaration(
            TypeDeclaration dec, object data)
        {
            var attrs      = dec.Attributes.AcceptVisitorAsAttrs(this, data);
            var mods       = LookupModifiers(dec.Modifiers);
            var name       = UnifiedVariableIdentifier.Create(dec.Name);
            var typeParams = dec.TypeParameters.AcceptVisitorAsTypeParams(
                this, data);

            if (typeParams.Count == 0)
            {
                typeParams = null;
            }
            var extends = dec.BaseTypes.AcceptVisitorAsConstrains(this, data);
            var body    = UnifiedBlock.Create();

            foreach (var node in dec.Members)
            {
                var uExpr = node.TryAcceptForExpression(this);
                if (uExpr != null)
                {
                    body.Add(uExpr);
                }
            }
            // set constraint
            var dic = CreateDictionary(dec.Constraints);

            if (typeParams != null)
            {
                foreach (
                    var generic in
                    typeParams.Descendants <UnifiedGenericParameter>(

                        ))
                {
                    var tName = GetTypeName(generic.Type);
                    if (dic.ContainsKey(tName))
                    {
                        foreach (var c in dic[tName])
                        {
                            if (generic.Constrains == null)
                            {
                                generic.Constrains =
                                    UnifiedSet <UnifiedTypeConstrain> .Create();
                            }
                            generic.Constrains.Add(c.DeepCopy());
                        }
                    }
                }
            }
            foreach (
                var generic in
                extends.Descendants <UnifiedGenericParameter>())
            {
                var tName = GetTypeName(generic.Type);
                if (dic.ContainsKey(tName))
                {
                    foreach (var c in dic[tName])
                    {
                        if (generic.Constrains == null)
                        {
                            generic.Constrains =
                                UnifiedSet <UnifiedTypeConstrain> .Create();
                        }
                        generic.Constrains.Add(c.DeepCopy());
                    }
                }
            }

            switch (dec.ClassType)
            {
            case ClassType.Class:
                return(UnifiedClassDefinition.Create(
                           attrs, mods, name, typeParams, extends, body));

            case ClassType.Struct:
                return(UnifiedStructDefinition.Create(
                           attrs, mods, name, typeParams, extends, body));

            case ClassType.Interface:
                return(UnifiedInterfaceDefinition.Create(
                           attrs, mods, name, typeParams, extends, body));

            case ClassType.Enum:
                return(UnifiedEnumDefinition.Create(
                           attrs, mods, name, typeParams, extends, body));
            }
            var msg = "LookupClassKind : " + dec.ClassType + "には対応していません。";

            throw new InvalidOperationException(msg);
        }
 public override bool Visit(
     UnifiedSet <UnifiedArgument> element, VisitorArgument arg)
 {
     VisitCollection(element, arg);
     return(false);
 }
 public override bool Visit(
         UnifiedSet<UnifiedParameter> element, VisitorArgument arg)
 {
     VisitCollection(element, arg.Set(Paren));
     return false;
 }
 public override bool Visit(
     UnifiedSet <UnifiedParameter> element, VisitorArgument arg)
 {
     VisitCollection(element, arg.Set(Paren));
     return(false);
 }
 // e.g. {...}catch(Exception1 e1){...}catch{Exception2 e2}{....}... ?
 public override bool Visit(
         UnifiedSet<UnifiedCatch> element, VisitorArgument arg)
 {
     VisitCollection(element, arg.Set(NewLineDelimiter));
     return false;
 }
 //JavaScriptでは修飾子は出現しない
 public override bool Visit(
         UnifiedSet<UnifiedModifier> element, VisitorArgument arg)
 {
     return false;
 }
 public override bool Visit(
         UnifiedSet<UnifiedGenericArgument> element, VisitorArgument arg)
 {
     VisitCollection(element, arg.Set(InequalitySignParen));
     return false;
 }
 //JavaScriptでは型パラメータは出現しない
 public override bool Visit(
         UnifiedSet<UnifiedGenericParameter> element, VisitorArgument arg)
 {
     return false;
 }
Пример #41
0
 public override bool Visit(
     UnifiedSet <UnifiedModifier> element, VisitorArgument arg)
 {
     VisitCollection(element, arg.Set(SpaceEachRight));
     return(false);
 }
Пример #42
0
 // e.g. throws E1, E2 ...
 public override bool Visit(
     UnifiedSet <UnifiedType> element, VisitorArgument arg)
 {
     VisitCollection(element, arg.Set(Throws));
     return(false);
 }
        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);
        }
Пример #44
0
 // e.g. {...}catch(Exception1 e1){...}catch{Exception2 e2}{....}... ?
 public override bool Visit(
     UnifiedSet <UnifiedCatch> element, VisitorArgument arg)
 {
     VisitCollection(element, arg.Set(NewLineDelimiter));
     return(false);
 }
Пример #45
0
 private void AssertContains(IEnumerable <NodeWithPropertyValues> iterable, params NodeWithPropertyValues[] expected)
 {
     assertEquals(UnifiedSet.newSetWith(expected), UnifiedSet.newSet(iterable));
 }
Пример #46
0
        public static UnifiedExpression CreateSelectionStatement(XElement node)
        {
            Contract.Requires(node != null);
            Contract.Requires(node.Name() == "selection_statement");

            /*
             * selection_statement
             * : 'if' '(' expression ')' statement (options {k=1; backtrack=false;}:'else' statement)?
             | 'switch' '(' expression ')' statement
             */

            // TODO switch文のstatementについて、{}がないと単一のstatementしか取得できないため対応を考える
            // TODO switchNest.c

            switch (node.FirstElement().Value)
            {
            case "if":
                var statements = node.Elements("statement");
                var trueBlock  = CreateStatement(statements.ElementAt(0));
                // statementが2つある場合はelse文がある
                if (statements.Count() == 2)
                {
                    return
                        (UnifiedIf.Create(
                             CreateExpression(node.NthElement(2)).First(),
                             trueBlock.ToBlock(),
                             CreateStatement(statements.ElementAt(1)).
                             ToBlock()));
                }
                return
                    (UnifiedIf.Create(
                         CreateExpression(node.NthElement(2)).First(),
                         trueBlock.ToBlock()));

            case "switch":
                // statementの中身を解析して、この関数内で直接UnifiedCaseを生成します。
                // labeled_statementから辿って、このノードに到達するまでにlabeled_statementがなければ、
                // そのlabeled_statementはこのノードのケース文です
                var cases = UnifiedSet <UnifiedCase> .Create();

                var labels = node.DescendantsAndSelf("labeled_statement")
                             // Ignore label statements for goto
                             .Where(e => e.FirstElement().Name != "IDENTIFIER")
                             // Ignore label statements of nested switches
                             .Where(
                    e =>
                    !e.AncestorsUntil(node).Any(
                        e2 =>
                        e2.Name == "selection_statement" &&
                        e2.Value.StartsWith("switch")));

                foreach (var e in labels)
                {
                    cases.Add(CreateCaseOrDefault(e));
                }
                return
                    (UnifiedSwitch.Create(
                         CreateExpression(node.NthElement(2)).First(),
                         cases));

            default:
                throw new InvalidOperationException();
            }
        }