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 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)); }
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); }