Beispiel #1
0
        public static UnifiedVariableDefinitionList CreateStructDeclaration(
            XElement node)
        {
            Contract.Requires(node != null);
            Contract.Requires(node.Name() == "struct_declaration");

            /*
             * struct_declaration
             * : specifier_qualifier_list struct_declarator_list ';'
             */

            var modifiersAndType = CreateSpecifierQualifierList(
                node.Element("specifier_qualifier_list"));
            var modifiers = modifiersAndType.Item1;
            var type      = modifiersAndType.Item2;

            var structDeclaratorList = node.Element("struct_declarator_list");
            UnifiedVariableDefinitionList variables = null;

            if (structDeclaratorList != null)
            {
                variables = UnifiedVariableDefinitionList.Create(
                    CreateStructDeclaratorList(structDeclaratorList).
                    Select(
                        e =>
                        UnifiedVariableDefinition.Create(
                            null, modifiers, type, e.Item1,
                            e.Item2)));
            }
            return(variables);
        }
Beispiel #2
0
        public static UnifiedExpression CreateDeclaration(XElement node)
        {
            // TODO なぜかここのcontractにひっかかる
            //			Contract.Requires(node != null);
            //			Contract.Requires(node.Name() == "declaration");

            /*
             * declaration
             * :	'typedef' declaration_specifiers? {$declaration::isTypedef=true;}
             *      init_declarator_list ';' // special case, looking for typedef
             | declaration_specifiers init_declarator_list? ';'
             */

            var firstNode = node.FirstElement();

            switch (firstNode.Name())
            {
            case "TOKEN":
                // TODO このケースになるプログラムが未検証
                // typedef int S8; はいいけれど、これに初期化子も付けられるのが謎
                throw new NotImplementedException();
                break;

            // TODO プロトタイプ宣言はどう扱うか決める
            case "declaration_specifiers":
                // const int a = 0;
                // struct data { int x; }; => ここもこれになるのだけど、扱いはどうすれば
                var modifiersAndType = CreateDeclarationSpecifiers(firstNode);
                var modifiers        = modifiersAndType.Item1;
                var type             = modifiersAndType.Item2;     // TODO 返り値をtypeじゃなくす

                var initDeclaratorList = node.Element("init_declarator_list");
                if (initDeclaratorList == null)
                {
                    return(type.DeepCopy());
                }
                else
                {
                    UnifiedVariableDefinitionList variables = null;
                    variables = UnifiedVariableDefinitionList.Create(
                        CreateInitDeclaratorList(initDeclaratorList).
                        Select(
                            e =>
                            UnifiedVariableDefinition.Create(
                                null,
                                modifiers.DeepCopy(),
                                (UnifiedType)type.DeepCopy(),
                                e.Item1, e.Item2)));
                    return(variables);
                }

            default:
                throw new InvalidOperationException();
            }
        }
Beispiel #3
0
        public override bool Visit(
            UnifiedVariableDefinitionList element, VisitorArgument arg)
        {
            var klass = element.GrandParent() as UnifiedEnumDefinition;

            if (klass != null)
            {
                VisitCollection(element, arg.Set(CommaDelimiter));
            }
            else
            {
                VisitCollection(element, arg.Set(SemiColonDelimiter));
            }
            return(true);
        }
 //変数宣言リスト : e.g. var a = 1, b = 2;
 public override bool Visit(
     UnifiedVariableDefinitionList element, VisitorArgument arg)
 {
     //for文の初期条件内では変数宣言を分解して出力できないため、
     //あらかじめ'var'を出力しておいて各UnifiedVariableDefinitionでは'var'を出力しない
     if (element.Parent.GetType() == typeof(UnifiedFor))
     {
         Writer.Write("var ");
         VisitCollection(element, arg.Set(CommaDelimiter));
     }
     else
     {
         VisitCollection(element, arg.Set(SemiColonDelimiter));
     }
     return(true);
 }
Beispiel #5
0
        public static UnifiedBlock CreateEnumeratorList(XElement node)
        {
            Contract.Requires(node != null);
            Contract.Requires(node.Name() == "enumerator_list");

            /*
             * enumerator_list
             * : enumerator (',' enumerator)*
             */

            var enumerators =
                node.Elements("enumerator").Select(CreateEnumerator);

            return
                (UnifiedBlock.Create(
                     UnifiedVariableDefinitionList.Create(enumerators)));
        }
 public override bool Visit(
         UnifiedVariableDefinitionList element, VisitorArgument arg)
 {
     var klass = element.GrandParent() as UnifiedEnumDefinition;
     if (klass != null) {
         VisitCollection(element, arg.Set(CommaDelimiter));
     } else {
         VisitCollection(element, arg.Set(SemiColonDelimiter));
     }
     return true;
 }
