Пример #1
0
        public static UnifiedType CreateStructOrUnionSpecifier(XElement node)
        {
            Contract.Requires(node != null);
            Contract.Requires(node.Name() == "struct_or_union_specifier");

            /*	struct_or_union_specifier
             * : struct_or_union IDENTIFIER? '{' struct_declaration_list '}'
             * | struct_or_union IDENTIFIER
             */
            // 構造体の定義と宣言の両方をこのメソッドで作成
            // 常に UnifiedType を返すが、
            // 構造体定義をしている場合だけ関数の呼び出し元で UnifiedType の中身をとりだす

            // typedef "struct {}" data; -> クラス?
            // "struct data {}"; -> クラス
            // "struct data" a; -> 型

            var isStruct   = CreateStructOrUnion(node.FirstElement()) == "struct";
            var identifier = node.Element("IDENTIFIER");
            var typeName   = identifier == null
                                                                   ? null
                                                                   : UnifiedVariableIdentifier.Create(
                identifier.Value);

            // 型の場合
            if (node.Elements().Count() == 2)
            {
                var baseType = UnifiedType.Create(typeName);
                return(isStruct ? baseType.WrapStruct() : baseType.WrapUnion());
            }

            // struct or union の定義がある場合
            var body =
                CreateStructDeclarationList(
                    node.Element("struct_declaration_list"));
            var structOrUnion = isStruct
                                                                                ? (UnifiedClassLikeDefinition)
                                UnifiedStructDefinition.
                                Create(
                name: typeName,
                body: body)
                                                                                : UnifiedUnionDefinition.Create(
                name: typeName, body: body);

            // TODO struct or unionはあくまでもTypeとして返すののか?
            return(UnifiedType.Create(structOrUnion));
        }
 public override bool Visit(
         UnifiedUnionDefinition element, VisitorArgument arg)
 {
     return Visit(element, arg, "class");
 }
 public override bool Visit(
         UnifiedUnionDefinition element, VisitorArgument arg)
 {
     throw new NotImplementedException();
 }
 public override bool Visit(
     UnifiedUnionDefinition element, VisitorArgument arg)
 {
     return(Visit(element, arg, "class"));
 }
Пример #5
0
 public override bool Visit(
     UnifiedUnionDefinition element, VisitorArgument arg)
 {
     throw new NotImplementedException();
 }