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();
        }
 public override bool Visit(
         UnifiedParameter element, VisitorArgument arg)
 {
     element.Annotations.TryAccept(this, arg);
     element.Modifiers.TryAccept(this, arg);
     element.Names.TryAccept(this, arg.Set(CommaDelimiter));
     if (element.DefaultValue != null) {
         Writer.Write(" = ");
         element.DefaultValue.TryAccept(this, arg);
     }
     return false;
 }
Ejemplo n.º 3
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.º 4
0
 public override bool Visit(
     UnifiedParameter element, VisitorArgument arg)
 {
     element.Annotations.TryAccept(this, arg);
     element.Modifiers.TryAccept(this, arg);
     element.Names.TryAccept(this, arg.Set(CommaDelimiter));
     if (element.DefaultValue != null)
     {
         Writer.Write(" = ");
         element.DefaultValue.TryAccept(this, arg);
     }
     return(false);
 }
        public override bool Visit(
            UnifiedParameter element, VisitorArgument arg)
        {
            element.Annotations.TryAccept(this, arg);
            var isVariableLength = false;

            if (!element.Modifiers.IsEmptyOrNull())
            {
                var newModifiers = element.Modifiers.DeepCopy();
                isVariableLength = newModifiers.Remove(m => m.Name == "...");
                newModifiers.TryAccept(this, arg);
            }
            element.Type.TryAccept(this, arg);
            Writer.Write(" ");
            if (isVariableLength)
            {
                Writer.Write("... ");
            }
            element.Names.TryAccept(this, arg.Set(CommaDelimiter));
            return(false);
        }
Ejemplo n.º 6
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);
        }
 public override bool Visit(
         UnifiedParameter element, VisitorArgument arg)
 {
     element.Annotations.TryAccept(this, arg);
     var isVariableLength = false;
     if (!element.Modifiers.IsEmptyOrNull()) {
         var newModifiers = element.Modifiers.DeepCopy();
         isVariableLength = newModifiers.Remove(m => m.Name == "...");
         newModifiers.TryAccept(this, arg);
     }
     element.Type.TryAccept(this, arg);
     Writer.Write(" ");
     if (isVariableLength) {
         Writer.Write("... ");
     }
     element.Names.TryAccept(this, arg.Set(CommaDelimiter));
     return false;
 }
 //仮引数
 public override bool Visit(
         UnifiedParameter element, VisitorArgument arg)
 {
     element.Names.TryAccept(this, arg);
     return false;
 }
        // パラメータ(UnifiedParameter)
        // TODO 可変長引数について調査する
        public override bool Visit(
				UnifiedParameter element, VisitorArgument arg)
        {
            element.Modifiers.TryAccept(this, arg);
            element.Type.TryAccept(this, arg);
            Writer.Write(" ");
            element.Names.TryAccept(this, arg.Set(CommaDelimiter));
            return false;
        }
Ejemplo n.º 10
0
 //仮引数
 public override bool Visit(
     UnifiedParameter element, VisitorArgument arg)
 {
     element.Names.TryAccept(this, arg);
     return(false);
 }