Beispiel #7
0
        public override bool Visit(
            UnifiedVariableDefinitionList element, VisitorArgument arg)
        {
            if (element.GrandParent() is UnifiedEnumDefinition)
            {
                var comma = "";
                foreach (var varDef in element)
                {
                    Writer.Write(comma);
                    varDef.Annotations.TryAccept(this, arg);
                    varDef.Modifiers.TryAccept(this, arg);
                    varDef.Type.TryAccept(this, arg);
                    Writer.Write(" ");
                    varDef.Name.TryAccept(this, arg);
                    varDef.Arguments.TryAccept(this, arg.Set(Paren));
                    if (varDef.InitialValue != null)
                    {
                        Writer.Write(" = ");
                        varDef.InitialValue.TryAccept(this, arg.Set(Brace));
                    }
                    varDef.Body.TryAccept(this, arg.Set(ForBlock));
                    comma = ", ";
                }
                return(true);
            }

            // アノテーションの場合は String value() default "test";
            var setterSign =
                element.GrandParent() is UnifiedAnnotationDefinition
                                                        ? " default " : " = ";

            // 変数宣言を一つにまとめて出力
            // int a, b[];
            // ArrayList<Integer> a, b[];
            var commonTypeStr = "";
            var isFirst       = true;

            foreach (var varDef in element)
            {
                if (isFirst)
                {
                    varDef.Annotations.TryAccept(this, arg);
                    varDef.Modifiers.TryAccept(this, arg);
                    commonTypeStr = GetString(varDef.Type, arg);
                    Writer.Write(commonTypeStr + " ");
                    varDef.Name.TryAccept(this, arg);
                    isFirst = false;
                }
                else
                {
                    Writer.Write(", ");
                    varDef.Name.TryAccept(this, arg);
                    Writer.Write(
                        GetString(varDef.Type, arg).Substring(
                            commonTypeStr.Length));
                }
                varDef.Arguments.TryAccept(this, arg.Set(Paren));

                if (varDef.InitialValue != null)
                {
                    if (varDef.Modifiers != null &&
                        varDef.Modifiers.Any(m => m.Name == "static"))
                    {
                        Writer.Write(" = ");
                    }
                    else
                    {
                        Writer.Write(setterSign);
                    }
                    varDef.InitialValue.TryAccept(this, arg.Set(Brace));
                }
                varDef.Body.TryAccept(this, arg.Set(ForBlock));
            }
            return(true);
        }
        // 変数定義(UnifiedVariableDefinitionList)
        public override bool Visit(
            UnifiedVariableDefinitionList element, VisitorArgument arg)
        {
            // enumとしての変数宣言リストの場合
            // e.g. enum { RED, BLUE, YELLOW }のRED, BLUE, YELLOW
            if (element.GrandParent() is UnifiedEnumDefinition)
            {
                var comma = "";
                foreach (var e in element)
                {
                    Writer.Write(comma);
                    e.Name.TryAccept(this, arg);
                    if (e.InitialValue != null)
                    {
                        Writer.Write(" = ");
                        e.InitialValue.TryAccept(this, arg);
                    }
                    comma = ", ";
                }
                return(false);
            }

            // 通常の変数宣言リストの場合
            // 変数宣言を1つにまとめて出力する
            // e.g. int a, b[];

            /*
             * 統合コードオブジェクト上では、int a, b[]のような変数宣言は
             * int aとint[] bの2つの変数宣言に分割してオブジェクト化されている。
             * これらを再度1つの変数宣言式として出力するために、最初の変数宣言のみ型を出力し、
             * 以降では最初の変数宣言の型(commonTypeStr)と異なる場合のみ、その型の差分を出力する
             */
            var commonTypeStr = "";
            var isFirst       = true;

            foreach (var e in element)
            {
                if (isFirst)
                {
                    e.Modifiers.TryAccept(this, arg);
                    // TODO なぜか修飾子の後で改行される問題を調査する
                    commonTypeStr = GetString(e.Type, arg);
                    Writer.Write(commonTypeStr + " ");
                    e.Name.TryAccept(this, arg);
                    isFirst = false;
                }
                else
                {
                    Writer.Write(", ");
                    e.Name.TryAccept(this, arg);
                    Writer.Write(
                        GetString(e.Type, arg).Substring(
                            commonTypeStr.Length));
                }

                // 初期化子がある場合にはそれを出力する
                if (e.InitialValue != null)
                {
                    Writer.Write(" = ");
                    e.InitialValue.TryAccept(this, arg);
                }
            }
            return(true);
        }
 //変数宣言リスト : e.g. var a = 1, b = 2;
 public override bool Visit(
         UnifiedVariableDefinitionList element, VisitorArgument arg)
 {
     //for文の初期条件内では変数宣言を分解して出力できないため、
     //あらかじめ'var'を出力しておいて各UnifiedVariableDefinitionでは'var'を出力しない
     if (element.Parent.GetType() == typeof(UnifiedFor)) {
         Writer.Write("var ");
         VisitCollection(element, arg.Set(CommaDelimiter));
     } else {
         VisitCollection(element, arg.Set(SemiColonDelimiter));
     }
     return true;
 }