Ejemplo n.º 1
0
        public static UnifiedParameter CreateParameterDeclaration(XElement node)
        {
            Contract.Requires(node != null);
            Contract.Requires(node.Name() == "parameter_declaration");

            /*
             * parameter_declaration
             * : declaration_specifiers (declarator|abstract_declarator)*
             */

            UnifiedIdentifier             name;
            UnifiedSet <UnifiedParameter> parameters;

            var modifiersAndType =
                CreateDeclarationSpecifiers(
                    node.Element("declaration_specifiers"));
            var modifiers = modifiersAndType.Item1;
            var type      = (UnifiedType)modifiersAndType.Item2;

            var declarators = node.Elements("declarator");

            if (declarators.Count() == 0)
            {
                return(UnifiedParameter.Create(null, modifiers, type));
            }
            var declarator = CreateDeclarator(node.FirstElement("declarator"));

            // abstract_declaratorはおそらく[]など=> よって、最初に現れることはないはず( // TODO 未検証)

            if (node.Element("abstract_declarator") != null)
            {
                // TODO (int y[])の場合は、[]はどこに付くのか?
                throw new NotImplementedException();
            }
            // TODO 実際のところ、そこまで理解しきれていない
            else if (declarators.Count() == 1)
            {
                // 多分declarator自体は1つしか現れないはず( // TODO 未検証)
                return(UnifiedParameter.Create(
                           null, modifiers, type, declarator.Item1.ToSet()));
            }
            else if (node.Element("declarator") != null)
            {
                parameters = declarator.Item2;
                name       = declarator.Item1;
                if (parameters != null && parameters.Count > 0)
                {
                    // この場合はパラメータが関数ポインタ
                    var returnType = type;
                    type = UnifiedType.Create(
                        UnifiedFunctionDefinition.Create(
                            null, modifiers, returnType, null, null,
                            parameters));
                    modifiers = null;
                }
                return(UnifiedParameter.Create(
                           null, modifiers, type, name.ToSet(), null));
            }
            throw new InvalidOperationException();
        }
Ejemplo n.º 2
0
        public UnifiedElement VisitParameterDeclaration(
            ParameterDeclaration dec, object data)
        {
            var attrs        = dec.Attributes.AcceptVisitorAsAttrs(this, data);
            var mods         = LookupModifier(dec.ParameterModifier).ToSet();
            var type         = LookupType(dec.Type);
            var names        = dec.Name.ToVariableIdentifier().ToSet <UnifiedIdentifier>();
            var defaultValue = dec.DefaultExpression.TryAcceptForExpression(
                this);

            return(UnifiedParameter.Create(
                       attrs, mods, type, names, defaultValue));
        }
Ejemplo n.º 3
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);
        }