3 // cs-parser.jay: The Parser for the C# compiler
5 // Authors: Miguel de Icaza (miguel@gnome.org)
6 // Ravi Pratap (ravi@ximian.com)
7 // Marek Safar (marek.safar@gmail.com)
9 // Dual Licensed under the terms of the GNU GPL and the MIT X11 license
11 // (C) 2001 Ximian, Inc (http://www.ximian.com)
12 // (C) 2004-2011 Novell, Inc
13 // Copyright 2011-2012 Xamarin Inc.
19 using System.Collections.Generic;
26 public class CSharpParser
29 enum ParameterModifierType
36 DefaultValue = 1 << 6,
38 All = Ref | Out | This | Params | Arglist | DefaultValue,
39 PrimaryConstructor = Ref | Out | Params | DefaultValue
42 static readonly object ModifierNone = 0;
44 NamespaceContainer current_namespace;
45 TypeContainer current_container;
46 TypeDefinition current_type;
47 PropertyBase current_property;
48 EventProperty current_event;
49 EventField current_event_field;
50 FieldBase current_field;
53 /// Current block is used to add statements as we find
58 BlockVariable current_variable;
60 Delegate current_delegate;
62 AnonymousMethodExpression current_anonymous_method;
65 /// This is used by the unary_expression code to resolve
66 /// a name against a parameter.
69 // FIXME: This is very ugly and it's very hard to reset it correctly
70 // on all places, especially when some parameters are autogenerated.
71 ParametersCompiled current_local_parameters;
73 bool parsing_anonymous_method;
78 /// An out-of-band stack.
80 Stack<object> oob_stack;
83 /// Controls the verbosity of the errors produced by the parser
85 int yacc_verbose_flag;
88 /// Used by the interactive shell, flags whether EOF was reached
89 /// and an error was produced
91 public bool UnexpectedEOF;
96 readonly CompilationSourceFile file;
99 /// Temporary Xml documentation cache.
100 /// For enum types, we need one more temporary store.
103 string enumTypeComment;
105 /// Current attribute target
106 string current_attr_target;
108 ParameterModifierType valid_param_mod;
110 bool default_parameter_used;
112 /// When using the interactive parser, this holds the
113 /// resulting expression
114 public Class InteractiveResult;
117 // Keeps track of global data changes to undo on parser error
121 bool? interactive_async;
123 Stack<Linq.QueryBlock> linq_clause_blocks;
125 ModuleContainer module;
127 readonly CompilerContext compiler;
128 readonly LanguageVersion lang_version;
129 readonly bool doc_support;
130 readonly CompilerSettings settings;
131 readonly Report report;
134 // Instead of allocating carrier array everytime we
135 // share the bucket for very common constructs which can never
138 List<Parameter> parameters_bucket;
141 // Full AST support members
144 List<Tuple<Modifiers, Location>> mod_locations;
145 Stack<Location> location_stack;
149 %token NONE /* This token is never returned by our lexer */
150 %token ERROR // This is used not by the parser, but by the tokenizer.
154 *These are the C# keywords
253 %token INTERR_NULLABLE
260 %token INTERR_OPERATOR
262 %token INTERPOLATED_STRING
263 %token INTERPOLATED_STRING_END
265 /* C# keywords which are not really keywords */
271 /* C# single character operators/punctuation. */
299 /* C# multi-character operators. */
304 %token OP_SHIFT_RIGHT
311 %token OP_MULT_ASSIGN
316 %token OP_SHIFT_LEFT_ASSIGN
317 %token OP_SHIFT_RIGHT_ASSIGN
324 /* Generics <,> tokens */
325 %token OP_GENERICS_LT
326 %token OP_GENERICS_LT_DECL
327 %token OP_GENERICS_GT
332 %token OPEN_PARENS_LAMBDA
333 %token OPEN_PARENS_CAST
334 %token GENERIC_DIMENSION
336 %token OPEN_BRACKET_EXPR
338 // Make the parser go into eval mode parsing (statements and compilation units).
339 %token EVAL_STATEMENT_PARSER
340 %token EVAL_COMPILATION_UNIT_PARSER
341 %token EVAL_USING_DECLARATIONS_UNIT_PARSER
346 // This token is generated to trigger the completion engine at this point
348 %token GENERATE_COMPLETION
351 // This token is return repeatedly after the first GENERATE_COMPLETION
352 // token is produced and before the final EOF
354 %token COMPLETE_COMPLETION
356 /* Add precedence rules to solve dangling else s/r conflict */
360 /* Define the operator tokens and their precedences */
368 %left OP_SHIFT_LEFT OP_SHIFT_RIGHT
370 %left STAR DIV PERCENT
371 %right BANG CARRET UMINUS
372 %nonassoc OP_INC OP_DEC
374 %left OPEN_BRACKET OPEN_BRACE
377 %start compilation_unit
381 : outer_declaration opt_EOF
383 Lexer.check_incorrect_doc_comment ();
385 | interactive_parsing { Lexer.CompleteOnEOF = false; } opt_EOF
386 | documentation_parsing
390 : opt_extern_alias_directives opt_using_directives
391 | opt_extern_alias_directives opt_using_directives namespace_or_type_declarations opt_attributes
394 Attributes attrs = (Attributes) $4;
395 report.Error (1730, attrs.Attrs [0].Location,
396 "Assembly and module attributes must precede all other elements except using clauses and extern alias declarations");
398 current_namespace.UnattachedAttributes = attrs;
401 | opt_extern_alias_directives opt_using_directives attribute_sections
403 Attributes attrs = (Attributes) $3;
405 foreach (var a in attrs.Attrs) {
406 if (a.ExplicitTarget == "assembly" || a.ExplicitTarget == "module")
409 if (a.ExplicitTarget == null)
410 report.Error (-1671, a.Location, "Global attributes must have attribute target specified");
414 module.AddAttributes ((Attributes) $3, current_namespace);
418 if (yyToken == Token.EXTERN_ALIAS)
419 report.Error (439, lexer.Location, "An extern alias declaration must precede all other elements");
421 Error_SyntaxError (yyToken);
430 extern_alias_directives
431 : extern_alias_directive
432 | extern_alias_directives extern_alias_directive
435 extern_alias_directive
436 : EXTERN_ALIAS IDENTIFIER IDENTIFIER SEMICOLON
438 var lt = (LocatedToken) $2;
441 syntax_error (lt.Location, "`alias' expected");
443 if (lang_version == LanguageVersion.ISO_1)
444 FeatureIsNotAvailable (lt.Location, "external alias");
446 lt = (LocatedToken) $3;
447 if (lt.Value == QualifiedAliasMember.GlobalAlias) {
448 RootNamespace.Error_GlobalNamespaceRedefined (report, lt.Location);
451 var na = new UsingExternAlias (new SimpleMemberName (lt.Value, lt.Location), GetLocation ($1));
452 current_namespace.AddUsing (na);
454 lbag.AddLocation (na, GetLocation ($2), GetLocation ($4));
459 Error_SyntaxError (yyToken);
465 | using_directives using_directive
472 Lexer.doc_state = XmlCommentState.Allowed;
477 : USING opt_static namespace_or_type_expr SEMICOLON
481 if (lang_version <= LanguageVersion.V_5)
482 FeatureIsNotAvailable (GetLocation ($2), "using static");
484 uc = new UsingType ((ATypeNameExpression) $3, GetLocation ($1));
485 lbag.AddLocation (uc, GetLocation ($2), GetLocation ($4));
487 uc = new UsingNamespace ((ATypeNameExpression) $3, GetLocation ($1));
488 lbag.AddLocation (uc, GetLocation ($4));
491 current_namespace.AddUsing (uc);
493 | USING opt_static IDENTIFIER ASSIGN namespace_or_type_expr SEMICOLON
495 var lt = (LocatedToken) $3;
496 if (lang_version != LanguageVersion.ISO_1 && lt.Value == "global") {
497 report.Warning (440, 2, lt.Location,
498 "An alias named `global' will not be used when resolving `global::'. The global namespace will be used instead");
502 report.Error (8085, GetLocation ($2), "A `using static' directive cannot be used to declare an alias");
505 var un = new UsingAliasNamespace (new SimpleMemberName (lt.Value, lt.Location), (ATypeNameExpression) $5, GetLocation ($1));
506 current_namespace.AddUsing (un);
508 lbag.AddLocation (un, GetLocation ($4), GetLocation ($6));
512 Error_SyntaxError (yyToken);
523 // Strictly speaking, namespaces don't have attributes but
524 // we parse global attributes along with namespace declarations and then
527 namespace_declaration
528 : opt_attributes NAMESPACE namespace_name
530 Attributes attrs = (Attributes) $1;
531 var name = (MemberName) $3;
533 bool valid_global_attrs = true;
534 if ((current_namespace.DeclarationFound || current_namespace != file)) {
535 valid_global_attrs = false;
537 foreach (var a in attrs.Attrs) {
538 if (a.ExplicitTarget == "assembly" || a.ExplicitTarget == "module")
541 valid_global_attrs = false;
546 if (!valid_global_attrs)
547 report.Error (1671, name.Location, "A namespace declaration cannot have modifiers or attributes");
550 module.AddAttributes (attrs, current_namespace);
552 var ns = new NamespaceContainer (name, current_namespace);
553 current_namespace.AddTypeContainer (ns);
554 current_container = current_namespace = ns;
559 Lexer.doc_state = XmlCommentState.Allowed;
561 opt_extern_alias_directives opt_using_directives opt_namespace_or_type_declarations CLOSE_BRACE opt_semicolon_error
564 lbag.AddLocation (current_container, GetLocation ($2), GetLocation ($5), GetLocation ($10), GetLocation ($11));
566 lbag.AddLocation (current_container, GetLocation ($2), GetLocation ($5), GetLocation ($10));
568 current_container = current_namespace = current_namespace.Parent;
570 | opt_attributes NAMESPACE namespace_name
572 report.Error (1514, lexer.Location, "Unexpected symbol `{0}', expecting `.' or `{{'", GetSymbolName (yyToken));
574 var name = (MemberName) $3;
575 var ns = new NamespaceContainer (name, current_namespace);
576 lbag.AddLocation (ns, GetLocation ($2));
577 current_namespace.AddTypeContainer (ns);
586 Error_SyntaxError (yyToken);
594 var lt = (LocatedToken) $1;
595 $$ = new MemberName (lt.Value, lt.Location);
597 | namespace_name DOT IDENTIFIER
599 var lt = (LocatedToken) $3;
600 $$ = new MemberName ((MemberName) $1, lt.Value, lt.Location);
601 lbag.AddLocation ($$, GetLocation ($2));
605 Error_SyntaxError (yyToken);
606 $$ = new MemberName ("<invalid>", lexer.Location);
625 opt_extern_alias_directives
627 | extern_alias_directives
630 opt_namespace_or_type_declarations
632 | namespace_or_type_declarations
635 namespace_or_type_declarations
636 : namespace_or_type_declaration
637 | namespace_or_type_declarations namespace_or_type_declaration
640 namespace_or_type_declaration
644 TypeContainer ds = (TypeContainer)$1;
646 if ((ds.ModFlags & (Modifiers.PRIVATE | Modifiers.PROTECTED)) != 0){
647 report.Error (1527, ds.Location,
648 "Namespace elements cannot be explicitly declared as private, protected or protected internal");
651 // Here is a trick, for explicit attributes we don't know where they belong to until
652 // we parse succeeding declaration hence we parse them as normal and re-attach them
653 // when we know whether they are global (assembly:, module:) or local (type:).
654 if (ds.OptAttributes != null) {
655 ds.OptAttributes.ConvertGlobalAttributes (ds, current_namespace, !current_namespace.DeclarationFound && current_namespace == file);
658 current_namespace.DeclarationFound = true;
660 | namespace_declaration
662 current_namespace.DeclarationFound = true;
664 | attribute_sections CLOSE_BRACE {
665 current_namespace.UnattachedAttributes = (Attributes) $1;
666 report.Error (1518, lexer.Location, "Attributes must be attached to class, delegate, enum, interface or struct");
674 | interface_declaration
676 | delegate_declaration
678 // Enable this when we have handled all errors, because this acts as a generic fallback
681 // Console.WriteLine ("Token=" + yyToken);
682 // report.Error (1518, GetLocation ($1), "Expected class, struct, interface, enum or delegate");
698 var sect = (List<Attribute>) $1;
699 $$ = new Attributes (sect);
701 | attribute_sections attribute_section
703 Attributes attrs = $1 as Attributes;
704 var sect = (List<Attribute>) $2;
706 attrs = new Attributes (sect);
707 else if (sect != null)
708 attrs.AddAttributes (sect);
716 PushLocation (GetLocation ($1));
717 lexer.parsing_attribute_section = true;
719 attribute_section_cont
721 lexer.parsing_attribute_section = false;
726 attribute_section_cont
727 : attribute_target COLON
729 current_attr_target = (string) $1;
730 if (current_attr_target == "assembly" || current_attr_target == "module") {
731 Lexer.check_incorrect_doc_comment ();
734 attribute_list opt_comma CLOSE_BRACKET
736 // when attribute target is invalid
737 if (current_attr_target == string.Empty)
738 $$ = new List<Attribute> (0);
742 lbag.InsertLocation ($$, 0, PopLocation ());
744 lbag.AddLocation ($$, GetLocation ($2), GetLocation ($5), GetLocation ($6));
746 lbag.AddLocation ($$, GetLocation ($2), GetLocation ($6));
749 current_attr_target = null;
750 lexer.parsing_attribute_section = false;
752 | attribute_list opt_comma CLOSE_BRACKET
756 lbag.InsertLocation ($$, 0, PopLocation ());
758 lbag.AddLocation ($$, GetLocation($2), GetLocation ($3));
760 lbag.AddLocation ($$, GetLocation($3));
765 Error_SyntaxError (yyToken);
767 var lt = (LocatedToken) $1;
768 var tne = new SimpleName (lt.Value, null, lt.Location);
770 $$ = new List<Attribute> () {
771 new Attribute (null, tne, null, GetLocation ($1), false)
776 if (CheckAttributeTarget (yyToken, GetTokenName (yyToken), GetLocation ($1)).Length > 0)
777 Error_SyntaxError (yyToken);
786 var lt = (LocatedToken) $1;
787 $$ = CheckAttributeTarget (yyToken, lt.Value, lt.Location);
789 | EVENT { $$ = "event"; }
790 | RETURN { $$ = "return"; }
796 $$ = new List<Attribute> (4) { (Attribute) $1 };
798 | attribute_list COMMA attribute
800 var attrs = (List<Attribute>) $1;
802 attrs.Add ((Attribute) $3);
803 lbag.AppendTo (attrs, GetLocation ($2));
813 ++lexer.parsing_block;
815 opt_attribute_arguments
817 --lexer.parsing_block;
819 var tne = (ATypeNameExpression) $1;
820 if (tne.HasTypeArguments) {
821 report.Error (404, tne.Location, "Attributes cannot be generic");
824 $$ = new Attribute (current_attr_target, tne, (Arguments[]) $3, GetLocation ($1), lexer.IsEscapedIdentifier (tne));
829 : namespace_or_type_expr
832 opt_attribute_arguments
833 : /* empty */ { $$ = null; }
834 | OPEN_PARENS attribute_arguments CLOSE_PARENS
842 : /* empty */ { $$ = null; }
843 | positional_or_named_argument
845 Arguments a = new Arguments (4);
846 a.Add ((Argument) $1);
847 $$ = new Arguments [] { a, null };
849 | named_attribute_argument
851 Arguments a = new Arguments (4);
852 a.Add ((Argument) $1);
853 $$ = new Arguments [] { null, a };
855 | attribute_arguments COMMA positional_or_named_argument
857 Arguments[] o = (Arguments[]) $1;
859 report.Error (1016, ((Argument) $3).Expr.Location, "Named attribute arguments must appear after the positional arguments");
860 o [0] = new Arguments (4);
863 Arguments args = ((Arguments) o [0]);
864 if (args.Count > 0 && !($3 is NamedArgument) && args [args.Count - 1] is NamedArgument)
865 Error_NamedArgumentExpected ((NamedArgument) args [args.Count - 1]);
867 args.Add ((Argument) $3);
869 | attribute_arguments COMMA named_attribute_argument
871 Arguments[] o = (Arguments[]) $1;
873 o [1] = new Arguments (4);
876 ((Arguments) o [1]).Add ((Argument) $3);
880 positional_or_named_argument
883 $$ = new Argument ((Expression) $1);
888 Error_SyntaxError (yyToken);
893 named_attribute_argument
896 ++lexer.parsing_block;
900 --lexer.parsing_block;
901 var lt = (LocatedToken) $1;
902 $$ = new NamedArgument (lt.Value, lt.Location, (Expression) $4);
903 lbag.AddLocation ($$, GetLocation($2));
908 : identifier_inside_body COLON opt_named_modifier named_argument_expr
910 if (lang_version <= LanguageVersion.V_3)
911 FeatureIsNotAvailable (GetLocation ($1), "named argument");
913 // Avoid boxing in common case (no modifier)
914 var arg_mod = $3 == null ? Argument.AType.None : (Argument.AType) $3;
916 var lt = (LocatedToken) $1;
917 $$ = new NamedArgument (lt.Value, lt.Location, (Expression) $4, arg_mod);
918 lbag.AddLocation ($$, GetLocation($2));
923 : expression_or_error
924 // | declaration_expression
928 : /* empty */ { $$ = null; }
931 $$ = Argument.AType.Ref;
935 $$ = Argument.AType.Out;
939 opt_class_member_declarations
941 | class_member_declarations
944 class_member_declarations
945 : class_member_declaration
947 lexer.parsing_modifiers = true;
948 lexer.parsing_block = 0;
950 | class_member_declarations class_member_declaration
952 lexer.parsing_modifiers = true;
953 lexer.parsing_block = 0;
957 class_member_declaration
958 : constant_declaration
961 | property_declaration
963 | indexer_declaration
964 | operator_declaration
965 | constructor_declaration
966 | primary_constructor_body
967 | destructor_declaration
969 | attributes_without_members
973 report.Error (1519, lexer.Location, "Unexpected symbol `{0}' in class, struct, or interface member declaration",
974 GetSymbolName (yyToken));
976 lexer.parsing_generic_declaration = false;
980 primary_constructor_body
983 current_local_parameters = current_type.PrimaryConstructorParameters;
984 if (current_local_parameters == null) {
985 report.Error (9010, GetLocation ($1), "Primary constructor body is not allowed");
986 current_local_parameters = ParametersCompiled.EmptyReadOnlyParameters;
989 ++lexer.parsing_block;
990 start_block (GetLocation ($1));
992 opt_statement_list block_end
994 current_local_parameters = null;
995 var t = current_type as ClassOrStruct;
997 var b = (ToplevelBlock) $4;
998 if (t.PrimaryConstructorBlock != null) {
999 report.Error (8041, b.StartLocation, "Primary constructor already has a body");
1001 t.PrimaryConstructorBlock = b;
1014 type_declaration_name
1016 lexer.ConstraintsParsing = true;
1017 valid_param_mod = ParameterModifierType.PrimaryConstructor;
1018 push_current_container (new Struct (current_container, (MemberName) $6, (Modifiers) $2, (Attributes) $1), $3);
1020 opt_primary_parameters
1022 opt_type_parameter_constraints_clauses
1024 valid_param_mod = 0;
1025 lexer.ConstraintsParsing = false;
1028 current_type.PrimaryConstructorParameters = (ParametersCompiled) $8;
1031 current_container.SetConstraints ((List<Constraints>) $10);
1034 current_container.PartialContainer.DocComment = Lexer.consume_doc_comment ();
1036 lbag.AddMember (current_container, mod_locations, GetLocation ($4));
1038 lexer.parsing_modifiers = true;
1043 Lexer.doc_state = XmlCommentState.Allowed;
1045 opt_class_member_declarations CLOSE_BRACE
1047 --lexer.parsing_declaration;
1049 Lexer.doc_state = XmlCommentState.Allowed;
1054 lbag.AppendToMember (current_container, GetLocation ($12), GetLocation ($15));
1056 lbag.AppendToMember (current_container, GetLocation ($12), GetLocation ($15), GetLocation ($17));
1058 $$ = pop_current_class ();
1060 | opt_attributes opt_modifiers opt_partial STRUCT error
1062 Error_SyntaxError (yyToken);
1066 constant_declaration
1069 CONST type IDENTIFIER
1071 var lt = (LocatedToken) $5;
1072 var mod = (Modifiers) $2;
1073 current_field = new Const (current_type, (FullNamedExpression) $4, mod, new MemberName (lt.Value, lt.Location), (Attributes) $1);
1074 current_type.AddMember (current_field);
1076 if ((mod & Modifiers.STATIC) != 0) {
1077 report.Error (504, current_field.Location, "The constant `{0}' cannot be marked static", current_field.GetSignatureForError ());
1082 constant_initializer opt_constant_declarators SEMICOLON
1085 current_field.DocComment = Lexer.consume_doc_comment ();
1086 Lexer.doc_state = XmlCommentState.Allowed;
1089 current_field.Initializer = (ConstInitializer) $7;
1090 lbag.AddMember (current_field, mod_locations, GetLocation ($3), GetLocation ($9));
1091 current_field = null;
1097 Error_SyntaxError (yyToken);
1099 current_type.AddMember (new Const (current_type, (FullNamedExpression) $4, (Modifiers) $2, MemberName.Null, (Attributes) $1));
1103 opt_constant_declarators
1105 | constant_declarators
1108 constant_declarators
1109 : constant_declarator
1111 current_field.AddDeclarator ((FieldDeclarator) $1);
1113 | constant_declarators constant_declarator
1115 current_field.AddDeclarator ((FieldDeclarator) $2);
1120 : COMMA IDENTIFIER constant_initializer
1122 var lt = (LocatedToken) $2;
1123 $$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), (ConstInitializer) $3);
1124 lbag.AddLocation ($$, GetLocation ($1));
1128 constant_initializer
1131 ++lexer.parsing_block;
1133 constant_initializer_expr
1135 --lexer.parsing_block;
1136 $$ = new ConstInitializer (current_field, (Expression) $3, GetLocation ($1));
1140 report.Error (145, lexer.Location, "A const field requires a value to be provided");
1145 constant_initializer_expr
1146 : constant_expression
1153 member_type IDENTIFIER
1155 lexer.parsing_generic_declaration = false;
1157 FullNamedExpression type = (FullNamedExpression) $3;
1158 if (type.Type != null && type.Type.Kind == MemberKind.Void)
1159 report.Error (670, GetLocation ($3), "Fields cannot have void type");
1161 var lt = (LocatedToken) $4;
1162 current_field = new Field (current_type, type, (Modifiers) $2, new MemberName (lt.Value, lt.Location), (Attributes) $1);
1163 current_type.AddField (current_field);
1166 opt_field_initializer
1167 opt_field_declarators
1171 current_field.DocComment = Lexer.consume_doc_comment ();
1172 Lexer.doc_state = XmlCommentState.Allowed;
1175 lbag.AddMember (current_field, mod_locations, GetLocation ($8));
1177 current_field = null;
1181 FIXED simple_type IDENTIFIER
1183 if (lang_version < LanguageVersion.ISO_2)
1184 FeatureIsNotAvailable (GetLocation ($3), "fixed size buffers");
1186 var lt = (LocatedToken) $5;
1187 current_field = new FixedField (current_type, (FullNamedExpression) $4, (Modifiers) $2,
1188 new MemberName (lt.Value, lt.Location), (Attributes) $1);
1190 current_type.AddField (current_field);
1192 fixed_field_size opt_fixed_field_declarators SEMICOLON
1195 current_field.DocComment = Lexer.consume_doc_comment ();
1196 Lexer.doc_state = XmlCommentState.Allowed;
1199 current_field.Initializer = (ConstInitializer) $7;
1200 lbag.AddMember (current_field, mod_locations, GetLocation ($9));
1202 current_field = null;
1206 FIXED simple_type error
1209 report.Error (1641, GetLocation ($5), "A fixed size buffer field must have the array size specifier after the field name");
1213 opt_field_initializer
1217 ++lexer.parsing_block;
1218 current_local_parameters = ParametersCompiled.EmptyReadOnlyParameters;
1219 start_block (GetLocation ($1));
1221 variable_initializer
1223 --lexer.parsing_block;
1224 current_field.Initializer = (Expression) $3;
1225 lbag.AppendToMember (current_field, GetLocation ($1));
1226 end_block (lexer.Location);
1227 current_local_parameters = null;
1231 opt_field_declarators
1239 current_field.AddDeclarator ((FieldDeclarator) $1);
1241 | field_declarators field_declarator
1243 current_field.AddDeclarator ((FieldDeclarator) $2);
1250 var lt = (LocatedToken) $2;
1251 $$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), null);
1252 lbag.AddLocation ($$, GetLocation ($1));
1254 | COMMA IDENTIFIER ASSIGN
1256 ++lexer.parsing_block;
1258 variable_initializer
1260 --lexer.parsing_block;
1261 var lt = (LocatedToken) $2;
1262 $$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), (Expression) $5);
1263 lbag.AddLocation ($$, GetLocation ($1), GetLocation ($3));
1267 opt_fixed_field_declarators
1269 | fixed_field_declarators
1272 fixed_field_declarators
1273 : fixed_field_declarator
1275 current_field.AddDeclarator ((FieldDeclarator) $1);
1277 | fixed_field_declarators fixed_field_declarator
1279 current_field.AddDeclarator ((FieldDeclarator) $2);
1283 fixed_field_declarator
1284 : COMMA IDENTIFIER fixed_field_size
1286 var lt = (LocatedToken) $2;
1287 $$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), (ConstInitializer) $3);
1288 lbag.AddLocation ($$, GetLocation ($1));
1295 ++lexer.parsing_block;
1297 expression CLOSE_BRACKET
1299 --lexer.parsing_block;
1300 $$ = new ConstInitializer (current_field, (Expression) $3, GetLocation ($1));
1301 lbag.AddLocation ($$, GetLocation ($4));
1303 | OPEN_BRACKET error
1305 report.Error (443, lexer.Location, "Value or constant expected");
1310 variable_initializer
1315 // It has to be here for the parent to safely restore artificial block
1316 Error_SyntaxError (yyToken);
1325 Lexer.doc_state = XmlCommentState.NotAllowed;
1327 // Was added earlier in the case of body being eof for full ast
1329 method_body_expression_block
1331 Method method = (Method) $1;
1332 method.Block = (ToplevelBlock) $3;
1333 async_block = false;
1335 if (method.Block == null) {
1336 method.ParameterInfo.CheckParameters (method);
1338 if ((method.ModFlags & Modifiers.ASYNC) != 0) {
1339 report.Error (1994, method.Location, "`{0}': The async modifier can only be used with methods that have a body",
1340 method.GetSignatureForError ());
1343 if (current_container.Kind == MemberKind.Interface) {
1344 report.Error (531, method.Location, "`{0}': interface members cannot have a definition",
1345 method.GetSignatureForError ());
1349 current_local_parameters = null;
1352 Lexer.doc_state = XmlCommentState.Allowed;
1360 method_declaration_name OPEN_PARENS
1362 valid_param_mod = ParameterModifierType.All;
1364 opt_formal_parameter_list CLOSE_PARENS
1366 valid_param_mod = 0;
1367 MemberName name = (MemberName) $4;
1368 current_local_parameters = (ParametersCompiled) $7;
1370 var method = Method.Create (current_type, (FullNamedExpression) $3, (Modifiers) $2,
1371 name, current_local_parameters, (Attributes) $1);
1373 current_type.AddMember (method);
1375 async_block = (method.ModFlags & Modifiers.ASYNC) != 0;
1378 method.DocComment = Lexer.consume_doc_comment ();
1380 lbag.AddMember (method, mod_locations, GetLocation ($5), GetLocation ($8));
1384 lexer.ConstraintsParsing = true;
1386 opt_type_parameter_constraints_clauses
1388 lexer.ConstraintsParsing = false;
1391 var method = (Method) $9;
1392 method.SetConstraints ((List<Constraints>) $10);
1402 lexer.parsing_generic_declaration = true;
1404 method_declaration_name
1407 lexer.parsing_generic_declaration = false;
1408 valid_param_mod = ParameterModifierType.All;
1410 opt_formal_parameter_list CLOSE_PARENS
1412 lexer.ConstraintsParsing = true;
1414 opt_type_parameter_constraints_clauses
1416 lexer.ConstraintsParsing = false;
1417 valid_param_mod = 0;
1419 MemberName name = (MemberName) $6;
1420 current_local_parameters = (ParametersCompiled) $9;
1422 var modifiers = (Modifiers) $2;
1423 modifiers |= Modifiers.PARTIAL;
1425 var method = Method.Create (current_type, new TypeExpression (compiler.BuiltinTypes.Void, GetLocation ($4)),
1426 modifiers, name, current_local_parameters, (Attributes) $1);
1428 current_type.AddMember (method);
1430 async_block = (method.ModFlags & Modifiers.ASYNC) != 0;
1433 method.SetConstraints ((List<Constraints>) $12);
1436 method.DocComment = Lexer.consume_doc_comment ();
1438 StoreModifierLocation (Modifiers.PARTIAL, GetLocation ($3));
1439 lbag.AddMember (method, mod_locations, GetLocation ($7), GetLocation ($10));
1445 modifiers method_declaration_name OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS
1447 MemberName name = (MemberName) $5;
1448 report.Error (1585, name.Location,
1449 "Member modifier `{0}' must precede the member type and name", ModifiersExtensions.Name ((Modifiers) $4));
1451 var method = Method.Create (current_type, (FullNamedExpression) $3,
1452 0, name, (ParametersCompiled) $7, (Attributes) $1);
1454 current_type.AddMember (method);
1456 current_local_parameters = (ParametersCompiled) $7;
1459 method.DocComment = Lexer.consume_doc_comment ();
1466 method_declaration_name error
1468 Error_SyntaxError (yyToken);
1469 current_local_parameters = ParametersCompiled.Undefined;
1471 MemberName name = (MemberName) $4;
1472 var method = Method.Create (current_type, (FullNamedExpression) $3, (Modifiers) $2,
1473 name, current_local_parameters, (Attributes) $1);
1475 current_type.AddMember (method);
1478 method.DocComment = Lexer.consume_doc_comment ();
1484 method_body_expression_block
1491 | SEMICOLON { $$ = null; }
1497 if (lang_version < LanguageVersion.V_6) {
1498 FeatureIsNotAvailable (GetLocation ($1), "expression bodied members");
1501 ++lexer.parsing_block;
1502 start_block (GetLocation ($1));
1504 expression SEMICOLON
1506 lexer.parsing_block = 0;
1507 current_block.AddStatement (new ContextualReturn ((Expression) $3));
1508 var b = end_block (GetLocation ($4));
1509 b.IsCompilerGenerated = true;
1514 opt_formal_parameter_list
1515 : /* empty */ { $$ = ParametersCompiled.EmptyReadOnlyParameters; }
1516 | formal_parameter_list
1519 formal_parameter_list
1522 var pars_list = (List<Parameter>) $1;
1523 $$ = new ParametersCompiled (pars_list.ToArray ());
1525 | fixed_parameters COMMA parameter_array
1527 var pars_list = (List<Parameter>) $1;
1528 pars_list.Add ((Parameter) $3);
1530 $$ = new ParametersCompiled (pars_list.ToArray ());
1532 | fixed_parameters COMMA arglist_modifier
1534 var pars_list = (List<Parameter>) $1;
1535 pars_list.Add (new ArglistParameter (GetLocation ($3)));
1536 $$ = new ParametersCompiled (pars_list.ToArray (), true);
1538 | parameter_array COMMA error
1541 report.Error (231, ((Parameter) $1).Location, "A params parameter must be the last parameter in a formal parameter list");
1543 $$ = new ParametersCompiled (new Parameter[] { (Parameter) $1 } );
1545 | fixed_parameters COMMA parameter_array COMMA error
1548 report.Error (231, ((Parameter) $3).Location, "A params parameter must be the last parameter in a formal parameter list");
1550 var pars_list = (List<Parameter>) $1;
1551 pars_list.Add (new ArglistParameter (GetLocation ($3)));
1553 $$ = new ParametersCompiled (pars_list.ToArray (), true);
1555 | arglist_modifier COMMA error
1557 report.Error (257, GetLocation ($1), "An __arglist parameter must be the last parameter in a formal parameter list");
1559 $$ = new ParametersCompiled (new Parameter [] { new ArglistParameter (GetLocation ($1)) }, true);
1561 | fixed_parameters COMMA ARGLIST COMMA error
1563 report.Error (257, GetLocation ($3), "An __arglist parameter must be the last parameter in a formal parameter list");
1565 var pars_list = (List<Parameter>) $1;
1566 pars_list.Add (new ArglistParameter (GetLocation ($3)));
1568 $$ = new ParametersCompiled (pars_list.ToArray (), true);
1572 $$ = new ParametersCompiled (new Parameter[] { (Parameter) $1 } );
1576 $$ = new ParametersCompiled (new Parameter [] { new ArglistParameter (GetLocation ($1)) }, true);
1580 Error_SyntaxError (yyToken);
1581 $$ = ParametersCompiled.EmptyReadOnlyParameters;
1588 parameters_bucket.Clear ();
1589 Parameter p = (Parameter) $1;
1590 parameters_bucket.Add (p);
1592 default_parameter_used = p.HasDefaultValue;
1593 $$ = parameters_bucket;
1595 | fixed_parameters COMMA fixed_parameter
1597 var pars = (List<Parameter>) $1;
1598 Parameter p = (Parameter) $3;
1600 if (p.HasExtensionMethodModifier)
1601 report.Error (1100, p.Location, "The parameter modifier `this' can only be used on the first parameter");
1602 else if (!p.HasDefaultValue && default_parameter_used)
1603 report.Error (1737, p.Location, "Optional parameter cannot precede required parameters");
1605 default_parameter_used |= p.HasDefaultValue;
1608 lbag.AddLocation (p, GetLocation ($2));
1617 opt_parameter_modifier
1619 identifier_inside_body
1621 var lt = (LocatedToken) $4;
1622 $$ = new Parameter ((FullNamedExpression) $3, lt.Value, (Parameter.Modifier) $2, (Attributes) $1, lt.Location);
1625 opt_parameter_modifier
1627 identifier_inside_body OPEN_BRACKET CLOSE_BRACKET
1629 var lt = (LocatedToken) $4;
1630 report.Error (1552, lt.Location, "Array type specifier, [], must appear before parameter name");
1631 $$ = new Parameter ((FullNamedExpression) $3, lt.Value, (Parameter.Modifier) $2, (Attributes) $1, lt.Location);
1633 | attribute_sections error
1635 Error_SyntaxError (yyToken);
1636 Location l = GetLocation ($2);
1637 $$ = new Parameter (null, null, Parameter.Modifier.NONE, (Attributes) $1, l);
1640 opt_parameter_modifier
1644 Error_SyntaxError (yyToken);
1645 Location l = GetLocation ($4);
1646 $$ = new Parameter ((FullNamedExpression) $3, null, (Parameter.Modifier) $2, (Attributes) $1, l);
1649 opt_parameter_modifier
1651 identifier_inside_body
1654 ++lexer.parsing_block;
1658 --lexer.parsing_block;
1659 if (lang_version <= LanguageVersion.V_3) {
1660 FeatureIsNotAvailable (GetLocation ($5), "optional parameter");
1663 Parameter.Modifier mod = (Parameter.Modifier) $2;
1664 if (mod != Parameter.Modifier.NONE) {
1666 case Parameter.Modifier.REF:
1667 case Parameter.Modifier.OUT:
1668 report.Error (1741, GetLocation ($2), "Cannot specify a default value for the `{0}' parameter",
1669 Parameter.GetModifierSignature (mod));
1672 case Parameter.Modifier.This:
1673 report.Error (1743, GetLocation ($2), "Cannot specify a default value for the `{0}' parameter",
1674 Parameter.GetModifierSignature (mod));
1677 throw new NotImplementedException (mod.ToString ());
1680 mod = Parameter.Modifier.NONE;
1683 if ((valid_param_mod & ParameterModifierType.DefaultValue) == 0)
1684 report.Error (1065, GetLocation ($5), "Optional parameter is not valid in this context");
1686 var lt = (LocatedToken) $4;
1687 $$ = new Parameter ((FullNamedExpression) $3, lt.Value, mod, (Attributes) $1, lt.Location);
1688 lbag.AddLocation ($$, GetLocation ($5));
1691 ((Parameter) $$).DefaultValue = new DefaultParameterValueExpression ((Expression) $7);
1695 opt_parameter_modifier
1696 : /* empty */ { $$ = Parameter.Modifier.NONE; }
1697 | parameter_modifiers
1701 : parameter_modifier
1705 | parameter_modifiers parameter_modifier
1707 Parameter.Modifier p2 = (Parameter.Modifier)$2;
1708 Parameter.Modifier mod = (Parameter.Modifier)$1 | p2;
1709 if (((Parameter.Modifier)$1 & p2) == p2) {
1710 Error_DuplicateParameterModifier (lexer.Location, p2);
1712 switch (mod & ~Parameter.Modifier.This) {
1713 case Parameter.Modifier.REF:
1714 report.Error (1101, lexer.Location, "The parameter modifiers `this' and `ref' cannot be used altogether");
1716 case Parameter.Modifier.OUT:
1717 report.Error (1102, lexer.Location, "The parameter modifiers `this' and `out' cannot be used altogether");
1720 report.Error (1108, lexer.Location, "A parameter cannot have specified more than one modifier");
1731 if ((valid_param_mod & ParameterModifierType.Ref) == 0)
1732 Error_ParameterModifierNotValid ("ref", GetLocation ($1));
1734 $$ = Parameter.Modifier.REF;
1738 if ((valid_param_mod & ParameterModifierType.Out) == 0)
1739 Error_ParameterModifierNotValid ("out", GetLocation ($1));
1741 $$ = Parameter.Modifier.OUT;
1745 if ((valid_param_mod & ParameterModifierType.This) == 0)
1746 Error_ParameterModifierNotValid ("this", GetLocation ($1));
1748 if (lang_version <= LanguageVersion.ISO_2)
1749 FeatureIsNotAvailable (GetLocation ($1), "extension methods");
1751 $$ = Parameter.Modifier.This;
1756 : opt_attributes params_modifier type IDENTIFIER
1758 var lt = (LocatedToken) $4;
1759 $$ = new ParamsParameter ((FullNamedExpression) $3, lt.Value, (Attributes) $1, lt.Location);
1761 | opt_attributes params_modifier type IDENTIFIER ASSIGN constant_expression
1763 report.Error (1751, GetLocation ($2), "Cannot specify a default value for a parameter array");
1765 var lt = (LocatedToken) $4;
1766 $$ = new ParamsParameter ((FullNamedExpression) $3, lt.Value, (Attributes) $1, lt.Location);
1768 | opt_attributes params_modifier type error
1770 Error_SyntaxError (yyToken);
1772 $$ = new ParamsParameter ((FullNamedExpression) $3, null, (Attributes) $1, Location.Null);
1779 if ((valid_param_mod & ParameterModifierType.Params) == 0)
1780 report.Error (1670, (GetLocation ($1)), "The `params' modifier is not allowed in current context");
1782 | PARAMS parameter_modifier
1784 Parameter.Modifier mod = (Parameter.Modifier)$2;
1785 if ((mod & Parameter.Modifier.This) != 0) {
1786 report.Error (1104, GetLocation ($1), "The parameter modifiers `this' and `params' cannot be used altogether");
1788 report.Error (1611, GetLocation ($1), "The params parameter cannot be declared as ref or out");
1791 | PARAMS params_modifier
1793 Error_DuplicateParameterModifier (GetLocation ($1), Parameter.Modifier.PARAMS);
1800 if ((valid_param_mod & ParameterModifierType.Arglist) == 0)
1801 report.Error (1669, GetLocation ($1), "__arglist is not valid in this context");
1805 property_declaration
1809 member_declaration_name
1811 lexer.parsing_generic_declaration = false;
1813 tmpComment = Lexer.consume_doc_comment ();
1817 var type = (FullNamedExpression) $3;
1818 current_property = new Property (current_type, type, (Modifiers) $2,
1819 (MemberName) $4, (Attributes) $1);
1821 if (type.Type != null && type.Type.Kind == MemberKind.Void)
1822 report.Error (547, GetLocation ($3), "`{0}': property or indexer cannot have void type", current_property.GetSignatureForError ());
1824 current_type.AddMember (current_property);
1825 lbag.AddMember (current_property, mod_locations, GetLocation ($6));
1827 lexer.PropertyParsing = true;
1829 accessor_declarations
1831 lexer.PropertyParsing = false;
1834 current_property.DocComment = ConsumeStoredComment ();
1838 lbag.AppendToMember (current_property, GetLocation ($10));
1839 lexer.parsing_modifiers = true;
1841 opt_property_initializer
1843 current_property = null;
1848 member_declaration_name
1850 lexer.parsing_generic_declaration = false;
1852 tmpComment = Lexer.consume_doc_comment ();
1853 current_local_parameters = ParametersCompiled.EmptyReadOnlyParameters;
1857 var type = (FullNamedExpression) $3;
1858 var property = new Property (current_type, type, (Modifiers) $2,
1859 (MemberName) $4, (Attributes) $1);
1861 property.Get = new Property.GetMethod (property, Modifiers.COMPILER_GENERATED, null, property.Location);
1862 property.Get.Block = (ToplevelBlock) $6;
1864 if (current_container.Kind == MemberKind.Interface) {
1865 report.Error (531, property.Get.Block.StartLocation,
1866 "`{0}': interface members cannot have a definition", property.GetSignatureForError ());
1869 if (type.Type != null && type.Type.Kind == MemberKind.Void)
1870 report.Error (547, GetLocation ($3), "`{0}': property or indexer cannot have void type", property.GetSignatureForError ());
1873 property.DocComment = ConsumeStoredComment ();
1875 current_type.AddMember (property);
1877 current_local_parameters = null;
1881 opt_property_initializer
1885 ++lexer.parsing_block;
1886 current_local_parameters = ParametersCompiled.EmptyReadOnlyParameters;
1887 start_block (GetLocation ($1));
1889 property_initializer SEMICOLON
1891 --lexer.parsing_block;
1892 ((Property)current_property).Initializer = (Expression) $3;
1893 lbag.AppendToMember (current_property, GetLocation ($1), GetLocation ($4));
1894 end_block (GetLocation ($4));
1895 current_local_parameters = null;
1898 Lexer.doc_state = XmlCommentState.Allowed;
1902 property_initializer
1908 : opt_attributes opt_modifiers
1909 member_type indexer_declaration_name OPEN_BRACKET
1911 valid_param_mod = ParameterModifierType.Params | ParameterModifierType.DefaultValue;
1913 opt_formal_parameter_list CLOSE_BRACKET
1915 valid_param_mod = 0;
1916 var type = (FullNamedExpression) $3;
1917 Indexer indexer = new Indexer (current_type, type, (MemberName) $4, (Modifiers) $2, (ParametersCompiled) $7, (Attributes) $1);
1919 current_property = indexer;
1921 current_type.AddIndexer (indexer);
1922 lbag.AddMember (current_property, mod_locations, GetLocation ($5), GetLocation ($8));
1924 if (type.Type != null && type.Type.Kind == MemberKind.Void)
1925 report.Error (620, GetLocation ($3), "`{0}': indexer return type cannot be `void'", indexer.GetSignatureForError ());
1927 if (indexer.ParameterInfo.IsEmpty) {
1928 report.Error (1551, GetLocation ($5), "Indexers must have at least one parameter");
1932 tmpComment = Lexer.consume_doc_comment ();
1933 Lexer.doc_state = XmlCommentState.Allowed;
1936 lexer.PropertyParsing = true;
1937 current_local_parameters = (ParametersCompiled) $7;
1941 lexer.PropertyParsing = false;
1942 current_local_parameters = null;
1944 if (current_property.AccessorFirst != null && current_property.AccessorFirst.Block == null)
1945 ((Indexer) current_property).ParameterInfo.CheckParameters (current_property);
1948 current_property.DocComment = ConsumeStoredComment ();
1950 current_property = null;
1955 : OPEN_BRACE accessor_declarations CLOSE_BRACE
1957 lbag.AppendToMember (current_property, GetLocation ($1), GetLocation ($3));
1961 current_property.Get = new Indexer.GetIndexerMethod (current_property, Modifiers.COMPILER_GENERATED, current_local_parameters, null, current_property.Location);
1962 current_property.Get.Block = (ToplevelBlock) $1;
1966 accessor_declarations
1967 : get_accessor_declaration
1968 | get_accessor_declaration accessor_declarations
1969 | set_accessor_declaration
1970 | set_accessor_declaration accessor_declarations
1973 if (yyToken == Token.CLOSE_BRACE) {
1974 report.Error (548, lexer.Location, "`{0}': property or indexer must have at least one accessor", current_property.GetSignatureForError ());
1976 if (yyToken == Token.SEMICOLON)
1977 report.Error (1597, lexer.Location, "Semicolon after method or accessor block is not valid");
1979 report.Error (1014, GetLocation ($1), "A get or set accessor expected");
1984 get_accessor_declaration
1985 : opt_attributes opt_modifiers GET
1987 if ($2 != ModifierNone && lang_version == LanguageVersion.ISO_1) {
1988 FeatureIsNotAvailable (GetLocation ($2), "access modifiers on properties");
1991 if (current_property.Get != null) {
1992 report.Error (1007, GetLocation ($3), "Property accessor already defined");
1995 if (current_property is Indexer) {
1996 current_property.Get = new Indexer.GetIndexerMethod (current_property, (Modifiers) $2, ((Indexer)current_property).ParameterInfo.Clone (),
1997 (Attributes) $1, GetLocation ($3));
1999 current_property.Get = new Property.GetMethod (current_property,
2000 (Modifiers) $2, (Attributes) $1, GetLocation ($3));
2003 current_local_parameters = current_property.Get.ParameterInfo;
2004 lbag.AddMember (current_property.Get, mod_locations);
2005 lexer.PropertyParsing = false;
2010 current_property.Get.Block = (ToplevelBlock) $5;
2012 if (current_container.Kind == MemberKind.Interface) {
2013 report.Error (531, current_property.Get.Block.StartLocation,
2014 "`{0}': interface members cannot have a definition", current_property.Get.GetSignatureForError ());
2018 current_local_parameters = null;
2019 lexer.PropertyParsing = true;
2022 if (Lexer.doc_state == XmlCommentState.Error)
2023 Lexer.doc_state = XmlCommentState.NotAllowed;
2027 set_accessor_declaration
2028 : opt_attributes opt_modifiers SET
2030 if ($2 != ModifierNone && lang_version == LanguageVersion.ISO_1) {
2031 FeatureIsNotAvailable (GetLocation ($2), "access modifiers on properties");
2034 if (current_property.Set != null) {
2035 report.Error (1007, GetLocation ($3), "Property accessor already defined");
2038 if (current_property is Indexer) {
2039 current_property.Set = new Indexer.SetIndexerMethod (current_property, (Modifiers) $2,
2040 ParametersCompiled.MergeGenerated (compiler,
2041 ((Indexer)current_property).ParameterInfo, true, new Parameter (
2042 current_property.TypeExpression, "value", Parameter.Modifier.NONE, null, GetLocation ($3)),
2044 (Attributes) $1, GetLocation ($3));
2046 current_property.Set = new Property.SetMethod (current_property, (Modifiers) $2,
2047 ParametersCompiled.CreateImplicitParameter (current_property.TypeExpression, GetLocation ($3)),
2048 (Attributes) $1, GetLocation ($3));
2051 current_local_parameters = current_property.Set.ParameterInfo;
2052 lbag.AddMember (current_property.Set, mod_locations);
2053 lexer.PropertyParsing = false;
2058 current_property.Set.Block = (ToplevelBlock) $5;
2060 if (current_container.Kind == MemberKind.Interface) {
2061 report.Error (531, current_property.Set.Block.StartLocation,
2062 "`{0}': interface members cannot have a definition", current_property.Set.GetSignatureForError ());
2066 current_local_parameters = null;
2067 lexer.PropertyParsing = true;
2070 && Lexer.doc_state == XmlCommentState.Error)
2071 Lexer.doc_state = XmlCommentState.NotAllowed;
2085 Error_SyntaxError (1043, yyToken, "Invalid accessor body");
2091 interface_declaration
2098 type_declaration_name
2100 lexer.ConstraintsParsing = true;
2101 push_current_container (new Interface (current_container, (MemberName) $6, (Modifiers) $2, (Attributes) $1), $3);
2102 lbag.AddMember (current_container, mod_locations, GetLocation ($4));
2105 opt_type_parameter_constraints_clauses
2107 lexer.ConstraintsParsing = false;
2110 current_container.SetConstraints ((List<Constraints>) $9);
2113 current_container.PartialContainer.DocComment = Lexer.consume_doc_comment ();
2114 Lexer.doc_state = XmlCommentState.Allowed;
2117 lexer.parsing_modifiers = true;
2119 OPEN_BRACE opt_interface_member_declarations CLOSE_BRACE
2121 --lexer.parsing_declaration;
2123 Lexer.doc_state = XmlCommentState.Allowed;
2128 lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($13));
2130 lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($13), GetLocation ($15));
2132 $$ = pop_current_class ();
2134 | opt_attributes opt_modifiers opt_partial INTERFACE error
2136 Error_SyntaxError (yyToken);
2140 opt_interface_member_declarations
2142 | interface_member_declarations
2145 interface_member_declarations
2146 : interface_member_declaration
2148 lexer.parsing_modifiers = true;
2149 lexer.parsing_block = 0;
2151 | interface_member_declarations interface_member_declaration
2153 lexer.parsing_modifiers = true;
2154 lexer.parsing_block = 0;
2158 interface_member_declaration
2159 : constant_declaration
2161 report.Error (525, GetLocation ($1), "Interfaces cannot contain fields or constants");
2165 report.Error (525, GetLocation ($1), "Interfaces cannot contain fields or constants");
2167 | method_declaration
2168 | property_declaration
2170 | indexer_declaration
2171 | operator_declaration
2173 report.Error (567, GetLocation ($1), "Interfaces cannot contain operators");
2175 | constructor_declaration
2177 report.Error (526, GetLocation ($1), "Interfaces cannot contain contructors");
2181 report.Error (524, GetLocation ($1), "Interfaces cannot declare classes, structs, interfaces, delegates, or enumerations");
2185 operator_declaration
2186 : opt_attributes opt_modifiers operator_declarator
2189 method_body_expression_block
2191 OperatorDeclaration decl = (OperatorDeclaration) $3;
2193 Operator op = new Operator (
2194 current_type, decl.optype, decl.ret_type, (Modifiers) $2,
2195 current_local_parameters,
2196 (ToplevelBlock) $5, (Attributes) $1, decl.location);
2198 if (op.Block == null)
2199 op.ParameterInfo.CheckParameters (op);
2202 op.DocComment = tmpComment;
2203 Lexer.doc_state = XmlCommentState.Allowed;
2206 // Note again, checking is done in semantic analysis
2207 current_type.AddOperator (op);
2209 lbag.AddMember (op, mod_locations, lbag.GetLocations (decl));
2212 current_local_parameters = null;
2217 : type_expression_or_array
2220 report.Error (590, GetLocation ($1), "User-defined operators cannot return void");
2221 $$ = new TypeExpression (compiler.BuiltinTypes.Void, GetLocation ($1));
2226 : operator_type OPERATOR overloadable_operator OPEN_PARENS
2228 valid_param_mod = ParameterModifierType.DefaultValue;
2229 if ((Operator.OpType) $3 == Operator.OpType.Is)
2230 valid_param_mod |= ParameterModifierType.Out;
2232 opt_formal_parameter_list CLOSE_PARENS
2234 valid_param_mod = 0;
2236 Location loc = GetLocation ($2);
2237 Operator.OpType op = (Operator.OpType) $3;
2238 current_local_parameters = (ParametersCompiled)$6;
2240 int p_count = current_local_parameters.Count;
2242 if (op == Operator.OpType.Addition)
2243 op = Operator.OpType.UnaryPlus;
2244 else if (op == Operator.OpType.Subtraction)
2245 op = Operator.OpType.UnaryNegation;
2248 if (IsUnaryOperator (op)) {
2250 report.Error (1020, loc, "Overloadable binary operator expected");
2251 } else if (p_count != 1) {
2252 report.Error (1535, loc, "Overloaded unary operator `{0}' takes one parameter",
2253 Operator.GetName (op));
2255 } else if (op == Operator.OpType.Is) {
2256 // TODO: Special checks for is operator
2259 report.Error (1019, loc, "Overloadable unary operator expected");
2260 } else if (p_count != 2) {
2261 report.Error (1534, loc, "Overloaded binary operator `{0}' takes two parameters",
2262 Operator.GetName (op));
2267 tmpComment = Lexer.consume_doc_comment ();
2268 Lexer.doc_state = XmlCommentState.NotAllowed;
2271 $$ = new OperatorDeclaration (op, (FullNamedExpression) $1, loc);
2272 lbag.AddLocation ($$, GetLocation ($2), GetLocation ($3), GetLocation ($4), GetLocation ($7));
2274 | conversion_operator_declarator
2277 overloadable_operator
2279 : BANG { $$ = Operator.OpType.LogicalNot; }
2280 | TILDE { $$ = Operator.OpType.OnesComplement; }
2281 | OP_INC { $$ = Operator.OpType.Increment; }
2282 | OP_DEC { $$ = Operator.OpType.Decrement; }
2283 | TRUE { $$ = Operator.OpType.True; }
2284 | FALSE { $$ = Operator.OpType.False; }
2285 // Unary and binary:
2286 | PLUS { $$ = Operator.OpType.Addition; }
2287 | MINUS { $$ = Operator.OpType.Subtraction; }
2289 | STAR { $$ = Operator.OpType.Multiply; }
2290 | DIV { $$ = Operator.OpType.Division; }
2291 | PERCENT { $$ = Operator.OpType.Modulus; }
2292 | BITWISE_AND { $$ = Operator.OpType.BitwiseAnd; }
2293 | BITWISE_OR { $$ = Operator.OpType.BitwiseOr; }
2294 | CARRET { $$ = Operator.OpType.ExclusiveOr; }
2295 | OP_SHIFT_LEFT { $$ = Operator.OpType.LeftShift; }
2296 | OP_SHIFT_RIGHT { $$ = Operator.OpType.RightShift; }
2297 | OP_EQ { $$ = Operator.OpType.Equality; }
2298 | OP_NE { $$ = Operator.OpType.Inequality; }
2299 | OP_GT { $$ = Operator.OpType.GreaterThan; }
2300 | OP_LT { $$ = Operator.OpType.LessThan; }
2301 | OP_GE { $$ = Operator.OpType.GreaterThanOrEqual; }
2302 | OP_LE { $$ = Operator.OpType.LessThanOrEqual; }
2305 if (lang_version != LanguageVersion.Experimental)
2306 FeatureIsNotAvailable (GetLocation ($1), "is user operator");
2308 $$ = Operator.OpType.Is;
2312 conversion_operator_declarator
2313 : IMPLICIT OPERATOR type OPEN_PARENS
2315 valid_param_mod = ParameterModifierType.DefaultValue;
2317 opt_formal_parameter_list CLOSE_PARENS
2319 valid_param_mod = 0;
2321 Location loc = GetLocation ($2);
2322 current_local_parameters = (ParametersCompiled)$6;
2324 if (current_local_parameters.Count != 1) {
2325 report.Error (1535, loc, "Overloaded unary operator `implicit' takes one parameter");
2329 tmpComment = Lexer.consume_doc_comment ();
2330 Lexer.doc_state = XmlCommentState.NotAllowed;
2333 $$ = new OperatorDeclaration (Operator.OpType.Implicit, (FullNamedExpression) $3, loc);
2334 lbag.AddLocation ($$, GetLocation ($1), GetLocation ($2), GetLocation ($4), GetLocation ($7));
2336 | EXPLICIT OPERATOR type OPEN_PARENS
2338 valid_param_mod = ParameterModifierType.DefaultValue;
2340 opt_formal_parameter_list CLOSE_PARENS
2342 valid_param_mod = 0;
2344 Location loc = GetLocation ($2);
2345 current_local_parameters = (ParametersCompiled)$6;
2347 if (current_local_parameters.Count != 1) {
2348 report.Error (1535, loc, "Overloaded unary operator `explicit' takes one parameter");
2352 tmpComment = Lexer.consume_doc_comment ();
2353 Lexer.doc_state = XmlCommentState.NotAllowed;
2356 $$ = new OperatorDeclaration (Operator.OpType.Explicit, (FullNamedExpression) $3, loc);
2357 lbag.AddLocation ($$, GetLocation ($1), GetLocation ($2), GetLocation ($4), GetLocation ($7));
2361 Error_SyntaxError (yyToken);
2362 current_local_parameters = ParametersCompiled.EmptyReadOnlyParameters;
2363 $$ = new OperatorDeclaration (Operator.OpType.Implicit, null, GetLocation ($1));
2367 Error_SyntaxError (yyToken);
2368 current_local_parameters = ParametersCompiled.EmptyReadOnlyParameters;
2369 $$ = new OperatorDeclaration (Operator.OpType.Explicit, null, GetLocation ($1));
2373 constructor_declaration
2374 : constructor_declarator
2377 Constructor c = (Constructor) $1;
2378 c.Block = (ToplevelBlock) $2;
2381 c.DocComment = ConsumeStoredComment ();
2383 current_local_parameters = null;
2385 Lexer.doc_state = XmlCommentState.Allowed;
2389 constructor_declarator
2395 tmpComment = Lexer.consume_doc_comment ();
2396 Lexer.doc_state = XmlCommentState.Allowed;
2399 valid_param_mod = ParameterModifierType.All;
2401 OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS
2403 valid_param_mod = 0;
2404 current_local_parameters = (ParametersCompiled) $6;
2406 var lt = (LocatedToken) $3;
2407 var mods = (Modifiers) $2;
2408 var c = new Constructor (current_type, lt.Value, mods, (Attributes) $1, current_local_parameters, lt.Location);
2410 if (lt.Value != current_container.MemberName.Name) {
2411 report.Error (1520, c.Location, "Class, struct, or interface method must have a return type");
2412 } else if ((mods & Modifiers.STATIC) != 0) {
2413 if (!current_local_parameters.IsEmpty) {
2414 report.Error (132, c.Location, "`{0}': The static constructor must be parameterless",
2415 c.GetSignatureForError ());
2418 if ((mods & Modifiers.AccessibilityMask) != 0){
2419 report.Error (515, c.Location,
2420 "`{0}': static constructor cannot have an access modifier",
2421 c.GetSignatureForError ());
2424 if (current_type.Kind == MemberKind.Struct && current_local_parameters.IsEmpty) {
2425 report.Error (568, c.Location, "Structs cannot contain explicit parameterless constructors");
2429 current_type.AddConstructor (c);
2430 lbag.AddMember (c, mod_locations, GetLocation ($5), GetLocation ($7));
2434 // start block here, so possible anonymous methods inside
2435 // constructor initializer can get correct parent block
2437 start_block (lexer.Location);
2439 opt_constructor_initializer
2442 var c = (Constructor) $8;
2443 c.Initializer = (ConstructorInitializer) $9;
2446 report.Error (514, c.Location,
2447 "`{0}': static constructor cannot have an explicit `this' or `base' constructor call",
2448 c.GetSignatureForError ());
2458 | SEMICOLON { current_block = null; $$ = null; }
2461 opt_constructor_initializer
2463 | constructor_initializer
2466 constructor_initializer
2467 : COLON BASE OPEN_PARENS
2469 ++lexer.parsing_block;
2471 opt_argument_list CLOSE_PARENS
2473 --lexer.parsing_block;
2474 $$ = new ConstructorBaseInitializer ((Arguments) $5, GetLocation ($2));
2475 lbag.AddLocation ($$, GetLocation ($1), GetLocation ($3), GetLocation ($6));
2477 | COLON THIS OPEN_PARENS
2479 ++lexer.parsing_block;
2481 opt_argument_list CLOSE_PARENS
2483 --lexer.parsing_block;
2484 $$ = new ConstructorThisInitializer ((Arguments) $5, GetLocation ($2));
2485 lbag.AddLocation ($$, GetLocation ($1), GetLocation ($3), GetLocation ($6));
2489 Error_SyntaxError (yyToken);
2490 $$ = new ConstructorThisInitializer (null, GetLocation ($2));
2491 lbag.AddLocation ($$, GetLocation ($1));
2495 Error_SyntaxError (yyToken);
2500 destructor_declaration
2501 : opt_attributes opt_modifiers TILDE
2504 tmpComment = Lexer.consume_doc_comment ();
2505 Lexer.doc_state = XmlCommentState.NotAllowed;
2508 current_local_parameters = ParametersCompiled.EmptyReadOnlyParameters;
2510 IDENTIFIER OPEN_PARENS CLOSE_PARENS method_body
2512 var lt = (LocatedToken) $5;
2513 if (lt.Value != current_container.MemberName.Name){
2514 report.Error (574, lt.Location, "Name of destructor must match name of class");
2515 } else if (current_container.Kind != MemberKind.Class){
2516 report.Error (575, lt.Location, "Only class types can contain destructor");
2519 Destructor d = new Destructor (current_type, (Modifiers) $2,
2520 ParametersCompiled.EmptyReadOnlyParameters, (Attributes) $1, lt.Location);
2522 d.DocComment = ConsumeStoredComment ();
2524 d.Block = (ToplevelBlock) $8;
2525 current_type.AddMember (d);
2526 lbag.AddMember (d, mod_locations, GetLocation ($3), GetLocation ($6), GetLocation ($7));
2528 current_local_parameters = null;
2535 EVENT type member_declaration_name
2537 current_event_field = new EventField (current_type, (FullNamedExpression) $4, (Modifiers) $2, (MemberName) $5, (Attributes) $1);
2538 current_type.AddMember (current_event_field);
2540 if (current_event_field.MemberName.ExplicitInterface != null) {
2541 report.Error (71, current_event_field.Location, "`{0}': An explicit interface implementation of an event must use property syntax",
2542 current_event_field.GetSignatureForError ());
2545 $$ = current_event_field;
2547 opt_event_initializer
2548 opt_event_declarators
2552 current_event_field.DocComment = Lexer.consume_doc_comment ();
2553 Lexer.doc_state = XmlCommentState.Allowed;
2556 lbag.AddMember (current_event_field, mod_locations, GetLocation ($3), GetLocation ($9));
2557 current_event_field = null;
2561 EVENT type member_declaration_name
2564 current_event = new EventProperty (current_type, (FullNamedExpression) $4, (Modifiers) $2, (MemberName) $5, (Attributes) $1);
2565 current_type.AddMember (current_event);
2566 lbag.AddMember (current_event, mod_locations, GetLocation ($3), GetLocation ($6));
2568 lexer.EventParsing = true;
2570 event_accessor_declarations
2572 if (current_container.Kind == MemberKind.Interface)
2573 report.Error (69, GetLocation ($6), "Event in interface cannot have add or remove accessors");
2575 lexer.EventParsing = false;
2580 current_event.DocComment = Lexer.consume_doc_comment ();
2581 Lexer.doc_state = XmlCommentState.Allowed;
2584 lbag.AppendToMember (current_event, GetLocation ($9));
2585 current_event = null;
2586 current_local_parameters = null;
2592 Error_SyntaxError (yyToken);
2594 current_type.AddMember (new EventField (current_type, (FullNamedExpression) $4, (Modifiers) $2, MemberName.Null, (Attributes) $1));
2598 opt_event_initializer
2602 ++lexer.parsing_block;
2604 event_variable_initializer
2606 --lexer.parsing_block;
2607 current_event_field.Initializer = (Expression) $3;
2611 opt_event_declarators
2619 current_event_field.AddDeclarator ((FieldDeclarator) $1);
2621 | event_declarators event_declarator
2623 current_event_field.AddDeclarator ((FieldDeclarator) $2);
2630 var lt = (LocatedToken) $2;
2631 $$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), null);
2632 lbag.AddLocation ($$, GetLocation ($1));
2634 | COMMA IDENTIFIER ASSIGN
2636 ++lexer.parsing_block;
2638 event_variable_initializer
2640 --lexer.parsing_block;
2641 var lt = (LocatedToken) $2;
2642 $$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), (Expression) $5);
2643 lbag.AddLocation ($$, GetLocation ($1), GetLocation ($3));
2647 event_variable_initializer
2649 if (current_container.Kind == MemberKind.Interface) {
2650 report.Error (68, lexer.Location, "`{0}': event in interface cannot have an initializer",
2651 current_event_field.GetSignatureForError ());
2654 if ((current_event_field.ModFlags & Modifiers.ABSTRACT) != 0) {
2655 report.Error (74, lexer.Location, "`{0}': abstract event cannot have an initializer",
2656 current_event_field.GetSignatureForError ());
2659 variable_initializer
2665 event_accessor_declarations
2666 : add_accessor_declaration remove_accessor_declaration
2667 | remove_accessor_declaration add_accessor_declaration
2668 | add_accessor_declaration
2670 report.Error (65, lexer.Location, "`{0}': event property must have both add and remove accessors",
2671 current_event.GetSignatureForError ());
2673 | remove_accessor_declaration
2675 report.Error (65, lexer.Location, "`{0}': event property must have both add and remove accessors",
2676 current_event.GetSignatureForError ());
2680 report.Error (1055, GetLocation ($1), "An add or remove accessor expected");
2685 add_accessor_declaration
2686 : opt_attributes opt_modifiers ADD
2688 if ($2 != ModifierNone) {
2689 report.Error (1609, GetLocation ($2), "Modifiers cannot be placed on event accessor declarations");
2692 current_event.Add = new EventProperty.AddDelegateMethod (current_event, (Attributes) $1, GetLocation ($3));
2693 current_local_parameters = current_event.Add.ParameterInfo;
2695 lbag.AddMember (current_event.Add, mod_locations);
2696 lexer.EventParsing = false;
2698 event_accessor_block
2700 lexer.EventParsing = true;
2702 current_event.Add.Block = (ToplevelBlock) $5;
2704 if (current_container.Kind == MemberKind.Interface) {
2705 report.Error (531, current_event.Add.Block.StartLocation,
2706 "`{0}': interface members cannot have a definition", current_event.Add.GetSignatureForError ());
2709 current_local_parameters = null;
2713 remove_accessor_declaration
2714 : opt_attributes opt_modifiers REMOVE
2716 if ($2 != ModifierNone) {
2717 report.Error (1609, GetLocation ($2), "Modifiers cannot be placed on event accessor declarations");
2720 current_event.Remove = new EventProperty.RemoveDelegateMethod (current_event, (Attributes) $1, GetLocation ($3));
2721 current_local_parameters = current_event.Remove.ParameterInfo;
2723 lbag.AddMember (current_event.Remove, mod_locations);
2724 lexer.EventParsing = false;
2726 event_accessor_block
2728 lexer.EventParsing = true;
2730 current_event.Remove.Block = (ToplevelBlock) $5;
2732 if (current_container.Kind == MemberKind.Interface) {
2733 report.Error (531, current_event.Remove.Block.StartLocation,
2734 "`{0}': interface members cannot have a definition", current_event.Remove.GetSignatureForError ());
2737 current_local_parameters = null;
2741 event_accessor_block
2744 report.Error (73, lexer.Location, "An add or remove accessor must have a body");
2751 attributes_without_members
2752 : attribute_sections CLOSE_BRACE
2754 current_type.UnattachedAttributes = (Attributes) $1;
2755 report.Error (1519, GetLocation ($1), "An attribute is missing member declaration");
2756 lexer.putback ('}');
2760 // For full ast try to recover incomplete ambiguous member
2761 // declaration in form on class X { public int }
2763 : opt_attributes opt_modifiers member_type CLOSE_BRACE
2765 report.Error (1519, lexer.Location, "Unexpected symbol `}' in class, struct, or interface member declaration");
2767 lexer.putback ('}');
2769 lexer.parsing_generic_declaration = false;
2770 FullNamedExpression type = (FullNamedExpression) $3;
2771 current_field = new Field (current_type, type, (Modifiers) $2, MemberName.Null, (Attributes) $1);
2772 current_type.AddField (current_field);
2780 ENUM type_declaration_name
2784 enumTypeComment = Lexer.consume_doc_comment ();
2789 Lexer.doc_state = XmlCommentState.Allowed;
2791 MemberName name = (MemberName) $4;
2792 if (name.IsGeneric) {
2793 report.Error (1675, name.Location, "Enums cannot have type parameters");
2796 push_current_container (new Enum (current_container, (FullNamedExpression) $5, (Modifiers) $2, name, (Attributes) $1), null);
2798 opt_enum_member_declarations
2800 lexer.parsing_modifiers = true;
2802 // here will be evaluated after CLOSE_BLACE is consumed.
2804 Lexer.doc_state = XmlCommentState.Allowed;
2806 CLOSE_BRACE opt_semicolon
2809 current_container.DocComment = enumTypeComment;
2811 --lexer.parsing_declaration;
2814 // em.DocComment = ev.DocComment;
2816 lbag.AddMember (current_container, mod_locations, GetLocation ($3), GetLocation ($7), GetLocation ($11));
2817 $$ = pop_current_class ();
2829 Error_TypeExpected (GetLocation ($1));
2834 opt_enum_member_declarations
2836 | enum_member_declarations
2837 | enum_member_declarations COMMA
2839 lbag.AddLocation ($1, GetLocation ($2));
2843 enum_member_declarations
2844 : enum_member_declaration
2845 | enum_member_declarations COMMA enum_member_declaration
2847 lbag.AddLocation ($1, GetLocation ($2));
2852 enum_member_declaration
2853 : opt_attributes IDENTIFIER
2855 var lt = (LocatedToken) $2;
2856 var em = new EnumMember ((Enum) current_type, new MemberName (lt.Value, lt.Location), (Attributes) $1);
2857 ((Enum) current_type).AddEnumMember (em);
2860 em.DocComment = Lexer.consume_doc_comment ();
2861 Lexer.doc_state = XmlCommentState.Allowed;
2866 | opt_attributes IDENTIFIER
2868 ++lexer.parsing_block;
2870 tmpComment = Lexer.consume_doc_comment ();
2871 Lexer.doc_state = XmlCommentState.NotAllowed;
2874 ASSIGN constant_expression
2876 --lexer.parsing_block;
2878 var lt = (LocatedToken) $2;
2879 var em = new EnumMember ((Enum) current_type, new MemberName (lt.Value, lt.Location), (Attributes) $1);
2880 em.Initializer = new ConstInitializer (em, (Expression) $5, GetLocation ($4));
2881 ((Enum) current_type).AddEnumMember (em);
2884 em.DocComment = ConsumeStoredComment ();
2888 | opt_attributes IDENTIFIER error
2890 Error_SyntaxError (yyToken);
2892 var lt = (LocatedToken) $2;
2893 var em = new EnumMember ((Enum) current_type, new MemberName (lt.Value, lt.Location), (Attributes) $1);
2894 ((Enum) current_type).AddEnumMember (em);
2897 em.DocComment = Lexer.consume_doc_comment ();
2898 Lexer.doc_state = XmlCommentState.Allowed;
2903 | attributes_without_members
2906 delegate_declaration
2910 member_type type_declaration_name
2913 valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out | ParameterModifierType.Params | ParameterModifierType.DefaultValue;
2915 opt_formal_parameter_list CLOSE_PARENS
2917 valid_param_mod = 0;
2919 ParametersCompiled p = (ParametersCompiled) $8;
2921 Delegate del = new Delegate (current_container, (FullNamedExpression) $4, (Modifiers) $2, (MemberName) $5, p, (Attributes) $1);
2923 p.CheckParameters (del);
2925 current_container.AddTypeContainer (del);
2927 current_delegate = del;
2928 lexer.ConstraintsParsing = true;
2930 opt_type_parameter_constraints_clauses
2932 lexer.ConstraintsParsing = false;
2937 current_delegate.DocComment = Lexer.consume_doc_comment ();
2938 Lexer.doc_state = XmlCommentState.Allowed;
2942 current_delegate.SetConstraints ((List<Constraints>) $11);
2943 lbag.AddMember (current_delegate, mod_locations, GetLocation ($3), GetLocation ($6), GetLocation ($9), GetLocation ($13));
2945 $$ = current_delegate;
2947 current_delegate = null;
2955 if (lang_version < LanguageVersion.ISO_2)
2956 FeatureIsNotAvailable (GetLocation ($1), "nullable types");
2958 $$ = ComposedTypeSpecifier.CreateNullable (GetLocation ($1));
2962 namespace_or_type_expr
2964 | qualified_alias_member IDENTIFIER opt_type_argument_list
2966 var lt1 = (LocatedToken) $1;
2967 var lt2 = (LocatedToken) $2;
2969 $$ = new QualifiedAliasMember (lt1.Value, lt2.Value, (TypeArguments) $3, lt1.Location);
2970 lbag.AddLocation ($$, GetLocation ($2));
2972 | qualified_alias_member IDENTIFIER generic_dimension
2974 var lt1 = (LocatedToken) $1;
2975 var lt2 = (LocatedToken) $2;
2977 $$ = new QualifiedAliasMember (lt1.Value, lt2.Value, (int) $3, lt1.Location);
2978 lbag.AddLocation ($$, GetLocation ($2));
2984 | namespace_or_type_expr DOT IDENTIFIER opt_type_argument_list
2986 var lt = (LocatedToken) $3;
2987 $$ = new MemberAccess ((Expression) $1, lt.Value, (TypeArguments) $4, lt.Location);
2988 lbag.AddLocation ($$, GetLocation ($2));
2990 | namespace_or_type_expr DOT IDENTIFIER generic_dimension
2992 var lt = (LocatedToken) $3;
2993 $$ = new MemberAccess ((Expression) $1, lt.Value, (int) $4, lt.Location);
2994 lbag.AddLocation ($$, GetLocation ($2));
2999 : IDENTIFIER opt_type_argument_list
3001 var lt = (LocatedToken) $1;
3002 $$ = new SimpleName (lt.Value, (TypeArguments)$2, lt.Location);
3004 | IDENTIFIER generic_dimension
3006 var lt = (LocatedToken) $1;
3007 $$ = new SimpleName (lt.Value, (int) $2, lt.Location);
3012 // Generics arguments (any type, without attributes)
3014 opt_type_argument_list
3016 | OP_GENERICS_LT type_arguments OP_GENERICS_GT
3018 if (lang_version < LanguageVersion.ISO_2)
3019 FeatureIsNotAvailable (GetLocation ($1), "generics");
3023 | OP_GENERICS_LT error
3025 Error_TypeExpected (lexer.Location);
3026 $$ = new TypeArguments ();
3033 TypeArguments type_args = new TypeArguments ();
3034 type_args.Add ((FullNamedExpression) $1);
3037 | type_arguments COMMA type
3039 TypeArguments type_args = (TypeArguments) $1;
3040 type_args.Add ((FullNamedExpression) $3);
3046 // Generics parameters (identifiers only, with attributes), used in type or method declarations
3048 type_declaration_name
3051 lexer.parsing_generic_declaration = true;
3053 opt_type_parameter_list
3055 lexer.parsing_generic_declaration = false;
3056 var lt = (LocatedToken) $1;
3057 $$ = new MemberName (lt.Value, (TypeParameters)$3, lt.Location);
3061 member_declaration_name
3062 : method_declaration_name
3064 MemberName mn = (MemberName)$1;
3065 if (mn.TypeParameters != null)
3066 syntax_error (mn.Location, string.Format ("Member `{0}' cannot declare type arguments",
3067 mn.GetSignatureForError ()));
3071 method_declaration_name
3072 : type_declaration_name
3073 | explicit_interface IDENTIFIER opt_type_parameter_list
3075 lexer.parsing_generic_declaration = false;
3076 var lt = (LocatedToken) $2;
3077 $$ = new MemberName (lt.Value, (TypeParameters) $3, (ATypeNameExpression) $1, lt.Location);
3081 indexer_declaration_name
3084 lexer.parsing_generic_declaration = false;
3085 $$ = new MemberName (TypeDefinition.DefaultIndexerName, GetLocation ($1));
3087 | explicit_interface THIS
3089 lexer.parsing_generic_declaration = false;
3090 $$ = new MemberName (TypeDefinition.DefaultIndexerName, null, (ATypeNameExpression) $1, GetLocation ($2));
3095 : IDENTIFIER opt_type_argument_list DOT
3097 var lt = (LocatedToken) $1;
3098 $$ = new SimpleName (lt.Value, (TypeArguments) $2, lt.Location);
3099 lbag.AddLocation ($$, GetLocation ($3));
3101 | qualified_alias_member IDENTIFIER opt_type_argument_list DOT
3103 var lt1 = (LocatedToken) $1;
3104 var lt2 = (LocatedToken) $2;
3106 $$ = new QualifiedAliasMember (lt1.Value, lt2.Value, (TypeArguments) $3, lt1.Location);
3107 lbag.AddLocation ($$, GetLocation ($4));
3109 | explicit_interface IDENTIFIER opt_type_argument_list DOT
3111 var lt = (LocatedToken) $2;
3112 $$ = new MemberAccess ((ATypeNameExpression) $1, lt.Value, (TypeArguments) $3, lt.Location);
3113 lbag.AddLocation ($$, GetLocation ($4));
3117 opt_type_parameter_list
3119 | OP_GENERICS_LT_DECL type_parameters OP_GENERICS_GT
3121 if (lang_version < LanguageVersion.ISO_2)
3122 FeatureIsNotAvailable (GetLocation ($1), "generics");
3125 lbag.AddLocation ($$, GetLocation ($1), GetLocation ($3));
3132 var tparams = new TypeParameters ();
3133 tparams.Add ((TypeParameter)$1);
3136 | type_parameters COMMA type_parameter
3138 var tparams = (TypeParameters) $1;
3139 tparams.Add ((TypeParameter)$3);
3141 lbag.AddLocation ($3, GetLocation ($3));
3146 : opt_attributes opt_type_parameter_variance IDENTIFIER
3148 var lt = (LocatedToken)$3;
3149 $$ = new TypeParameter (new MemberName (lt.Value, lt.Location), (Attributes)$1, (VarianceDecl) $2);
3153 if (GetTokenName (yyToken) == "type")
3154 report.Error (81, GetLocation ($1), "Type parameter declaration must be an identifier not a type");
3156 Error_SyntaxError (yyToken);
3158 $$ = new TypeParameter (MemberName.Null, null, null);
3163 // All types where void is allowed
3166 : type_expression_or_array
3169 $$ = new TypeExpression (compiler.BuiltinTypes.Void, GetLocation ($1));
3176 lexer.parsing_generic_declaration = true;
3181 // A type which does not allow `void' to be used
3184 : type_expression_or_array
3194 : type_expression_or_array
3197 report.Error (1536, GetLocation ($1), "Invalid parameter type `void'");
3198 $$ = new TypeExpression (compiler.BuiltinTypes.Void, GetLocation ($1));
3202 type_expression_or_array
3204 | type_expression rank_specifiers
3206 $$ = new ComposedCast ((FullNamedExpression) $1, (ComposedTypeSpecifier) $2);
3211 : namespace_or_type_expr opt_nullable
3214 $$ = new ComposedCast ((ATypeNameExpression) $1, (ComposedTypeSpecifier) $2);
3216 var sn = $1 as SimpleName;
3217 if (sn != null && sn.Name == "var")
3218 $$ = new VarExpr (sn.Location);
3223 | namespace_or_type_expr pointer_stars
3225 $$ = new ComposedCast ((ATypeNameExpression) $1, (ComposedTypeSpecifier) $2);
3227 | builtin_type_expression
3233 Expression.Error_VoidInvalidInTheContext (GetLocation ($1), report);
3234 $$ = new TypeExpression (compiler.BuiltinTypes.Void, GetLocation ($1));
3238 builtin_type_expression
3239 : builtin_types opt_nullable
3242 $$ = new ComposedCast ((FullNamedExpression) $1, (ComposedTypeSpecifier) $2);
3244 | builtin_types pointer_stars
3246 $$ = new ComposedCast ((FullNamedExpression) $1, (ComposedTypeSpecifier) $2);
3248 | VOID pointer_stars
3250 $$ = new ComposedCast (new TypeExpression (compiler.BuiltinTypes.Void, GetLocation ($1)), (ComposedTypeSpecifier) $2);
3257 var types = new List<FullNamedExpression> (2);
3258 types.Add ((FullNamedExpression) $1);
3261 | type_list COMMA base_type_name
3263 var types = (List<FullNamedExpression>) $1;
3264 types.Add ((FullNamedExpression) $3);
3272 if ($1 is ComposedCast) {
3273 report.Error (1521, GetLocation ($1), "Invalid base type `{0}'", ((ComposedCast)$1).GetSignatureForError ());
3280 * replaces all the productions for isolating the various
3281 * simple types, but we need this to reuse it easily in variable_type
3284 : OBJECT { $$ = new TypeExpression (compiler.BuiltinTypes.Object, GetLocation ($1)); }
3285 | STRING { $$ = new TypeExpression (compiler.BuiltinTypes.String, GetLocation ($1)); }
3286 | BOOL { $$ = new TypeExpression (compiler.BuiltinTypes.Bool, GetLocation ($1)); }
3287 | DECIMAL { $$ = new TypeExpression (compiler.BuiltinTypes.Decimal, GetLocation ($1)); }
3288 | FLOAT { $$ = new TypeExpression (compiler.BuiltinTypes.Float, GetLocation ($1)); }
3289 | DOUBLE { $$ = new TypeExpression (compiler.BuiltinTypes.Double, GetLocation ($1)); }
3294 : SBYTE { $$ = new TypeExpression (compiler.BuiltinTypes.SByte, GetLocation ($1)); }
3295 | BYTE { $$ = new TypeExpression (compiler.BuiltinTypes.Byte, GetLocation ($1)); }
3296 | SHORT { $$ = new TypeExpression (compiler.BuiltinTypes.Short, GetLocation ($1)); }
3297 | USHORT { $$ = new TypeExpression (compiler.BuiltinTypes.UShort, GetLocation ($1)); }
3298 | INT { $$ = new TypeExpression (compiler.BuiltinTypes.Int, GetLocation ($1)); }
3299 | UINT { $$ = new TypeExpression (compiler.BuiltinTypes.UInt, GetLocation ($1)); }
3300 | LONG { $$ = new TypeExpression (compiler.BuiltinTypes.Long, GetLocation ($1)); }
3301 | ULONG { $$ = new TypeExpression (compiler.BuiltinTypes.ULong, GetLocation ($1)); }
3302 | CHAR { $$ = new TypeExpression (compiler.BuiltinTypes.Char, GetLocation ($1)); }
3306 // Expressions, section 7.5
3311 : type_name_expression
3313 | array_creation_expression
3314 | parenthesized_expression
3315 | default_value_expression
3316 | invocation_expression
3320 | post_increment_expression
3321 | post_decrement_expression
3322 | object_or_delegate_creation_expression
3323 | anonymous_type_expression
3326 | checked_expression
3327 | unchecked_expression
3328 | pointer_member_access
3329 | anonymous_method_expression
3330 | undocumented_expressions
3331 | interpolated_string
3334 type_name_expression
3336 | IDENTIFIER GENERATE_COMPLETION {
3337 var lt = (LocatedToken) $1;
3338 $$ = new CompletionSimpleName (MemberName.MakeName (lt.Value, null), lt.Location);
3346 | NULL { $$ = new NullLiteral (GetLocation ($1)); }
3350 : TRUE { $$ = new BoolLiteral (compiler.BuiltinTypes, true, GetLocation ($1)); }
3351 | FALSE { $$ = new BoolLiteral (compiler.BuiltinTypes, false, GetLocation ($1)); }
3355 : INTERPOLATED_STRING interpolations INTERPOLATED_STRING_END
3357 if (lang_version < LanguageVersion.V_6)
3358 FeatureIsNotAvailable (GetLocation ($1), "interpolated strings");
3360 $$ = new InterpolatedString ((StringLiteral) $1, (List<Expression>) $2, (StringLiteral) $3);
3362 | INTERPOLATED_STRING_END
3364 if (lang_version < LanguageVersion.V_6)
3365 FeatureIsNotAvailable (GetLocation ($1), "interpolated strings");
3367 $$ = new InterpolatedString ((StringLiteral) $1, null, null);
3374 var list = new List<Expression> ();
3375 list.Add ((InterpolatedStringInsert) $1);
3378 | interpolations INTERPOLATED_STRING interpolation
3380 var list = (List<Expression>) $1;
3381 list.Add ((StringLiteral) $2);
3382 list.Add ((InterpolatedStringInsert) $3);
3390 $$ = new InterpolatedStringInsert ((Expression) $1);
3392 | expression COMMA expression
3394 $$ = new InterpolatedStringInsert ((Expression) $1) {
3395 Alignment = (Expression)$3
3400 lexer.parsing_interpolation_format = true;
3404 lexer.parsing_interpolation_format = false;
3406 $$ = new InterpolatedStringInsert ((Expression) $1) {
3410 | expression COMMA expression COLON
3412 lexer.parsing_interpolation_format = true;
3416 lexer.parsing_interpolation_format = false;
3418 $$ = new InterpolatedStringInsert ((Expression) $1) {
3419 Alignment = (Expression)$3,
3420 Format = (string) $6
3427 // Here is the trick, tokenizer may think that parens is a special but
3428 // parser is interested in open parens only, so we merge them.
3429 // Consider: if (a)foo ();
3437 // Use this production to accept closing parenthesis or
3438 // performing completion
3442 | COMPLETE_COMPLETION
3446 parenthesized_expression
3447 : OPEN_PARENS expression CLOSE_PARENS
3449 $$ = new ParenthesizedExpression ((Expression) $2, GetLocation ($1));
3450 lbag.AddLocation ($$, GetLocation ($1), GetLocation ($3));
3452 | OPEN_PARENS expression COMPLETE_COMPLETION
3454 $$ = new ParenthesizedExpression ((Expression) $2, GetLocation ($1));
3459 : primary_expression DOT identifier_inside_body opt_type_argument_list
3461 var lt = (LocatedToken) $3;
3462 $$ = new MemberAccess ((Expression) $1, lt.Value, (TypeArguments) $4, lt.Location);
3463 lbag.AddLocation ($$, GetLocation ($2));
3465 | primary_expression DOT identifier_inside_body generic_dimension
3467 var lt = (LocatedToken) $3;
3468 $$ = new MemberAccess ((Expression) $1, lt.Value, (int) $4, lt.Location);
3469 lbag.AddLocation ($$, GetLocation ($2));
3471 | primary_expression INTERR_OPERATOR DOT identifier_inside_body opt_type_argument_list
3473 if (lang_version < LanguageVersion.V_6)
3474 FeatureIsNotAvailable (GetLocation ($2), "null propagating operator");
3476 var lt = (LocatedToken) $4;
3477 $$ = new ConditionalMemberAccess ((Expression) $1, lt.Value, (TypeArguments) $5, lt.Location);
3478 lbag.AddLocation ($$, GetLocation ($2), GetLocation ($3));
3480 | builtin_types DOT identifier_inside_body opt_type_argument_list
3482 var lt = (LocatedToken) $3;
3483 $$ = new MemberAccess ((Expression) $1, lt.Value, (TypeArguments) $4, lt.Location);
3484 lbag.AddLocation ($$, GetLocation ($2));
3486 | BASE DOT identifier_inside_body opt_type_argument_list
3488 var lt = (LocatedToken) $3;
3489 $$ = new MemberAccess (new BaseThis (GetLocation ($1)), lt.Value, (TypeArguments) $4, lt.Location);
3490 lbag.AddLocation ($$, GetLocation ($2));
3492 | AWAIT DOT identifier_inside_body opt_type_argument_list
3494 var lt = (LocatedToken) $3;
3495 $$ = new MemberAccess (new SimpleName ("await", ((LocatedToken) $1).Location), lt.Value, (TypeArguments) $4, lt.Location);
3496 lbag.AddLocation ($$, GetLocation ($2));
3498 | qualified_alias_member identifier_inside_body opt_type_argument_list
3500 var lt1 = (LocatedToken) $1;
3501 var lt2 = (LocatedToken) $2;
3503 $$ = new QualifiedAliasMember (lt1.Value, lt2.Value, (TypeArguments) $3, lt1.Location);
3504 lbag.AddLocation ($$, GetLocation ($2));
3506 | qualified_alias_member identifier_inside_body generic_dimension
3508 var lt1 = (LocatedToken) $1;
3509 var lt2 = (LocatedToken) $2;
3511 $$ = new QualifiedAliasMember (lt1.Value, lt2.Value, (int) $3, lt1.Location);
3512 lbag.AddLocation ($$, GetLocation ($2));
3514 | primary_expression DOT GENERATE_COMPLETION {
3515 $$ = new CompletionMemberAccess ((Expression) $1, null,GetLocation ($3));
3517 | primary_expression DOT IDENTIFIER GENERATE_COMPLETION {
3518 var lt = (LocatedToken) $3;
3519 $$ = new CompletionMemberAccess ((Expression) $1, lt.Value, lt.Location);
3521 | builtin_types DOT GENERATE_COMPLETION
3523 $$ = new CompletionMemberAccess ((Expression) $1, null, lexer.Location);
3525 | builtin_types DOT IDENTIFIER GENERATE_COMPLETION {
3526 var lt = (LocatedToken) $3;
3527 $$ = new CompletionMemberAccess ((Expression) $1, lt.Value, lt.Location);
3531 invocation_expression
3532 : primary_expression open_parens_any opt_argument_list close_parens
3534 $$ = new Invocation ((Expression) $1, (Arguments) $3);
3535 lbag.AddLocation ($$, GetLocation ($2), GetLocation ($4));
3537 | primary_expression open_parens_any argument_list error
3539 Error_SyntaxError (yyToken);
3541 $$ = new Invocation ((Expression) $1, (Arguments) $3);
3542 lbag.AddLocation ($$, GetLocation ($2));
3544 | primary_expression open_parens_any error
3546 Error_SyntaxError (yyToken);
3548 $$ = new Invocation ((Expression) $1, null);
3549 lbag.AddLocation ($$, GetLocation ($2));
3553 opt_object_or_collection_initializer
3554 : /* empty */ { $$ = null; }
3555 | object_or_collection_initializer
3558 object_or_collection_initializer
3559 : OPEN_BRACE opt_member_initializer_list close_brace_or_complete_completion
3562 $$ = new CollectionOrObjectInitializers (GetLocation ($1));
3564 $$ = new CollectionOrObjectInitializers ((List<Expression>) $2, GetLocation ($1));
3566 lbag.AddLocation ($$, GetLocation ($3));
3568 | OPEN_BRACE member_initializer_list COMMA CLOSE_BRACE
3570 $$ = new CollectionOrObjectInitializers ((List<Expression>) $2, GetLocation ($1));
3571 lbag.AddLocation ($$, GetLocation ($3), GetLocation ($4));
3575 opt_member_initializer_list
3576 : /* empty */ { $$ = null; }
3577 | member_initializer_list
3583 member_initializer_list
3584 : member_initializer
3586 var a = new List<Expression> ();
3587 a.Add ((Expression) $1);
3590 | member_initializer_list COMMA member_initializer
3592 var a = (List<Expression>)$1;
3593 a.Add ((Expression) $3);
3596 | member_initializer_list error {
3597 Error_SyntaxError (yyToken);
3603 : IDENTIFIER ASSIGN initializer_value
3605 var lt = (LocatedToken) $1;
3606 $$ = new ElementInitializer (lt.Value, (Expression)$3, lt.Location);
3607 lbag.AddLocation ($$, GetLocation ($2));
3609 | AWAIT ASSIGN initializer_value
3611 var lt = (LocatedToken) Error_AwaitAsIdentifier ($1);
3612 $$ = new ElementInitializer (lt.Value, (Expression)$3, lt.Location);
3613 lbag.AddLocation ($$, GetLocation ($2));
3615 | GENERATE_COMPLETION
3617 $$ = new CompletionElementInitializer (null, GetLocation ($1));
3619 | non_assignment_expression opt_COMPLETE_COMPLETION {
3620 CompletionSimpleName csn = $1 as CompletionSimpleName;
3622 $$ = new CollectionElementInitializer ((Expression)$1);
3624 $$ = new CompletionElementInitializer (csn.Prefix, csn.Location);
3626 | OPEN_BRACE expression_list CLOSE_BRACE
3629 $$ = new CollectionElementInitializer (GetLocation ($1));
3631 $$ = new CollectionElementInitializer ((List<Expression>)$2, GetLocation ($1));
3633 lbag.AddLocation ($$, GetLocation ($3));
3635 | OPEN_BRACKET_EXPR argument_list CLOSE_BRACKET ASSIGN initializer_value
3637 if (lang_version < LanguageVersion.V_6)
3638 FeatureIsNotAvailable (GetLocation ($1), "dictionary initializer");
3640 $$ = new DictionaryElementInitializer ((Arguments)$2, (Expression) $5, GetLocation ($1));
3641 lbag.AddLocation ($$, GetLocation ($3), GetLocation ($4));
3643 | OPEN_BRACE CLOSE_BRACE
3645 report.Error (1920, GetLocation ($1), "An element initializer cannot be empty");
3646 $$ = new CollectionElementInitializer (GetLocation ($1));
3647 lbag.AddLocation ($$, GetLocation ($2));
3653 | object_or_collection_initializer
3657 : /* empty */ { $$ = null; }
3662 : argument_or_named_argument
3664 Arguments list = new Arguments (4);
3665 list.Add ((Argument) $1);
3668 | argument_list COMMA argument
3670 Arguments list = (Arguments) $1;
3671 if (list [list.Count - 1] is NamedArgument)
3672 Error_NamedArgumentExpected ((NamedArgument) list [list.Count - 1]);
3674 list.Add ((Argument) $3);
3677 | argument_list COMMA named_argument
3679 Arguments list = (Arguments) $1;
3680 NamedArgument a = (NamedArgument) $3;
3681 for (int i = 0; i < list.Count; ++i) {
3682 NamedArgument na = list [i] as NamedArgument;
3683 if (na != null && na.Name == a.Name)
3684 report.Error (1740, na.Location, "Named argument `{0}' specified multiple times",
3691 | argument_list COMMA error
3693 if (lexer.putback_char == -1)
3694 lexer.putback (')'); // TODO: Wrong but what can I do
3695 Error_SyntaxError (yyToken);
3700 report.Error (839, GetLocation ($1), "An argument is missing");
3708 $$ = new Argument ((Expression) $1);
3710 | non_simple_argument
3713 argument_or_named_argument
3719 : REF variable_reference
3721 $$ = new Argument ((Expression) $2, Argument.AType.Ref);
3722 lbag.AddLocation ($$, GetLocation ($1));
3724 | REF declaration_expression
3726 $$ = new Argument ((Expression) $2, Argument.AType.Ref);
3728 | OUT variable_reference
3730 $$ = new Argument ((Expression) $2, Argument.AType.Out);
3731 lbag.AddLocation ($$, GetLocation ($1));
3733 | OUT declaration_expression
3735 $$ = new Argument ((Expression) $2, Argument.AType.Out);
3737 | ARGLIST OPEN_PARENS argument_list CLOSE_PARENS
3739 $$ = new Argument (new Arglist ((Arguments) $3, GetLocation ($1)));
3740 lbag.AddLocation ($$, GetLocation ($2), GetLocation ($4));
3742 | ARGLIST OPEN_PARENS CLOSE_PARENS
3744 $$ = new Argument (new Arglist (GetLocation ($1)));
3745 lbag.AddLocation ($$, GetLocation ($2), GetLocation ($3));
3749 declaration_expression
3750 : OPEN_PARENS declaration_expression CLOSE_PARENS
3752 $$ = new ParenthesizedExpression ((Expression) $2, GetLocation ($1));
3753 lbag.AddLocation ($$, GetLocation ($1), GetLocation ($3));
3756 | CHECKED open_parens_any declaration_expression CLOSE_PARENS
3758 $$ = new CheckedExpr ((Expression) $3, GetLocation ($1));
3759 lbag.AddLocation ($$, GetLocation ($2), GetLocation ($4));
3761 | UNCHECKED open_parens_any declaration_expression CLOSE_PARENS
3763 $$ = new UnCheckedExpr ((Expression) $3, GetLocation ($1));
3764 lbag.AddLocation ($$, GetLocation ($2), GetLocation ($4));
3767 | variable_type identifier_inside_body
3769 if (lang_version != LanguageVersion.Experimental)
3770 FeatureIsNotAvailable (GetLocation ($1), "declaration expression");
3772 var lt = (LocatedToken) $2;
3773 var lv = new LocalVariable (current_block, lt.Value, lt.Location);
3774 current_block.AddLocalName (lv);
3775 $$ = new DeclarationExpression ((FullNamedExpression) $1, lv);
3777 | variable_type identifier_inside_body ASSIGN expression
3779 if (lang_version != LanguageVersion.Experimental)
3780 FeatureIsNotAvailable (GetLocation ($1), "declaration expression");
3782 var lt = (LocatedToken) $2;
3783 var lv = new LocalVariable (current_block, lt.Value, lt.Location);
3784 current_block.AddLocalName (lv);
3785 $$ = new DeclarationExpression ((FullNamedExpression) $1, lv) {
3786 Initializer = (Expression) $4
3796 : primary_expression OPEN_BRACKET_EXPR expression_list_arguments CLOSE_BRACKET
3798 $$ = new ElementAccess ((Expression) $1, (Arguments) $3, GetLocation ($2));
3799 lbag.AddLocation ($$, GetLocation ($4));
3801 | primary_expression INTERR_OPERATOR OPEN_BRACKET_EXPR expression_list_arguments CLOSE_BRACKET
3803 if (lang_version < LanguageVersion.V_6)
3804 FeatureIsNotAvailable (GetLocation ($2), "null propagating operator");
3806 $$ = new ElementAccess ((Expression) $1, (Arguments) $4, GetLocation ($3)) {
3807 ConditionalAccess = true
3810 lbag.AddLocation ($$, GetLocation ($2), GetLocation ($5));
3812 | primary_expression OPEN_BRACKET_EXPR expression_list_arguments error
3814 Error_SyntaxError (yyToken);
3815 $$ = new ElementAccess ((Expression) $1, (Arguments) $3, GetLocation ($2));
3817 | primary_expression OPEN_BRACKET_EXPR error
3819 Error_SyntaxError (yyToken);
3820 $$ = new ElementAccess ((Expression) $1, null, GetLocation ($2));
3825 : expression_or_error
3827 var list = new List<Expression> (4);
3828 list.Add ((Expression) $1);
3831 | expression_list COMMA expression_or_error
3833 var list = (List<Expression>) $1;
3834 list.Add ((Expression) $3);
3839 expression_list_arguments
3840 : expression_list_argument
3842 Arguments args = new Arguments (4);
3843 args.Add ((Argument) $1);
3846 | expression_list_arguments COMMA expression_list_argument
3848 Arguments args = (Arguments) $1;
3849 if (args [args.Count - 1] is NamedArgument && !($3 is NamedArgument))
3850 Error_NamedArgumentExpected ((NamedArgument) args [args.Count - 1]);
3852 args.Add ((Argument) $3);
3857 expression_list_argument
3860 $$ = new Argument ((Expression) $1);
3868 $$ = new This (GetLocation ($1));
3873 : BASE OPEN_BRACKET_EXPR expression_list_arguments CLOSE_BRACKET
3875 $$ = new ElementAccess (new BaseThis (GetLocation ($1)), (Arguments) $3, GetLocation ($2));
3876 lbag.AddLocation ($$, GetLocation ($4));
3878 | BASE OPEN_BRACKET error
3880 Error_SyntaxError (yyToken);
3881 $$ = new ElementAccess (null, null, GetLocation ($2));
3885 post_increment_expression
3886 : primary_expression OP_INC
3888 $$ = new UnaryMutator (UnaryMutator.Mode.PostIncrement, (Expression) $1, GetLocation ($2));
3892 post_decrement_expression
3893 : primary_expression OP_DEC
3895 $$ = new UnaryMutator (UnaryMutator.Mode.PostDecrement, (Expression) $1, GetLocation ($2));
3899 object_or_delegate_creation_expression
3900 : NEW new_expr_type open_parens_any opt_argument_list CLOSE_PARENS opt_object_or_collection_initializer
3903 if (lang_version <= LanguageVersion.ISO_2)
3904 FeatureIsNotAvailable (GetLocation ($1), "object initializers");
3906 $$ = new NewInitialize ((FullNamedExpression) $2, (Arguments) $4, (CollectionOrObjectInitializers) $6, GetLocation ($1));
3908 $$ = new New ((FullNamedExpression) $2, (Arguments) $4, GetLocation ($1));
3911 lbag.AddLocation ($$, GetLocation ($3), GetLocation ($5));
3913 | NEW new_expr_type object_or_collection_initializer
3915 if (lang_version <= LanguageVersion.ISO_2)
3916 FeatureIsNotAvailable (GetLocation ($1), "collection initializers");
3918 $$ = new NewInitialize ((FullNamedExpression) $2, null, (CollectionOrObjectInitializers) $3, GetLocation ($1));
3922 array_creation_expression
3923 : NEW new_expr_type OPEN_BRACKET_EXPR expression_list CLOSE_BRACKET
3925 opt_array_initializer
3927 $$ = new ArrayCreation ((FullNamedExpression) $2, (List<Expression>) $4,
3928 new ComposedTypeSpecifier (((List<Expression>) $4).Count, GetLocation ($3)) {
3929 Next = (ComposedTypeSpecifier) $6
3930 }, (ArrayInitializer) $7, GetLocation ($1)) {
3931 NoEmptyInterpolation = true
3934 lbag.AddLocation ($$, GetLocation ($3), GetLocation ($5));
3936 | NEW new_expr_type rank_specifiers opt_array_initializer
3939 report.Error (1586, GetLocation ($1), "Array creation must have array size or array initializer");
3941 $$ = new ArrayCreation ((FullNamedExpression) $2, (ComposedTypeSpecifier) $3, (ArrayInitializer) $4, GetLocation ($1)) {
3942 NoEmptyInterpolation = true
3945 | NEW rank_specifier array_initializer
3947 if (lang_version <= LanguageVersion.ISO_2)
3948 FeatureIsNotAvailable (GetLocation ($1), "implicitly typed arrays");
3950 $$ = new ImplicitlyTypedArrayCreation ((ComposedTypeSpecifier) $2, (ArrayInitializer) $3, GetLocation ($1));
3952 | NEW new_expr_type OPEN_BRACKET CLOSE_BRACKET OPEN_BRACKET_EXPR error CLOSE_BRACKET
3954 report.Error (178, GetLocation ($6), "Invalid rank specifier, expecting `,' or `]'");
3955 $$ = new ArrayCreation ((FullNamedExpression) $2, null, GetLocation ($1));
3957 | NEW new_expr_type error
3959 Error_SyntaxError (yyToken);
3960 // It can be any of new expression, create the most common one
3961 $$ = new New ((FullNamedExpression) $2, null, GetLocation ($1));
3967 ++lexer.parsing_type;
3971 --lexer.parsing_type;
3976 anonymous_type_expression
3977 : NEW OPEN_BRACE anonymous_type_parameters_opt_comma CLOSE_BRACE
3979 if (lang_version <= LanguageVersion.ISO_2)
3980 FeatureIsNotAvailable (GetLocation ($1), "anonymous types");
3982 $$ = new NewAnonymousType ((List<AnonymousTypeParameter>) $3, current_container, GetLocation ($1));
3984 // TODO: lbag comma location
3985 lbag.AddLocation ($$, GetLocation ($2), GetLocation ($4));
3987 | NEW OPEN_BRACE GENERATE_COMPLETION
3989 $$ = new EmptyCompletion ();
3993 anonymous_type_parameters_opt_comma
3994 : anonymous_type_parameters_opt
3995 | anonymous_type_parameters COMMA
3998 anonymous_type_parameters_opt
4000 | anonymous_type_parameters
4003 anonymous_type_parameters
4004 : anonymous_type_parameter
4006 var a = new List<AnonymousTypeParameter> (4);
4007 a.Add ((AnonymousTypeParameter) $1);
4010 | anonymous_type_parameters COMMA anonymous_type_parameter
4012 var a = (List<AnonymousTypeParameter>) $1;
4013 a.Add ((AnonymousTypeParameter) $3);
4016 | COMPLETE_COMPLETION
4018 $$ = new EmptyCompletion ();
4020 | anonymous_type_parameter COMPLETE_COMPLETION
4026 anonymous_type_parameter
4027 : identifier_inside_body ASSIGN variable_initializer
4029 var lt = (LocatedToken)$1;
4030 $$ = new AnonymousTypeParameter ((Expression)$3, lt.Value, lt.Location);
4031 lbag.AddLocation ($$, GetLocation ($2));
4033 | identifier_inside_body
4035 var lt = (LocatedToken)$1;
4036 $$ = new AnonymousTypeParameter (new SimpleName (lt.Value, lt.Location),
4037 lt.Value, lt.Location);
4041 MemberAccess ma = (MemberAccess) $1;
4042 $$ = new AnonymousTypeParameter (ma, ma.Name, ma.Location);
4046 report.Error (746, lexer.Location,
4047 "Invalid anonymous type member declarator. Anonymous type members must be a member assignment, simple name or member access expression");
4059 | rank_specifier rank_specifiers
4061 ((ComposedTypeSpecifier) $1).Next = (ComposedTypeSpecifier) $2;
4067 : OPEN_BRACKET CLOSE_BRACKET
4069 $$ = ComposedTypeSpecifier.CreateArrayDimension (1, GetLocation ($1));
4070 lbag.AddLocation ($$, GetLocation ($2));
4072 | OPEN_BRACKET dim_separators CLOSE_BRACKET
4074 $$ = ComposedTypeSpecifier.CreateArrayDimension ((int)$2, GetLocation ($1));
4075 lbag.AddLocation ($$, GetLocation ($3));
4084 | dim_separators COMMA
4086 $$ = ((int) $1) + 1;
4090 opt_array_initializer
4102 : OPEN_BRACE CLOSE_BRACE
4104 var ai = new ArrayInitializer (0, GetLocation ($1));
4105 ai.VariableDeclaration = current_variable;
4106 lbag.AddLocation (ai, GetLocation ($2));
4109 | OPEN_BRACE variable_initializer_list opt_comma CLOSE_BRACE
4111 var ai = new ArrayInitializer ((List<Expression>) $2, GetLocation ($1));
4112 ai.VariableDeclaration = current_variable;
4114 lbag.AddLocation (ai, GetLocation ($3), GetLocation ($4));
4116 lbag.AddLocation (ai, GetLocation ($4));
4122 variable_initializer_list
4123 : variable_initializer
4125 var list = new List<Expression> (4);
4126 list.Add ((Expression) $1);
4129 | variable_initializer_list COMMA variable_initializer
4131 var list = (List<Expression>) $1;
4132 list.Add ((Expression) $3);
4138 : TYPEOF open_parens_any typeof_type_expression CLOSE_PARENS
4140 $$ = new TypeOf ((FullNamedExpression) $3, GetLocation ($1));
4141 lbag.AddLocation ($$, GetLocation ($2), GetLocation ($4));
4145 typeof_type_expression
4149 Error_TypeExpected (lexer.Location);
4157 if (lang_version < LanguageVersion.ISO_2)
4158 FeatureIsNotAvailable (GetLocation ($1), "generics");
4164 qualified_alias_member
4165 : IDENTIFIER DOUBLE_COLON
4167 var lt = (LocatedToken) $1;
4168 if (lang_version == LanguageVersion.ISO_1)
4169 FeatureIsNotAvailable (lt.Location, "namespace alias qualifier");
4176 : SIZEOF open_parens_any type CLOSE_PARENS
4178 $$ = new SizeOf ((Expression) $3, GetLocation ($1));
4179 lbag.AddLocation ($$, GetLocation ($2), GetLocation ($4));
4181 | SIZEOF open_parens_any type error
4183 Error_SyntaxError (yyToken);
4185 $$ = new SizeOf ((Expression) $3, GetLocation ($1));
4186 lbag.AddLocation ($$, GetLocation ($2));
4191 : CHECKED open_parens_any expression CLOSE_PARENS
4193 $$ = new CheckedExpr ((Expression) $3, GetLocation ($1));
4194 lbag.AddLocation ($$, GetLocation ($2), GetLocation ($4));
4198 Error_SyntaxError (yyToken);
4200 $$ = new CheckedExpr (null, GetLocation ($1));
4204 unchecked_expression
4205 : UNCHECKED open_parens_any expression CLOSE_PARENS
4207 $$ = new UnCheckedExpr ((Expression) $3, GetLocation ($1));
4208 lbag.AddLocation ($$, GetLocation ($2), GetLocation ($4));
4212 Error_SyntaxError (yyToken);
4214 $$ = new UnCheckedExpr (null, GetLocation ($1));
4218 pointer_member_access
4219 : primary_expression OP_PTR IDENTIFIER opt_type_argument_list
4221 var lt = (LocatedToken) $3;
4222 $$ = new MemberAccess (new Indirection ((Expression) $1, GetLocation ($2)), lt.Value, (TypeArguments) $4, lt.Location);
4226 anonymous_method_expression
4227 : DELEGATE opt_anonymous_method_signature
4229 start_anonymous (false, (ParametersCompiled) $2, false, GetLocation ($1));
4233 $$ = end_anonymous ((ParametersBlock) $4);
4235 | ASYNC DELEGATE opt_anonymous_method_signature
4237 start_anonymous (false, (ParametersCompiled) $3, true, GetLocation ($1));
4241 $$ = end_anonymous ((ParametersBlock) $5);
4245 opt_anonymous_method_signature
4248 $$ = ParametersCompiled.Undefined;
4250 | anonymous_method_signature
4253 anonymous_method_signature
4256 valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out;
4258 opt_formal_parameter_list CLOSE_PARENS
4260 valid_param_mod = 0;
4265 default_value_expression
4266 : DEFAULT open_parens_any type CLOSE_PARENS
4268 if (lang_version < LanguageVersion.ISO_2)
4269 FeatureIsNotAvailable (GetLocation ($1), "default value expression");
4271 $$ = new DefaultValueExpression ((Expression) $3, GetLocation ($1));
4272 lbag.AddLocation ($$, GetLocation ($2), GetLocation ($4));
4277 : primary_expression
4278 | BANG prefixed_unary_expression
4280 $$ = new Unary (Unary.Operator.LogicalNot, (Expression) $2, GetLocation ($1));
4282 | TILDE prefixed_unary_expression
4284 $$ = new Unary (Unary.Operator.OnesComplement, (Expression) $2, GetLocation ($1));
4286 | OPEN_PARENS_CAST type CLOSE_PARENS prefixed_unary_expression
4288 $$ = new Cast ((FullNamedExpression) $2, (Expression) $4, GetLocation ($1));
4289 lbag.AddLocation ($$, GetLocation ($3));
4291 | AWAIT prefixed_unary_expression
4294 if (current_anonymous_method is LambdaExpression) {
4295 report.Error (4034, GetLocation ($1),
4296 "The `await' operator can only be used when its containing lambda expression is marked with the `async' modifier");
4297 } else if (current_anonymous_method != null) {
4298 report.Error (4035, GetLocation ($1),
4299 "The `await' operator can only be used when its containing anonymous method is marked with the `async' modifier");
4300 } else if (interactive_async != null) {
4301 current_block.Explicit.RegisterAsyncAwait ();
4302 interactive_async = true;
4304 report.Error (4033, GetLocation ($1),
4305 "The `await' operator can only be used when its containing method is marked with the `async' modifier");
4308 current_block.Explicit.RegisterAsyncAwait ();
4311 $$ = new Await ((Expression) $2, GetLocation ($1));
4315 Error_SyntaxError (yyToken);
4317 $$ = new Unary (Unary.Operator.LogicalNot, null, GetLocation ($1));
4321 Error_SyntaxError (yyToken);
4323 $$ = new Unary (Unary.Operator.OnesComplement, null, GetLocation ($1));
4325 | OPEN_PARENS_CAST type CLOSE_PARENS error
4327 Error_SyntaxError (yyToken);
4329 $$ = new Cast ((FullNamedExpression) $2, null, GetLocation ($1));
4330 lbag.AddLocation ($$, GetLocation ($3));
4334 Error_SyntaxError (yyToken);
4336 $$ = new Await (null, GetLocation ($1));
4341 // The idea to split this out is from Rhys' grammar
4342 // to solve the problem with casts.
4344 prefixed_unary_expression
4346 | PLUS prefixed_unary_expression
4348 $$ = new Unary (Unary.Operator.UnaryPlus, (Expression) $2, GetLocation ($1));
4350 | MINUS prefixed_unary_expression
4352 $$ = new Unary (Unary.Operator.UnaryNegation, (Expression) $2, GetLocation ($1));
4354 | OP_INC prefixed_unary_expression
4356 $$ = new UnaryMutator (UnaryMutator.Mode.PreIncrement, (Expression) $2, GetLocation ($1));
4358 | OP_DEC prefixed_unary_expression
4360 $$ = new UnaryMutator (UnaryMutator.Mode.PreDecrement, (Expression) $2, GetLocation ($1));
4362 | STAR prefixed_unary_expression
4364 $$ = new Indirection ((Expression) $2, GetLocation ($1));
4366 | BITWISE_AND prefixed_unary_expression
4368 $$ = new Unary (Unary.Operator.AddressOf, (Expression) $2, GetLocation ($1));
4372 Error_SyntaxError (yyToken);
4374 $$ = new Unary (Unary.Operator.UnaryPlus, null, GetLocation ($1));
4378 Error_SyntaxError (yyToken);
4380 $$ = new Unary (Unary.Operator.UnaryNegation, null, GetLocation ($1));
4384 Error_SyntaxError (yyToken);
4386 $$ = new UnaryMutator (UnaryMutator.Mode.PreIncrement, null, GetLocation ($1));
4390 Error_SyntaxError (yyToken);
4392 $$ = new UnaryMutator (UnaryMutator.Mode.PreDecrement, null, GetLocation ($1));
4396 Error_SyntaxError (yyToken);
4398 $$ = new Indirection (null, GetLocation ($1));
4402 Error_SyntaxError (yyToken);
4404 $$ = new Unary (Unary.Operator.AddressOf, null, GetLocation ($1));
4408 multiplicative_expression
4409 : prefixed_unary_expression
4410 | multiplicative_expression STAR prefixed_unary_expression
4412 $$ = new Binary (Binary.Operator.Multiply, (Expression) $1, (Expression) $3);
4413 lbag.AddLocation ($$, GetLocation ($2));
4415 | multiplicative_expression DIV prefixed_unary_expression
4417 $$ = new Binary (Binary.Operator.Division, (Expression) $1, (Expression) $3);
4418 lbag.AddLocation ($$, GetLocation ($2));
4420 | multiplicative_expression PERCENT prefixed_unary_expression
4422 $$ = new Binary (Binary.Operator.Modulus, (Expression) $1, (Expression) $3);
4423 lbag.AddLocation ($$, GetLocation ($2));
4425 | multiplicative_expression STAR error
4427 Error_SyntaxError (yyToken);
4429 $$ = new Binary (Binary.Operator.Multiply, (Expression) $1, null);
4430 lbag.AddLocation ($$, GetLocation ($2));
4432 | multiplicative_expression DIV error
4434 Error_SyntaxError (yyToken);
4436 $$ = new Binary (Binary.Operator.Division, (Expression) $1, null);
4437 lbag.AddLocation ($$, GetLocation ($2));
4439 | multiplicative_expression PERCENT error
4441 Error_SyntaxError (yyToken);
4443 $$ = new Binary (Binary.Operator.Modulus, (Expression) $1, null);
4444 lbag.AddLocation ($$, GetLocation ($2));
4449 : multiplicative_expression
4450 | additive_expression PLUS multiplicative_expression
4452 $$ = new Binary (Binary.Operator.Addition, (Expression) $1, (Expression) $3);
4453 lbag.AddLocation ($$, GetLocation ($2));
4455 | additive_expression MINUS multiplicative_expression
4457 $$ = new Binary (Binary.Operator.Subtraction, (Expression) $1, (Expression) $3);
4458 lbag.AddLocation ($$, GetLocation ($2));
4460 | additive_expression PLUS error
4462 Error_SyntaxError (yyToken);
4464 $$ = new Binary (Binary.Operator.Addition, (Expression) $1, null);
4465 lbag.AddLocation ($$, GetLocation ($2));
4467 | additive_expression MINUS error
4469 Error_SyntaxError (yyToken);
4471 $$ = new Binary (Binary.Operator.Subtraction, (Expression) $1, null);
4472 lbag.AddLocation ($$, GetLocation ($2));
4474 | additive_expression AS type
4476 $$ = new As ((Expression) $1, (Expression) $3, GetLocation ($2));
4478 | additive_expression IS pattern_type_expr opt_identifier
4480 var is_expr = new Is ((Expression) $1, (Expression) $3, GetLocation ($2));
4482 if (lang_version != LanguageVersion.Experimental)
4483 FeatureIsNotAvailable (GetLocation ($4), "type pattern matching");
4485 var lt = (LocatedToken) $4;
4486 is_expr.Variable = new LocalVariable (current_block, lt.Value, lt.Location);
4487 current_block.AddLocalName (is_expr.Variable);
4492 | additive_expression IS pattern_expr
4494 var is_expr = new Is ((Expression) $1, (Expression) $3, GetLocation ($2));
4495 if (lang_version != LanguageVersion.Experimental)
4496 FeatureIsNotAvailable (GetLocation ($2), "pattern matching");
4500 | additive_expression AS error
4502 Error_SyntaxError (yyToken);
4504 $$ = new As ((Expression) $1, null, GetLocation ($2));
4506 | additive_expression IS error
4508 Error_SyntaxError (yyToken);
4510 $$ = new Is ((Expression) $1, null, GetLocation ($2));
4514 var lt = (LocatedToken) $1;
4515 $$ = new Is (new SimpleName (lt.Value, lt.Location), (Expression) $3, GetLocation ($2));
4519 var lt = (LocatedToken) $1;
4520 $$ = new As (new SimpleName (lt.Value, lt.Location), (Expression) $3, GetLocation ($2));
4530 | PLUS prefixed_unary_expression
4532 $$ = new Unary (Unary.Operator.UnaryPlus, (Expression) $2, GetLocation ($1));
4534 | MINUS prefixed_unary_expression
4536 $$ = new Unary (Unary.Operator.UnaryNegation, (Expression) $2, GetLocation ($1));
4539 | default_value_expression
4540 | OPEN_PARENS_CAST type CLOSE_PARENS prefixed_unary_expression
4542 $$ = new Cast ((FullNamedExpression) $2, (Expression) $4, GetLocation ($1));
4543 lbag.AddLocation ($$, GetLocation ($3));
4547 $$ = new WildcardPattern (GetLocation ($1));
4549 | pattern_expr_invocation
4553 pattern_expr_invocation
4554 : type_name_expression OPEN_PARENS opt_pattern_list CLOSE_PARENS
4556 $$ = new RecursivePattern ((ATypeNameExpression) $1, (Arguments) $3, GetLocation ($2));
4561 : type_name_expression OPEN_BRACE pattern_property_list CLOSE_BRACE
4563 $$ = new PropertyPattern ((ATypeNameExpression) $1, (List<PropertyPatternMember>) $3, GetLocation ($2));
4567 pattern_property_list
4568 : pattern_property_entry
4570 var list = new List<PropertyPatternMember> ();
4571 list.Add ((PropertyPatternMember) $1);
4574 | pattern_property_list COMMA pattern_property_entry
4576 var list = (List<PropertyPatternMember>) $1;
4577 list.Add ((PropertyPatternMember) $3);
4582 pattern_property_entry
4583 : identifier_inside_body IS pattern
4585 var lt = (LocatedToken) $1;
4586 $$ = new PropertyPatternMember (lt.Value, (Expression) $3, lt.Location);
4592 | pattern_type_expr opt_identifier
4595 var lt = (LocatedToken) $2;
4596 var variable = new LocalVariable (current_block, lt.Value, lt.Location);
4597 current_block.AddLocalName (variable);
4605 $$ = new Arguments (0);
4613 Arguments args = new Arguments (4);
4614 args.Add ((Argument) $1);
4617 | pattern_list COMMA pattern_argument
4619 Arguments args = (Arguments) $1;
4620 if (args [args.Count - 1] is NamedArgument && !($3 is NamedArgument))
4621 Error_NamedArgumentExpected ((NamedArgument) args [args.Count - 1]);
4623 args.Add ((Argument) $3);
4631 $$ = new Argument ((Expression) $1);
4633 | IDENTIFIER COLON pattern
4635 var lt = (LocatedToken) $1;
4636 $$ = new NamedArgument (lt.Value, lt.Location, (Expression) $3);
4641 : additive_expression
4642 | shift_expression OP_SHIFT_LEFT additive_expression
4644 $$ = new Binary (Binary.Operator.LeftShift, (Expression) $1, (Expression) $3);
4645 lbag.AddLocation ($$, GetLocation ($2));
4647 | shift_expression OP_SHIFT_RIGHT additive_expression
4649 $$ = new Binary (Binary.Operator.RightShift, (Expression) $1, (Expression) $3);
4650 lbag.AddLocation ($$, GetLocation ($2));
4652 | shift_expression OP_SHIFT_LEFT error
4654 Error_SyntaxError (yyToken);
4656 $$ = new Binary (Binary.Operator.LeftShift, (Expression) $1, null);
4657 lbag.AddLocation ($$, GetLocation ($2));
4659 | shift_expression OP_SHIFT_RIGHT error
4661 Error_SyntaxError (yyToken);
4663 $$ = new Binary (Binary.Operator.RightShift, (Expression) $1, null);
4664 lbag.AddLocation ($$, GetLocation ($2));
4668 relational_expression
4670 | relational_expression OP_LT shift_expression
4672 $$ = new Binary (Binary.Operator.LessThan, (Expression) $1, (Expression) $3);
4673 lbag.AddLocation ($$, GetLocation ($2));
4675 | relational_expression OP_GT shift_expression
4677 $$ = new Binary (Binary.Operator.GreaterThan, (Expression) $1, (Expression) $3);
4678 lbag.AddLocation ($$, GetLocation ($2));
4680 | relational_expression OP_LE shift_expression
4682 $$ = new Binary (Binary.Operator.LessThanOrEqual, (Expression) $1, (Expression) $3);
4683 lbag.AddLocation ($$, GetLocation ($2));
4685 | relational_expression OP_GE shift_expression
4687 $$ = new Binary (Binary.Operator.GreaterThanOrEqual, (Expression) $1, (Expression) $3);
4688 lbag.AddLocation ($$, GetLocation ($2));
4690 | relational_expression OP_LT error
4692 Error_SyntaxError (yyToken);
4694 $$ = new Binary (Binary.Operator.LessThan, (Expression) $1, null);
4695 lbag.AddLocation ($$, GetLocation ($2));
4697 | relational_expression OP_GT error
4699 Error_SyntaxError (yyToken);
4701 $$ = new Binary (Binary.Operator.GreaterThan, (Expression) $1, null);
4702 lbag.AddLocation ($$, GetLocation ($2));
4704 | relational_expression OP_LE error
4706 Error_SyntaxError (yyToken);
4708 $$ = new Binary (Binary.Operator.LessThanOrEqual, (Expression) $1, null);
4709 lbag.AddLocation ($$, GetLocation ($2));
4711 | relational_expression OP_GE error
4713 Error_SyntaxError (yyToken);
4715 $$ = new Binary (Binary.Operator.GreaterThanOrEqual, (Expression) $1, null);
4716 lbag.AddLocation ($$, GetLocation ($2));
4721 : relational_expression
4722 | equality_expression OP_EQ relational_expression
4724 $$ = new Binary (Binary.Operator.Equality, (Expression) $1, (Expression) $3);
4725 lbag.AddLocation ($$, GetLocation ($2));
4727 | equality_expression OP_NE relational_expression
4729 $$ = new Binary (Binary.Operator.Inequality, (Expression) $1, (Expression) $3);
4730 lbag.AddLocation ($$, GetLocation ($2));
4732 | equality_expression OP_EQ error
4734 Error_SyntaxError (yyToken);
4736 $$ = new Binary (Binary.Operator.Equality, (Expression) $1, null);
4737 lbag.AddLocation ($$, GetLocation ($2));
4739 | equality_expression OP_NE error
4741 Error_SyntaxError (yyToken);
4743 $$ = new Binary (Binary.Operator.Inequality, (Expression) $1, null);
4744 lbag.AddLocation ($$, GetLocation ($2));
4749 : equality_expression
4750 | and_expression BITWISE_AND equality_expression
4752 $$ = new Binary (Binary.Operator.BitwiseAnd, (Expression) $1, (Expression) $3);
4753 lbag.AddLocation ($$, GetLocation ($2));
4755 | and_expression BITWISE_AND error
4757 Error_SyntaxError (yyToken);
4759 $$ = new Binary (Binary.Operator.BitwiseAnd, (Expression) $1, null);
4760 lbag.AddLocation ($$, GetLocation ($2));
4764 exclusive_or_expression
4766 | exclusive_or_expression CARRET and_expression
4768 $$ = new Binary (Binary.Operator.ExclusiveOr, (Expression) $1, (Expression) $3);
4769 lbag.AddLocation ($$, GetLocation ($2));
4771 | exclusive_or_expression CARRET error
4773 Error_SyntaxError (yyToken);
4775 $$ = new Binary (Binary.Operator.ExclusiveOr, (Expression) $1, null);
4776 lbag.AddLocation ($$, GetLocation ($2));
4780 inclusive_or_expression
4781 : exclusive_or_expression
4782 | inclusive_or_expression BITWISE_OR exclusive_or_expression
4784 $$ = new Binary (Binary.Operator.BitwiseOr, (Expression) $1, (Expression) $3);
4785 lbag.AddLocation ($$, GetLocation ($2));
4787 | inclusive_or_expression BITWISE_OR error
4789 Error_SyntaxError (yyToken);
4791 $$ = new Binary (Binary.Operator.BitwiseOr, (Expression) $1, null);
4792 lbag.AddLocation ($$, GetLocation ($2));
4796 conditional_and_expression
4797 : inclusive_or_expression
4798 | conditional_and_expression OP_AND inclusive_or_expression
4800 $$ = new Binary (Binary.Operator.LogicalAnd, (Expression) $1, (Expression) $3);
4801 lbag.AddLocation ($$, GetLocation ($2));
4803 | conditional_and_expression OP_AND error
4805 Error_SyntaxError (yyToken);
4807 $$ = new Binary (Binary.Operator.LogicalAnd, (Expression) $1, null);
4808 lbag.AddLocation ($$, GetLocation ($2));
4812 conditional_or_expression
4813 : conditional_and_expression
4814 | conditional_or_expression OP_OR conditional_and_expression
4816 $$ = new Binary (Binary.Operator.LogicalOr, (Expression) $1, (Expression) $3);
4817 lbag.AddLocation ($$, GetLocation ($2));
4819 | conditional_or_expression OP_OR error
4821 Error_SyntaxError (yyToken);
4823 $$ = new Binary (Binary.Operator.LogicalOr, (Expression) $1, null);
4824 lbag.AddLocation ($$, GetLocation ($2));
4828 null_coalescing_expression
4829 : conditional_or_expression
4830 | conditional_or_expression OP_COALESCING null_coalescing_expression
4832 if (lang_version < LanguageVersion.ISO_2)
4833 FeatureIsNotAvailable (GetLocation ($2), "null coalescing operator");
4835 $$ = new Nullable.NullCoalescingOperator ((Expression) $1, (Expression) $3);
4836 lbag.AddLocation ($$, GetLocation ($2));
4840 conditional_expression
4841 : null_coalescing_expression
4842 | null_coalescing_expression INTERR expression COLON expression
4844 $$ = new Conditional (new BooleanExpression ((Expression) $1), (Expression) $3, (Expression) $5, GetLocation ($2));
4845 lbag.AddLocation ($$, GetLocation ($4));
4847 | null_coalescing_expression INTERR expression error
4849 Error_SyntaxError (yyToken);
4851 $$ = new Conditional (new BooleanExpression ((Expression) $1), (Expression) $3, null, GetLocation ($2));
4853 | null_coalescing_expression INTERR expression COLON error
4855 Error_SyntaxError (yyToken);
4857 $$ = new Conditional (new BooleanExpression ((Expression) $1), (Expression) $3, null, GetLocation ($2));
4858 lbag.AddLocation ($$, GetLocation ($4));
4860 | null_coalescing_expression INTERR expression COLON CLOSE_BRACE
4862 Error_SyntaxError (Token.CLOSE_BRACE);
4864 $$ = new Conditional (new BooleanExpression ((Expression) $1), (Expression) $3, null, GetLocation ($2));
4865 lbag.AddLocation ($$, GetLocation ($4));
4866 lexer.putback ('}');
4870 assignment_expression
4871 : prefixed_unary_expression ASSIGN expression
4873 $$ = new SimpleAssign ((Expression) $1, (Expression) $3);
4874 lbag.AddLocation ($$, GetLocation ($2));
4876 | prefixed_unary_expression OP_MULT_ASSIGN expression
4878 $$ = new CompoundAssign (Binary.Operator.Multiply, (Expression) $1, (Expression) $3);
4879 lbag.AddLocation ($$, GetLocation ($2));
4881 | prefixed_unary_expression OP_DIV_ASSIGN expression
4883 $$ = new CompoundAssign (Binary.Operator.Division, (Expression) $1, (Expression) $3);
4884 lbag.AddLocation ($$, GetLocation ($2));
4886 | prefixed_unary_expression OP_MOD_ASSIGN expression
4888 $$ = new CompoundAssign (Binary.Operator.Modulus, (Expression) $1, (Expression) $3);
4889 lbag.AddLocation ($$, GetLocation ($2));
4891 | prefixed_unary_expression OP_ADD_ASSIGN expression
4893 $$ = new CompoundAssign (Binary.Operator.Addition, (Expression) $1, (Expression) $3);
4894 lbag.AddLocation ($$, GetLocation ($2));
4896 | prefixed_unary_expression OP_SUB_ASSIGN expression
4898 $$ = new CompoundAssign (Binary.Operator.Subtraction, (Expression) $1, (Expression) $3);
4899 lbag.AddLocation ($$, GetLocation ($2));
4901 | prefixed_unary_expression OP_SHIFT_LEFT_ASSIGN expression
4903 $$ = new CompoundAssign (Binary.Operator.LeftShift, (Expression) $1, (Expression) $3);
4904 lbag.AddLocation ($$, GetLocation ($2));
4906 | prefixed_unary_expression OP_SHIFT_RIGHT_ASSIGN expression
4908 $$ = new CompoundAssign (Binary.Operator.RightShift, (Expression) $1, (Expression) $3);
4909 lbag.AddLocation ($$, GetLocation ($2));
4911 | prefixed_unary_expression OP_AND_ASSIGN expression
4913 $$ = new CompoundAssign (Binary.Operator.BitwiseAnd, (Expression) $1, (Expression) $3);
4914 lbag.AddLocation ($$, GetLocation ($2));
4916 | prefixed_unary_expression OP_OR_ASSIGN expression
4918 $$ = new CompoundAssign (Binary.Operator.BitwiseOr, (Expression) $1, (Expression) $3);
4919 lbag.AddLocation ($$, GetLocation ($2));
4921 | prefixed_unary_expression OP_XOR_ASSIGN expression
4923 $$ = new CompoundAssign (Binary.Operator.ExclusiveOr, (Expression) $1, (Expression) $3);
4924 lbag.AddLocation ($$, GetLocation ($2));
4928 lambda_parameter_list
4931 var pars = new List<Parameter> (4);
4932 pars.Add ((Parameter) $1);
4936 | lambda_parameter_list COMMA lambda_parameter
4938 var pars = (List<Parameter>) $1;
4939 Parameter p = (Parameter)$3;
4940 if (pars[0].GetType () != p.GetType ()) {
4941 report.Error (748, p.Location, "All lambda parameters must be typed either explicitly or implicitly");
4950 : parameter_modifier parameter_type identifier_inside_body
4952 var lt = (LocatedToken) $3;
4954 $$ = new Parameter ((FullNamedExpression) $2, lt.Value, (Parameter.Modifier) $1, null, lt.Location);
4956 | parameter_type identifier_inside_body
4958 var lt = (LocatedToken) $2;
4960 $$ = new Parameter ((FullNamedExpression) $1, lt.Value, Parameter.Modifier.NONE, null, lt.Location);
4964 var lt = (LocatedToken) $1;
4965 $$ = new ImplicitLambdaParameter (lt.Value, lt.Location);
4969 var lt = (LocatedToken) Error_AwaitAsIdentifier ($1);
4970 $$ = new ImplicitLambdaParameter (lt.Value, lt.Location);
4974 opt_lambda_parameter_list
4975 : /* empty */ { $$ = ParametersCompiled.EmptyReadOnlyParameters; }
4976 | lambda_parameter_list {
4977 var pars_list = (List<Parameter>) $1;
4978 $$ = new ParametersCompiled (pars_list.ToArray ());
4982 lambda_expression_body
4984 start_block (Location.Null);
4986 expression // All expressions must handle error or current block won't be restored and breaking ast completely
4988 Block b = end_block (Location.Null);
4989 b.IsCompilerGenerated = true;
4990 b.AddStatement (new ContextualReturn ((Expression) $2));
4996 // Handles only cases like foo = x.FirstOrDefault (l => );
4997 // where we must restore current_variable
4998 Block b = end_block (Location.Null);
4999 b.IsCompilerGenerated = true;
5001 Error_SyntaxError (yyToken);
5010 Error_SyntaxError (yyToken);
5018 var lt = (LocatedToken) $1;
5019 Parameter p = new ImplicitLambdaParameter (lt.Value, lt.Location);
5020 start_anonymous (true, new ParametersCompiled (p), false, lt.Location);
5022 lambda_expression_body
5024 $$ = end_anonymous ((ParametersBlock) $4);
5025 lbag.AddLocation ($$, GetLocation ($2));
5029 var lt = (LocatedToken) Error_AwaitAsIdentifier ($1);
5030 Parameter p = new ImplicitLambdaParameter (lt.Value, lt.Location);
5031 start_anonymous (true, new ParametersCompiled (p), false, lt.Location);
5033 lambda_expression_body
5035 $$ = end_anonymous ((ParametersBlock) $4);
5036 lbag.AddLocation ($$, GetLocation ($2));
5038 | ASYNC identifier_inside_body ARROW
5040 var lt = (LocatedToken) $2;
5041 Parameter p = new ImplicitLambdaParameter (lt.Value, lt.Location);
5042 start_anonymous (true, new ParametersCompiled (p), true, lt.Location);
5044 lambda_expression_body
5046 $$ = end_anonymous ((ParametersBlock) $5);
5047 lbag.AddLocation ($$, GetLocation ($1), GetLocation ($3));
5049 | OPEN_PARENS_LAMBDA
5051 valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out;
5053 opt_lambda_parameter_list CLOSE_PARENS ARROW
5055 valid_param_mod = 0;
5056 start_anonymous (true, (ParametersCompiled) $3, false, GetLocation ($1));
5058 lambda_expression_body
5060 $$ = end_anonymous ((ParametersBlock) $7);
5061 lbag.AddLocation ($$, GetLocation ($1), GetLocation ($4), GetLocation ($5));
5063 | ASYNC OPEN_PARENS_LAMBDA
5065 valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out;
5067 opt_lambda_parameter_list CLOSE_PARENS ARROW
5069 valid_param_mod = 0;
5070 start_anonymous (true, (ParametersCompiled) $4, true, GetLocation ($1));
5072 lambda_expression_body
5074 $$ = end_anonymous ((ParametersBlock) $8);
5075 lbag.AddLocation ($$, GetLocation ($1), GetLocation ($2), GetLocation ($5), GetLocation ($6));
5080 : assignment_expression
5081 | non_assignment_expression
5084 non_assignment_expression
5085 : conditional_expression
5090 $$ = new ArglistAccess (GetLocation ($1));
5094 undocumented_expressions
5095 : REFVALUE OPEN_PARENS non_assignment_expression COMMA type CLOSE_PARENS
5097 $$ = new RefValueExpr ((Expression) $3, (FullNamedExpression) $5, GetLocation ($1));
5098 lbag.AddLocation ($$, GetLocation ($2), GetLocation ($4), GetLocation ($6));
5100 | REFTYPE open_parens_any expression CLOSE_PARENS
5102 $$ = new RefTypeExpr ((Expression) $3, GetLocation ($1));
5103 lbag.AddLocation ($$, GetLocation ($2), GetLocation ($4));
5105 | MAKEREF open_parens_any expression CLOSE_PARENS
5107 $$ = new MakeRefExpr ((Expression) $3, GetLocation ($1));
5108 lbag.AddLocation ($$, GetLocation ($2), GetLocation ($4));
5119 $$ = new BooleanExpression ((Expression) $1);
5123 opt_primary_parameters
5128 | primary_parameters
5132 : OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS
5136 // Cannot use opt_formal_parameter_list because it can be shared instance for empty parameters
5137 lbag.AppendToMember (current_container, GetLocation ($1), GetLocation ($3));
5139 if (lang_version != LanguageVersion.Experimental)
5140 FeatureIsNotAvailable (GetLocation ($1), "primary constructor");
5144 opt_primary_parameters_with_class_base
5153 | primary_parameters
5157 | primary_parameters class_base
5161 | primary_parameters class_base OPEN_PARENS
5163 ++lexer.parsing_block;
5164 current_type.PrimaryConstructorBaseArgumentsStart = GetLocation ($3);
5166 opt_argument_list CLOSE_PARENS
5168 lbag.AppendToMember (current_container, GetLocation ($6));
5169 current_type.PrimaryConstructorBaseArguments = (Arguments) $5;
5170 --lexer.parsing_block;
5186 type_declaration_name
5188 lexer.ConstraintsParsing = true;
5190 Class c = new Class (current_container, (MemberName) $6, (Modifiers) $2, (Attributes) $1);
5191 if (((c.ModFlags & Modifiers.STATIC) != 0) && lang_version == LanguageVersion.ISO_1) {
5192 FeatureIsNotAvailable (c.Location, "static classes");
5195 push_current_container (c, $3);
5196 valid_param_mod = ParameterModifierType.PrimaryConstructor;
5198 opt_primary_parameters_with_class_base
5199 opt_type_parameter_constraints_clauses
5201 valid_param_mod = 0;
5202 lexer.ConstraintsParsing = false;
5205 current_type.PrimaryConstructorParameters = (ParametersCompiled) $8;
5208 current_container.SetConstraints ((List<Constraints>) $9);
5209 lbag.AddMember (current_container, mod_locations, GetLocation ($4));
5212 current_container.PartialContainer.DocComment = Lexer.consume_doc_comment ();
5213 Lexer.doc_state = XmlCommentState.Allowed;
5216 lexer.parsing_modifiers = true;
5218 OPEN_BRACE opt_class_member_declarations CLOSE_BRACE
5220 --lexer.parsing_declaration;
5222 Lexer.doc_state = XmlCommentState.Allowed;
5227 lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($13));
5229 lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($13), GetLocation ($15));
5231 $$ = pop_current_class ();
5239 { $$ = $1; } // location
5245 mod_locations = null;
5247 lexer.parsing_modifiers = false;
5251 lexer.parsing_modifiers = false;
5257 | modifiers modifier
5259 var m1 = (Modifiers) $1;
5260 var m2 = (Modifiers) $2;
5262 if ((m1 & m2) != 0) {
5263 report.Error (1004, lexer.Location - ModifiersExtensions.Name (m2).Length,
5264 "Duplicate `{0}' modifier", ModifiersExtensions.Name (m2));
5265 } else if ((m2 & Modifiers.AccessibilityMask) != 0 && (m1 & Modifiers.AccessibilityMask) != 0 &&
5266 ((m2 | m1 & Modifiers.AccessibilityMask) != (Modifiers.PROTECTED | Modifiers.INTERNAL))) {
5267 report.Error (107, lexer.Location - ModifiersExtensions.Name (m2).Length,
5268 "More than one protection modifier specified");
5279 StoreModifierLocation ($$, GetLocation ($1));
5281 if (current_container.Kind == MemberKind.Namespace)
5282 report.Error (1530, GetLocation ($1), "Keyword `new' is not allowed on namespace elements");
5286 $$ = Modifiers.PUBLIC;
5287 StoreModifierLocation ($$, GetLocation ($1));
5291 $$ = Modifiers.PROTECTED;
5292 StoreModifierLocation ($$, GetLocation ($1));
5296 $$ = Modifiers.INTERNAL;
5297 StoreModifierLocation ($$, GetLocation ($1));
5301 $$ = Modifiers.PRIVATE;
5302 StoreModifierLocation ($$, GetLocation ($1));
5306 $$ = Modifiers.ABSTRACT;
5307 StoreModifierLocation ($$, GetLocation ($1));
5311 $$ = Modifiers.SEALED;
5312 StoreModifierLocation ($$, GetLocation ($1));
5316 $$ = Modifiers.STATIC;
5317 StoreModifierLocation ($$, GetLocation ($1));
5321 $$ = Modifiers.READONLY;
5322 StoreModifierLocation ($$, GetLocation ($1));
5326 $$ = Modifiers.VIRTUAL;
5327 StoreModifierLocation ($$, GetLocation ($1));
5331 $$ = Modifiers.OVERRIDE;
5332 StoreModifierLocation ($$, GetLocation ($1));
5336 $$ = Modifiers.EXTERN;
5337 StoreModifierLocation ($$, GetLocation ($1));
5341 $$ = Modifiers.VOLATILE;
5342 StoreModifierLocation ($$, GetLocation ($1));
5346 $$ = Modifiers.UNSAFE;
5347 StoreModifierLocation ($$, GetLocation ($1));
5348 if (!settings.Unsafe)
5349 Error_UnsafeCodeNotAllowed (GetLocation ($1));
5353 $$ = Modifiers.ASYNC;
5354 StoreModifierLocation ($$, GetLocation ($1));
5366 current_type.SetBaseTypes ((List<FullNamedExpression>) $2);
5368 | COLON type_list error
5370 Error_SyntaxError (yyToken);
5372 current_type.SetBaseTypes ((List<FullNamedExpression>) $2);
5376 opt_type_parameter_constraints_clauses
5378 | type_parameter_constraints_clauses
5384 type_parameter_constraints_clauses
5385 : type_parameter_constraints_clause
5387 var constraints = new List<Constraints> (1);
5388 constraints.Add ((Constraints) $1);
5391 | type_parameter_constraints_clauses type_parameter_constraints_clause
5393 var constraints = (List<Constraints>) $1;
5394 Constraints new_constraint = (Constraints)$2;
5396 foreach (Constraints c in constraints) {
5397 if (new_constraint.TypeParameter.Value == c.TypeParameter.Value) {
5398 report.Error (409, new_constraint.Location,
5399 "A constraint clause has already been specified for type parameter `{0}'",
5400 new_constraint.TypeParameter.Value);
5404 constraints.Add (new_constraint);
5409 type_parameter_constraints_clause
5410 : WHERE IDENTIFIER COLON type_parameter_constraints
5412 var lt = (LocatedToken) $2;
5413 $$ = new Constraints (new SimpleMemberName (lt.Value, lt.Location), (List<FullNamedExpression>) $4, GetLocation ($1));
5414 lbag.AddLocation ($$, GetLocation ($3));
5416 | WHERE IDENTIFIER error
5418 Error_SyntaxError (yyToken);
5420 var lt = (LocatedToken) $2;
5421 $$ = new Constraints (new SimpleMemberName (lt.Value, lt.Location), null, GetLocation ($1));
5425 type_parameter_constraints
5426 : type_parameter_constraint
5428 var constraints = new List<FullNamedExpression> (1);
5429 constraints.Add ((FullNamedExpression) $1);
5432 | type_parameter_constraints COMMA type_parameter_constraint
5434 var constraints = (List<FullNamedExpression>) $1;
5435 var prev = constraints [constraints.Count - 1] as SpecialContraintExpr;
5436 if (prev != null && (prev.Constraint & SpecialConstraint.Constructor) != 0) {
5437 report.Error (401, GetLocation ($2), "The `new()' constraint must be the last constraint specified");
5440 prev = $3 as SpecialContraintExpr;
5442 if ((prev.Constraint & (SpecialConstraint.Class | SpecialConstraint.Struct)) != 0) {
5443 report.Error (449, prev.Location, "The `class' or `struct' constraint must be the first constraint specified");
5445 prev = constraints [0] as SpecialContraintExpr;
5446 if (prev != null && (prev.Constraint & SpecialConstraint.Struct) != 0) {
5447 report.Error (451, GetLocation ($3), "The `new()' constraint cannot be used with the `struct' constraint");
5452 constraints.Add ((FullNamedExpression) $3);
5457 type_parameter_constraint
5460 if ($1 is ComposedCast)
5461 report.Error (706, GetLocation ($1), "Invalid constraint type `{0}'", ((ComposedCast)$1).GetSignatureForError ());
5465 | NEW OPEN_PARENS CLOSE_PARENS
5467 $$ = new SpecialContraintExpr (SpecialConstraint.Constructor, GetLocation ($1));
5468 lbag.AddLocation ($$, GetLocation ($2), GetLocation ($3));
5472 $$ = new SpecialContraintExpr (SpecialConstraint.Class, GetLocation ($1));
5476 $$ = new SpecialContraintExpr (SpecialConstraint.Struct, GetLocation ($1));
5480 opt_type_parameter_variance
5485 | type_parameter_variance
5487 if (lang_version <= LanguageVersion.V_3)
5488 FeatureIsNotAvailable (lexer.Location, "generic type variance");
5494 type_parameter_variance
5497 $$ = new VarianceDecl (Variance.Covariant, GetLocation ($1));
5501 $$ = new VarianceDecl (Variance.Contravariant, GetLocation ($1));
5510 // A block is "contained" on the following places:
5512 // property_declaration as part of the accessor body (get/set)
5513 // operator_declaration
5514 // constructor_declaration
5515 // destructor_declaration
5516 // event_declaration as part of add_accessor_declaration or remove_accessor_declaration
5521 ++lexer.parsing_block;
5522 start_block (GetLocation ($1));
5524 opt_statement_list block_end
5533 --lexer.parsing_block;
5534 $$ = end_block (GetLocation ($1));
5536 | COMPLETE_COMPLETION
5538 --lexer.parsing_block;
5539 $$ = end_block (lexer.Location);
5547 ++lexer.parsing_block;
5548 current_block.StartLocation = GetLocation ($1);
5550 opt_statement_list CLOSE_BRACE
5552 --lexer.parsing_block;
5553 $$ = end_block (GetLocation ($4));
5564 | statement_list statement
5568 : block_variable_declaration
5570 current_block.AddStatement ((Statement) $1);
5572 | valid_declaration_statement
5574 current_block.AddStatement ((Statement) $1);
5579 Error_SyntaxError (yyToken);
5585 // The interactive_statement and its derivatives are only
5586 // used to provide a special version of `expression_statement'
5587 // that has a side effect of assigning the expression to
5590 interactive_statement_list
5591 : interactive_statement
5592 | interactive_statement_list interactive_statement
5595 interactive_statement
5596 : block_variable_declaration
5598 current_block.AddStatement ((Statement) $1);
5600 | interactive_valid_declaration_statement
5602 current_block.AddStatement ((Statement) $1);
5607 valid_declaration_statement
5610 | expression_statement
5611 | selection_statement
5612 | iteration_statement
5616 | unchecked_statement
5623 interactive_valid_declaration_statement
5626 | interactive_expression_statement
5627 | selection_statement
5628 | iteration_statement
5632 | unchecked_statement
5640 : valid_declaration_statement
5641 | block_variable_declaration
5643 report.Error (1023, GetLocation ($1), "An embedded statement may not be a declaration or labeled statement");
5648 report.Error (1023, GetLocation ($1), "An embedded statement may not be a declaration or labeled statement");
5653 Error_SyntaxError (yyToken);
5654 $$ = new EmptyStatement (GetLocation ($1));
5661 // Uses lexer.Location because semicolon location is not kept in quick mode
5662 $$ = new EmptyStatement (lexer.Location);
5667 : identifier_inside_body COLON
5669 var lt = (LocatedToken) $1;
5670 LabeledStatement labeled = new LabeledStatement (lt.Value, current_block, lt.Location);
5671 lbag.AddLocation (labeled, GetLocation ($2));
5672 current_block.AddLabel (labeled);
5673 current_block.AddStatement (labeled);
5679 : variable_type_simple
5680 | variable_type_simple rank_specifiers
5683 $1 = new SimpleName ("var", ((VarExpr) $1).Location);
5685 $$ = new ComposedCast ((FullNamedExpression) $1, (ComposedTypeSpecifier) $2);
5690 * The following is from Rhys' grammar:
5691 * > Types in local variable declarations must be recognized as
5692 * > expressions to prevent reduce/reduce errors in the grammar.
5693 * > The expressions are converted into types during semantic analysis.
5695 variable_type_simple
5696 : type_name_expression opt_nullable
5698 // Ok, the above "primary_expression" is there to get rid of
5699 // both reduce/reduce and shift/reduces in the grammar, it should
5700 // really just be "type_name". If you use type_name, a reduce/reduce
5701 // creeps up. If you use namespace_or_type_name (which is all we need
5702 // really) two shift/reduces appear.
5705 // So the super-trick is that primary_expression
5706 // can only be either a SimpleName or a MemberAccess.
5707 // The MemberAccess case arises when you have a fully qualified type-name like :
5709 // SimpleName is when you have
5712 var expr = (ATypeNameExpression) $1;
5714 if (expr.Name == "var" && expr is SimpleName)
5715 $$ = new VarExpr (expr.Location);
5719 $$ = new ComposedCast (expr, (ComposedTypeSpecifier) $2);
5722 | type_name_expression pointer_stars
5724 var expr = (ATypeNameExpression) $1;
5725 $$ = new ComposedCast (expr, (ComposedTypeSpecifier) $2);
5727 | builtin_type_expression
5733 | pointer_star pointer_stars
5735 ((ComposedTypeSpecifier) $1).Next = (ComposedTypeSpecifier) $2;
5743 $$ = ComposedTypeSpecifier.CreatePointer (GetLocation ($1));
5747 identifier_inside_body
5751 $$ = Error_AwaitAsIdentifier ($1);
5755 block_variable_declaration
5756 : variable_type identifier_inside_body
5758 var lt = (LocatedToken) $2;
5759 var li = new LocalVariable (current_block, lt.Value, lt.Location);
5760 current_block.AddLocalName (li);
5761 current_variable = new BlockVariable ((FullNamedExpression) $1, li);
5763 opt_local_variable_initializer opt_variable_declarators SEMICOLON
5765 $$ = current_variable;
5766 current_variable = null;
5768 lbag.AddLocation ($$, PopLocation (), GetLocation ($6));
5770 lbag.AddLocation ($$, GetLocation ($6));
5772 | CONST variable_type identifier_inside_body
5774 var lt = (LocatedToken) $3;
5775 var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.Constant, lt.Location);
5776 current_block.AddLocalName (li);
5777 current_variable = new BlockConstant ((FullNamedExpression) $2, li);
5779 const_variable_initializer opt_const_declarators SEMICOLON
5781 $$ = current_variable;
5782 current_variable = null;
5783 lbag.AddLocation ($$, GetLocation ($1), GetLocation ($7));
5787 opt_local_variable_initializer
5789 | ASSIGN block_variable_initializer
5791 current_variable.Initializer = (Expression) $2;
5792 PushLocation (GetLocation ($1));
5793 $$ = current_variable;
5797 if (yyToken == Token.OPEN_BRACKET_EXPR) {
5798 report.Error (650, lexer.Location,
5799 "Syntax error, bad array declarator. To declare a managed array the rank specifier precedes the variable's identifier. To declare a fixed size buffer field, use the fixed keyword before the field type");
5801 Error_SyntaxError (yyToken);
5806 opt_variable_declarators
5808 | variable_declarators
5811 opt_using_or_fixed_variable_declarators
5813 | variable_declarators
5815 foreach (var d in current_variable.Declarators) {
5816 if (d.Initializer == null)
5817 Error_MissingInitializer (d.Variable.Location);
5822 variable_declarators
5823 : variable_declarator
5824 | variable_declarators variable_declarator
5828 : COMMA identifier_inside_body
5830 var lt = (LocatedToken) $2;
5831 var li = new LocalVariable (current_variable.Variable, lt.Value, lt.Location);
5832 var d = new BlockVariableDeclarator (li, null);
5833 current_variable.AddDeclarator (d);
5834 current_block.AddLocalName (li);
5835 lbag.AddLocation (d, GetLocation ($1));
5837 | COMMA identifier_inside_body ASSIGN block_variable_initializer
5839 var lt = (LocatedToken) $2;
5840 var li = new LocalVariable (current_variable.Variable, lt.Value, lt.Location);
5841 var d = new BlockVariableDeclarator (li, (Expression) $4);
5842 current_variable.AddDeclarator (d);
5843 current_block.AddLocalName (li);
5844 lbag.AddLocation (d, GetLocation ($1), GetLocation ($3));
5848 const_variable_initializer
5851 report.Error (145, lexer.Location, "A const field requires a value to be provided");
5853 | ASSIGN constant_initializer_expr
5855 current_variable.Initializer = (Expression) $2;
5859 opt_const_declarators
5866 | const_declarators const_declarator
5870 : COMMA identifier_inside_body ASSIGN constant_initializer_expr
5872 var lt = (LocatedToken) $2;
5873 var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.Constant, lt.Location);
5874 var d = new BlockVariableDeclarator (li, (Expression) $4);
5875 current_variable.AddDeclarator (d);
5876 current_block.AddLocalName (li);
5877 lbag.AddLocation (d, GetLocation ($1), GetLocation ($3));
5881 block_variable_initializer
5882 : variable_initializer
5883 | STACKALLOC simple_type OPEN_BRACKET_EXPR expression CLOSE_BRACKET
5885 $$ = new StackAlloc ((Expression) $2, (Expression) $4, GetLocation ($1));
5886 lbag.AddLocation ($$, GetLocation ($3), GetLocation ($5));
5888 | STACKALLOC simple_type
5890 report.Error (1575, GetLocation ($1), "A stackalloc expression requires [] after type");
5891 $$ = new StackAlloc ((Expression) $2, null, GetLocation ($1));
5895 expression_statement
5896 : statement_expression SEMICOLON
5899 lbag.AddStatement ($$, GetLocation ($2));
5901 | statement_expression COMPLETE_COMPLETION { $$ = $1; }
5902 | statement_expression CLOSE_BRACE
5905 report.Error (1002, GetLocation ($2), "; expected");
5906 lexer.putback ('}');
5910 interactive_expression_statement
5911 : interactive_statement_expression SEMICOLON { $$ = $1; }
5912 | interactive_statement_expression COMPLETE_COMPLETION { $$ = $1; }
5916 // We have to do the wrapping here and not in the case above,
5917 // because statement_expression is used for example in for_statement
5919 statement_expression
5922 ExpressionStatement s = $1 as ExpressionStatement;
5924 var expr = $1 as Expression;
5925 $$ = new StatementErrorExpression (expr);
5927 $$ = new StatementExpression (s);
5932 interactive_statement_expression
5935 Expression expr = (Expression) $1;
5936 $$ = new StatementExpression (new OptionalAssign (expr, lexer.Location));
5940 Error_SyntaxError (yyToken);
5941 $$ = new EmptyStatement (GetLocation ($1));
5951 : IF open_parens_any boolean_expression CLOSE_PARENS
5954 if ($5 is EmptyStatement)
5955 Warning_EmptyStatement (GetLocation ($5));
5957 $$ = new If ((BooleanExpression) $3, (Statement) $5, GetLocation ($1));
5958 lbag.AddStatement ($$, GetLocation ($2), GetLocation ($4));
5960 | IF open_parens_any boolean_expression CLOSE_PARENS
5961 embedded_statement ELSE embedded_statement
5963 $$ = new If ((BooleanExpression) $3, (Statement) $5, (Statement) $7, GetLocation ($1));
5964 lbag.AddStatement ($$, GetLocation ($2), GetLocation ($4), GetLocation ($6));
5966 if ($5 is EmptyStatement)
5967 Warning_EmptyStatement (GetLocation ($5));
5968 if ($7 is EmptyStatement)
5969 Warning_EmptyStatement (GetLocation ($7));
5971 | IF open_parens_any boolean_expression error
5973 Error_SyntaxError (yyToken);
5975 $$ = new If ((BooleanExpression) $3, null, GetLocation ($1));
5976 lbag.AddStatement ($$, GetLocation ($2));
5981 : SWITCH open_parens_any expression CLOSE_PARENS OPEN_BRACE
5983 start_block (GetLocation ($5));
5985 opt_switch_sections CLOSE_BRACE
5987 $$ = new Switch ((Expression) $3, (ExplicitBlock) current_block.Explicit, GetLocation ($1));
5988 end_block (GetLocation ($8));
5989 lbag.AddStatement ($$, GetLocation ($2), GetLocation ($4));
5991 | SWITCH open_parens_any expression error
5993 Error_SyntaxError (yyToken);
5995 $$ = new Switch ((Expression) $3, null, GetLocation ($1));
5996 lbag.AddStatement ($$, GetLocation ($2));
6003 report.Warning (1522, 1, current_block.StartLocation, "Empty switch block");
6010 | switch_sections switch_section
6013 Error_SyntaxError (yyToken);
6018 : switch_labels statement_list
6024 var label = (SwitchLabel) $1;
6025 label.SectionStart = true;
6026 current_block.AddStatement (label);
6028 | switch_labels switch_label
6030 current_block.AddStatement ((Statement) $2);
6035 : CASE constant_expression COLON
6037 $$ = new SwitchLabel ((Expression) $2, GetLocation ($1));
6038 lbag.AddLocation ($$, GetLocation ($3));
6040 | CASE constant_expression error
6042 Error_SyntaxError (yyToken);
6043 $$ = new SwitchLabel ((Expression) $2, GetLocation ($1));
6046 | CASE pattern_expr_invocation COLON
6048 if (lang_version != LanguageVersion.Experimental)
6049 FeatureIsNotAvailable (GetLocation ($2), "pattern matching");
6051 $$ = new SwitchLabel ((Expression) $2, GetLocation ($1)) {
6052 PatternMatching = true
6054 lbag.AddLocation ($$, GetLocation ($3));
6059 $$ = new SwitchLabel (null, GetLocation ($1));
6071 : WHILE open_parens_any boolean_expression CLOSE_PARENS embedded_statement
6073 if ($5 is EmptyStatement && lexer.peek_token () == Token.OPEN_BRACE)
6074 Warning_EmptyStatement (GetLocation ($5));
6076 $$ = new While ((BooleanExpression) $3, (Statement) $5, GetLocation ($1));
6077 lbag.AddStatement ($$, GetLocation ($2), GetLocation ($4));
6079 | WHILE open_parens_any boolean_expression error
6081 Error_SyntaxError (yyToken);
6083 $$ = new While ((BooleanExpression) $3, null, GetLocation ($1));
6084 lbag.AddStatement ($$, GetLocation ($2));
6089 : DO embedded_statement WHILE open_parens_any boolean_expression CLOSE_PARENS SEMICOLON
6091 $$ = new Do ((Statement) $2, (BooleanExpression) $5, GetLocation ($1), GetLocation ($3));
6092 lbag.AddStatement ($$, GetLocation ($3), GetLocation ($4), GetLocation ($6), GetLocation ($7));
6094 | DO embedded_statement error
6096 Error_SyntaxError (yyToken);
6097 $$ = new Do ((Statement) $2, null, GetLocation ($1), Location.Null);
6099 | DO embedded_statement WHILE open_parens_any boolean_expression error
6101 Error_SyntaxError (yyToken);
6103 $$ = new Do ((Statement) $2, (BooleanExpression) $5, GetLocation ($1), GetLocation ($3));
6104 lbag.AddStatement ($$, GetLocation ($3), GetLocation ($4));
6109 : FOR open_parens_any
6111 start_block (GetLocation ($2));
6112 current_block.IsCompilerGenerated = true;
6113 For f = new For (GetLocation ($1));
6114 current_block.AddStatement (f);
6123 // Has to use be extra rule to recover started block
6125 : opt_for_initializer SEMICOLON
6127 ((For) $0).Initializer = (Statement) $1;
6129 // Pass the "For" object to the iterator_part4
6130 oob_stack.Push ($0);
6132 for_condition_and_iterator_part
6135 var locations = (Tuple<Location,Location>) $4;
6137 if ($5 is EmptyStatement && lexer.peek_token () == Token.OPEN_BRACE)
6138 Warning_EmptyStatement (GetLocation ($5));
6141 f.Statement = (Statement) $5;
6142 lbag.AddStatement (f, current_block.StartLocation, GetLocation ($2), GetLocation (locations.Item1), GetLocation (locations.Item2));
6144 $$ = end_block (GetLocation ($2));
6148 Error_SyntaxError (yyToken);
6149 $$ = end_block (current_block.StartLocation);
6153 for_condition_and_iterator_part
6154 : opt_for_condition SEMICOLON
6156 For f = (For) oob_stack.Peek ();
6157 f.Condition = (BooleanExpression) $1;
6160 $$ = new Tuple<Location,Location> (GetLocation ($2), (Location) $4);
6163 // Handle errors in the case of opt_for_condition being followed by
6164 // a close parenthesis
6165 | opt_for_condition close_parens_close_brace {
6166 report.Error (1525, GetLocation ($2), "Unexpected symbol `}'");
6167 For f = (For) oob_stack.Peek ();
6168 f.Condition = (BooleanExpression) $1;
6169 $$ = new Tuple<Location,Location> (GetLocation ($2), GetLocation ($2));
6174 : opt_for_iterator CLOSE_PARENS {
6175 For f = (For) oob_stack.Peek ();
6176 f.Iterator = (Statement) $1;
6177 $$ = GetLocation ($2);
6179 | opt_for_iterator CLOSE_BRACE {
6180 report.Error (1525, GetLocation ($2), "Unexpected symbol expected ')'");
6181 For f = (For) oob_stack.Peek ();
6182 f.Iterator = (Statement) $1;
6183 $$ = GetLocation ($2);
6187 close_parens_close_brace
6189 | CLOSE_BRACE { lexer.putback ('}'); }
6193 : /* empty */ { $$ = new EmptyStatement (lexer.Location); }
6198 : variable_type identifier_inside_body
6200 var lt = (LocatedToken) $2;
6201 var li = new LocalVariable (current_block, lt.Value, lt.Location);
6202 current_block.AddLocalName (li);
6203 current_variable = new BlockVariable ((FullNamedExpression) $1, li);
6205 opt_local_variable_initializer opt_variable_declarators
6207 $$ = current_variable;
6209 lbag.AddLocation (current_variable, PopLocation ());
6211 current_variable = null;
6213 | statement_expression_list
6217 : /* empty */ { $$ = null; }
6218 | boolean_expression
6222 : /* empty */ { $$ = new EmptyStatement (lexer.Location); }
6227 : statement_expression_list
6230 statement_expression_list
6231 : statement_expression
6232 | statement_expression_list COMMA statement_expression
6234 var sl = $1 as StatementList;
6236 sl = new StatementList ((Statement) $1, (Statement) $3);
6237 lbag.AddStatement (sl, GetLocation ($2));
6239 sl.Add ((Statement) $3);
6240 lbag.AppendTo (sl, GetLocation ($2));
6248 : FOREACH open_parens_any type error
6250 report.Error (230, GetLocation ($1), "Type and identifier are both required in a foreach statement");
6252 start_block (GetLocation ($2));
6253 current_block.IsCompilerGenerated = true;
6255 Foreach f = new Foreach ((Expression) $3, null, null, null, null, GetLocation ($1));
6256 current_block.AddStatement (f);
6258 lbag.AddStatement (f, GetLocation ($2));
6259 $$ = end_block (GetLocation ($4));
6261 | FOREACH open_parens_any type identifier_inside_body error
6263 Error_SyntaxError (yyToken);
6265 start_block (GetLocation ($2));
6266 current_block.IsCompilerGenerated = true;
6268 var lt = (LocatedToken) $4;
6269 var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.ForeachVariable | LocalVariable.Flags.Used, lt.Location);
6270 current_block.AddLocalName (li);
6272 Foreach f = new Foreach ((Expression) $3, li, null, null, null, GetLocation ($1));
6273 current_block.AddStatement (f);
6275 lbag.AddStatement (f, GetLocation ($2));
6276 $$ = end_block (GetLocation ($5));
6278 | FOREACH open_parens_any type identifier_inside_body IN expression CLOSE_PARENS
6280 start_block (GetLocation ($2));
6281 current_block.IsCompilerGenerated = true;
6283 var lt = (LocatedToken) $4;
6284 var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.ForeachVariable | LocalVariable.Flags.Used, lt.Location);
6285 current_block.AddLocalName (li);
6290 if ($9 is EmptyStatement && lexer.peek_token () == Token.OPEN_BRACE)
6291 Warning_EmptyStatement (GetLocation ($9));
6293 Foreach f = new Foreach ((Expression) $3, (LocalVariable) $8, (Expression) $6, (Statement) $9, current_block, GetLocation ($1));
6294 lbag.AddStatement (f, GetLocation ($2), GetLocation ($5), GetLocation ($7));
6295 end_block (GetLocation ($7));
6303 | continue_statement
6313 $$ = new Break (GetLocation ($1));
6314 lbag.AddStatement ($$, GetLocation ($2));
6319 : CONTINUE SEMICOLON
6321 $$ = new Continue (GetLocation ($1));
6322 lbag.AddStatement ($$, GetLocation ($2));
6326 Error_SyntaxError (yyToken);
6327 $$ = new Continue (GetLocation ($1));
6332 : GOTO identifier_inside_body SEMICOLON
6334 var lt = (LocatedToken) $2;
6335 $$ = new Goto (lt.Value, GetLocation ($1));
6336 lbag.AddStatement ($$, GetLocation ($2), GetLocation ($3));
6338 | GOTO CASE constant_expression SEMICOLON
6340 $$ = new GotoCase ((Expression) $3, GetLocation ($1));
6341 lbag.AddStatement ($$, GetLocation ($2), GetLocation ($4));
6343 | GOTO DEFAULT SEMICOLON
6345 $$ = new GotoDefault (GetLocation ($1));
6346 lbag.AddStatement ($$, GetLocation ($2), GetLocation ($3));
6351 : RETURN opt_expression SEMICOLON
6353 $$ = new Return ((Expression) $2, GetLocation ($1));
6354 lbag.AddStatement ($$, GetLocation ($3));
6356 | RETURN expression error
6358 Error_SyntaxError (yyToken);
6359 $$ = new Return ((Expression) $2, GetLocation ($1));
6363 Error_SyntaxError (yyToken);
6364 $$ = new Return (null, GetLocation ($1));
6369 : THROW opt_expression SEMICOLON
6371 $$ = new Throw ((Expression) $2, GetLocation ($1));
6372 lbag.AddStatement ($$, GetLocation ($3));
6374 | THROW expression error
6376 Error_SyntaxError (yyToken);
6377 $$ = new Throw ((Expression) $2, GetLocation ($1));
6381 Error_SyntaxError (yyToken);
6382 $$ = new Throw (null, GetLocation ($1));
6387 : identifier_inside_body RETURN opt_expression SEMICOLON
6389 var lt = (LocatedToken) $1;
6390 string s = lt.Value;
6392 report.Error (1003, lt.Location, "; expected");
6393 } else if ($3 == null) {
6394 report.Error (1627, GetLocation ($4), "Expression expected after yield return");
6395 } else if (lang_version == LanguageVersion.ISO_1){
6396 FeatureIsNotAvailable (lt.Location, "iterators");
6399 current_block.Explicit.RegisterIteratorYield ();
6400 $$ = new Yield ((Expression) $3, lt.Location);
6401 lbag.AddStatement ($$, GetLocation ($2), GetLocation ($4));
6403 | identifier_inside_body RETURN expression error
6405 Error_SyntaxError (yyToken);
6407 var lt = (LocatedToken) $1;
6408 string s = lt.Value;
6410 report.Error (1003, lt.Location, "; expected");
6411 } else if ($3 == null) {
6412 report.Error (1627, GetLocation ($4), "Expression expected after yield return");
6413 } else if (lang_version == LanguageVersion.ISO_1){
6414 FeatureIsNotAvailable (lt.Location, "iterators");
6417 current_block.Explicit.RegisterIteratorYield ();
6418 $$ = new Yield ((Expression) $3, lt.Location);
6419 lbag.AddStatement ($$, GetLocation ($2));
6421 | identifier_inside_body BREAK SEMICOLON
6423 var lt = (LocatedToken) $1;
6424 string s = lt.Value;
6426 report.Error (1003, lt.Location, "; expected");
6427 } else if (lang_version == LanguageVersion.ISO_1){
6428 FeatureIsNotAvailable (lt.Location, "iterators");
6431 current_block.ParametersBlock.TopBlock.IsIterator = true;
6432 $$ = new YieldBreak (lt.Location);
6433 lbag.AddStatement ($$, GetLocation ($2), GetLocation ($3));
6443 : TRY block catch_clauses
6445 $$ = new TryCatch ((Block) $2, (List<Catch>) $3, GetLocation ($1), false);
6447 | TRY block FINALLY block
6449 $$ = new TryFinally ((Statement) $2, (ExplicitBlock) $4, GetLocation ($1));
6450 lbag.AddStatement ($$, GetLocation ($3));
6452 | TRY block catch_clauses FINALLY block
6454 $$ = new TryFinally (new TryCatch ((Block) $2, (List<Catch>) $3, Location.Null, true), (ExplicitBlock) $5, GetLocation ($1));
6455 lbag.AddStatement ($$, GetLocation ($4));
6459 Error_SyntaxError (1524, yyToken);
6460 $$ = new TryCatch ((Block) $2, null, GetLocation ($1), false);
6467 var l = new List<Catch> (2);
6472 | catch_clauses catch_clause
6474 var l = (List<Catch>) $1;
6476 Catch c = (Catch) $2;
6477 var prev_catch = l [l.Count - 1];
6478 if (prev_catch.IsGeneral && prev_catch.Filter == null) {
6479 report.Error (1017, c.loc, "Try statement already has an empty catch block");
6489 | identifier_inside_body
6493 : CATCH opt_catch_filter block
6495 var c = new Catch ((ExplicitBlock) $3, GetLocation ($1));
6496 c.Filter = (CatchFilterExpression) $2;
6499 | CATCH open_parens_any type opt_identifier CLOSE_PARENS
6501 start_block (GetLocation ($2));
6502 var c = new Catch ((ExplicitBlock) current_block, GetLocation ($1));
6503 c.TypeExpression = (FullNamedExpression) $3;
6506 var lt = (LocatedToken) $4;
6507 c.Variable = new LocalVariable (current_block, lt.Value, lt.Location);
6508 current_block.AddLocalName (c.Variable);
6511 lbag.AddLocation (c, GetLocation ($2), GetLocation ($5));
6513 lexer.parsing_catch_when = true;
6515 opt_catch_filter_or_error
6517 ((Catch) $6).Filter = (CatchFilterExpression) $7;
6520 | CATCH open_parens_any error
6522 if (yyToken == Token.CLOSE_PARENS) {
6523 report.Error (1015, lexer.Location,
6524 "A type that derives from `System.Exception', `object', or `string' expected");
6526 Error_SyntaxError (yyToken);
6529 $$ = new Catch (null, GetLocation ($1));
6533 opt_catch_filter_or_error
6534 : opt_catch_filter block_prepared
6540 end_block (Location.Null);
6541 Error_SyntaxError (yyToken);
6548 lexer.parsing_catch_when = false;
6552 lexer.parsing_catch_when = false;
6554 open_parens_any expression CLOSE_PARENS
6556 if (lang_version <= LanguageVersion.V_5)
6557 FeatureIsNotAvailable (GetLocation ($1), "exception filter");
6559 $$ = new CatchFilterExpression ((Expression) $4, GetLocation ($1));
6560 lbag.AddLocation ($$, GetLocation ($3), GetLocation ($5));
6567 $$ = new Checked ((Block) $2, GetLocation ($1));
6574 $$ = new Unchecked ((Block) $2, GetLocation ($1));
6581 if (!settings.Unsafe)
6582 Error_UnsafeCodeNotAllowed (GetLocation ($1));
6584 $$ = new Unsafe ((Block) $3, GetLocation ($1));
6589 : LOCK open_parens_any expression CLOSE_PARENS embedded_statement
6591 if ($5 is EmptyStatement && lexer.peek_token () == Token.OPEN_BRACE)
6592 Warning_EmptyStatement (GetLocation ($5));
6594 $$ = new Lock ((Expression) $3, (Statement) $5, GetLocation ($1));
6595 lbag.AddStatement ($$, GetLocation ($2), GetLocation ($4));
6597 | LOCK open_parens_any expression error
6599 Error_SyntaxError (yyToken);
6601 $$ = new Lock ((Expression) $3, null, GetLocation ($1));
6602 lbag.AddStatement ($$, GetLocation ($2));
6607 : FIXED open_parens_any variable_type identifier_inside_body
6609 start_block (GetLocation ($2));
6611 current_block.IsCompilerGenerated = true;
6612 var lt = (LocatedToken) $4;
6613 var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.FixedVariable | LocalVariable.Flags.Used, lt.Location);
6614 current_block.AddLocalName (li);
6615 current_variable = new Fixed.VariableDeclaration ((FullNamedExpression) $3, li);
6617 using_or_fixed_variable_initializer opt_using_or_fixed_variable_declarators CLOSE_PARENS
6619 $$ = current_variable;
6620 current_variable = null;
6624 if ($10 is EmptyStatement && lexer.peek_token () == Token.OPEN_BRACE)
6625 Warning_EmptyStatement (GetLocation ($10));
6627 Fixed f = new Fixed ((Fixed.VariableDeclaration) $9, (Statement) $10, GetLocation ($1));
6628 current_block.AddStatement (f);
6629 lbag.AddStatement (f, GetLocation ($2), GetLocation ($8));
6630 $$ = end_block (GetLocation ($8));
6635 : USING open_parens_any variable_type identifier_inside_body
6637 start_block (GetLocation ($2));
6639 current_block.IsCompilerGenerated = true;
6640 var lt = (LocatedToken) $4;
6641 var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.UsingVariable | LocalVariable.Flags.Used, lt.Location);
6642 current_block.AddLocalName (li);
6643 current_variable = new Using.VariableDeclaration ((FullNamedExpression) $3, li);
6645 using_initialization CLOSE_PARENS
6647 $$ = current_variable;
6648 current_variable = null;
6652 if ($9 is EmptyStatement && lexer.peek_token () == Token.OPEN_BRACE)
6653 Warning_EmptyStatement (GetLocation ($9));
6655 Using u = new Using ((Using.VariableDeclaration) $8, (Statement) $9, GetLocation ($1));
6656 current_block.AddStatement (u);
6657 $$ = end_block (GetLocation ($7));
6659 | USING open_parens_any expression CLOSE_PARENS embedded_statement
6661 if ($5 is EmptyStatement && lexer.peek_token () == Token.OPEN_BRACE)
6662 Warning_EmptyStatement (GetLocation ($5));
6664 $$ = new Using ((Expression) $3, (Statement) $5, GetLocation ($1));
6665 lbag.AddStatement ($$, GetLocation ($2), GetLocation ($4));
6667 | USING open_parens_any expression error
6669 Error_SyntaxError (yyToken);
6671 $$ = new Using ((Expression) $3, null, GetLocation ($1));
6672 lbag.AddStatement ($$, GetLocation ($2));
6676 using_initialization
6677 : using_or_fixed_variable_initializer opt_using_or_fixed_variable_declarators
6680 // It has to be here for the parent to safely restore artificial block
6681 Error_SyntaxError (yyToken);
6685 using_or_fixed_variable_initializer
6688 Error_MissingInitializer (lexer.Location);
6690 | ASSIGN variable_initializer
6692 current_variable.Initializer = (Expression) $2;
6693 $$ = current_variable;
6701 : first_from_clause query_body
6703 lexer.query_parsing = false;
6705 Linq.AQueryClause from = $1 as Linq.AQueryClause;
6707 from.Tail.Next = (Linq.AQueryClause)$2;
6710 current_block.SetEndLocation (lexer.Location);
6711 current_block = current_block.Parent;
6713 | nested_from_clause query_body
6715 Linq.AQueryClause from = $1 as Linq.AQueryClause;
6717 from.Tail.Next = (Linq.AQueryClause)$2;
6720 current_block.SetEndLocation (lexer.Location);
6721 current_block = current_block.Parent;
6724 // Bubble up COMPLETE_COMPLETION productions
6725 | first_from_clause COMPLETE_COMPLETION {
6726 lexer.query_parsing = false;
6729 current_block.SetEndLocation (lexer.Location);
6730 current_block = current_block.Parent;
6732 | nested_from_clause COMPLETE_COMPLETION {
6734 current_block.SetEndLocation (lexer.Location);
6735 current_block = current_block.Parent;
6740 : FROM_FIRST identifier_inside_body IN expression
6742 current_block = new Linq.QueryBlock (current_block, lexer.Location);
6744 var lt = (LocatedToken) $2;
6745 var rv = new Linq.RangeVariable (lt.Value, lt.Location);
6746 var clause = new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$4, rv, GetLocation ($1));
6747 lbag.AddLocation (clause, GetLocation ($3));
6748 $$ = new Linq.QueryExpression (clause);
6750 | FROM_FIRST type identifier_inside_body IN expression
6752 current_block = new Linq.QueryBlock (current_block, lexer.Location);
6754 var lt = (LocatedToken) $3;
6755 var rv = new Linq.RangeVariable (lt.Value, lt.Location);
6756 var clause = new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$5, rv, GetLocation ($1)) {
6757 IdentifierType = (FullNamedExpression)$2
6759 lbag.AddLocation (clause, GetLocation ($4));
6760 $$ = new Linq.QueryExpression (clause);
6765 : FROM identifier_inside_body IN expression
6767 current_block = new Linq.QueryBlock (current_block, lexer.Location);
6769 var lt = (LocatedToken) $2;
6770 var rv = new Linq.RangeVariable (lt.Value, lt.Location);
6771 var clause = new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$4, rv, GetLocation ($1));
6772 lbag.AddLocation (clause, GetLocation ($3));
6773 $$ = new Linq.QueryExpression (clause);
6775 | FROM type identifier_inside_body IN expression
6777 current_block = new Linq.QueryBlock (current_block, lexer.Location);
6779 var lt = (LocatedToken) $3;
6780 var rv = new Linq.RangeVariable (lt.Value, lt.Location);
6781 var clause = new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$5, rv, GetLocation ($1)) {
6782 IdentifierType = (FullNamedExpression)$2
6784 lbag.AddLocation (clause, GetLocation ($4));
6785 $$ = new Linq.QueryExpression (clause);
6790 : FROM identifier_inside_body IN
6792 current_block = new Linq.QueryBlock (current_block, lexer.Location);
6796 var lt = (LocatedToken) $2;
6797 var sn = new Linq.RangeVariable (lt.Value, lt.Location);
6798 $$ = new Linq.SelectMany ((Linq.QueryBlock)current_block, sn, (Expression)$5, GetLocation ($1));
6800 current_block.SetEndLocation (lexer.Location);
6801 current_block = current_block.Parent;
6803 ((Linq.QueryBlock)current_block).AddRangeVariable (sn);
6804 lbag.AddLocation ($$, GetLocation ($3));
6806 | FROM type identifier_inside_body IN
6808 current_block = new Linq.QueryBlock (current_block, lexer.Location);
6812 var lt = (LocatedToken) $3;
6813 var sn = new Linq.RangeVariable (lt.Value, lt.Location);
6815 $$ = new Linq.SelectMany ((Linq.QueryBlock)current_block, sn, (Expression)$6, GetLocation ($1)) {
6816 IdentifierType = (FullNamedExpression)$2
6819 current_block.SetEndLocation (lexer.Location);
6820 current_block = current_block.Parent;
6822 ((Linq.QueryBlock)current_block).AddRangeVariable (sn);
6824 lbag.AddLocation ($$, GetLocation ($4));
6829 : query_body_clauses select_or_group_clause opt_query_continuation
6831 Linq.AQueryClause head = (Linq.AQueryClause)$2;
6834 head.Next = (Linq.AQueryClause)$3;
6837 Linq.AQueryClause clause = (Linq.AQueryClause)$1;
6838 clause.Tail.Next = head;
6844 | select_or_group_clause opt_query_continuation
6846 Linq.AQueryClause head = (Linq.AQueryClause)$2;
6849 Linq.AQueryClause clause = (Linq.AQueryClause)$1;
6850 clause.Tail.Next = head;
6856 | query_body_clauses COMPLETE_COMPLETION
6857 | query_body_clauses error
6859 report.Error (742, GetLocation ($2), "Unexpected symbol `{0}'. A query body must end with select or group clause", GetSymbolName (yyToken));
6864 Error_SyntaxError (yyToken);
6869 select_or_group_clause
6872 current_block = new Linq.QueryBlock (current_block, lexer.Location);
6876 $$ = new Linq.Select ((Linq.QueryBlock)current_block, (Expression)$3, GetLocation ($1));
6878 current_block.SetEndLocation (lexer.Location);
6879 current_block = current_block.Parent;
6883 if (linq_clause_blocks == null)
6884 linq_clause_blocks = new Stack<Linq.QueryBlock> ();
6886 current_block = new Linq.QueryBlock (current_block, lexer.Location);
6887 linq_clause_blocks.Push ((Linq.QueryBlock)current_block);
6891 current_block.SetEndLocation (lexer.Location);
6892 current_block = current_block.Parent;
6894 current_block = new Linq.QueryBlock (current_block, lexer.Location);
6898 var obj = (object[]) $5;
6900 $$ = new Linq.GroupBy ((Linq.QueryBlock)current_block, (Expression)$3, linq_clause_blocks.Pop (), (Expression)obj[0], GetLocation ($1));
6901 lbag.AddLocation ($$, (Location) obj[1]);
6903 current_block.SetEndLocation (lexer.Location);
6904 current_block = current_block.Parent;
6909 : BY expression_or_error
6911 $$ = new object[] { $2, GetLocation ($1) };
6915 Error_SyntaxError (yyToken);
6916 $$ = new object[2] { null, Location.Null };
6922 | query_body_clauses query_body_clause
6924 ((Linq.AQueryClause)$1).Tail.Next = (Linq.AQueryClause)$2;
6938 : LET identifier_inside_body ASSIGN
6940 current_block = new Linq.QueryBlock (current_block, lexer.Location);
6944 var lt = (LocatedToken) $2;
6945 var sn = new Linq.RangeVariable (lt.Value, lt.Location);
6946 $$ = new Linq.Let ((Linq.QueryBlock) current_block, sn, (Expression)$5, GetLocation ($1));
6947 lbag.AddLocation ($$, GetLocation ($3));
6949 current_block.SetEndLocation (lexer.Location);
6950 current_block = current_block.Parent;
6952 ((Linq.QueryBlock)current_block).AddRangeVariable (sn);
6959 current_block = new Linq.QueryBlock (current_block, lexer.Location);
6963 $$ = new Linq.Where ((Linq.QueryBlock)current_block, (Expression)$3, GetLocation ($1));
6965 current_block.SetEndLocation (lexer.Location);
6966 current_block = current_block.Parent;
6971 : JOIN identifier_inside_body IN
6973 if (linq_clause_blocks == null)
6974 linq_clause_blocks = new Stack<Linq.QueryBlock> ();
6976 current_block = new Linq.QueryBlock (current_block, lexer.Location);
6977 linq_clause_blocks.Push ((Linq.QueryBlock) current_block);
6979 expression_or_error ON
6981 current_block.SetEndLocation (lexer.Location);
6982 current_block = current_block.Parent;
6984 current_block = new Linq.QueryBlock (current_block, lexer.Location);
6985 linq_clause_blocks.Push ((Linq.QueryBlock) current_block);
6987 expression_or_error EQUALS
6989 current_block.AddStatement (new ContextualReturn ((Expression) $8));
6990 current_block.SetEndLocation (lexer.Location);
6991 current_block = current_block.Parent;
6993 current_block = new Linq.QueryBlock (current_block, lexer.Location);
6995 expression_or_error opt_join_into
6997 current_block.AddStatement (new ContextualReturn ((Expression) $11));
6998 current_block.SetEndLocation (lexer.Location);
7000 var outer_selector = linq_clause_blocks.Pop ();
7001 var block = linq_clause_blocks.Pop ();
7003 var lt = (LocatedToken) $2;
7004 var sn = new Linq.RangeVariable (lt.Value, lt.Location);
7005 Linq.RangeVariable into;
7009 $$ = new Linq.Join (block, sn, (Expression)$5, outer_selector, (Linq.QueryBlock) current_block, GetLocation ($1));
7010 lbag.AddLocation ($$, GetLocation ($3), GetLocation ($6), GetLocation ($9));
7013 // Set equals right side parent to beginning of linq query, it is not accessible therefore cannot cause name collisions
7015 var parent = block.Parent;
7016 while (parent is Linq.QueryBlock) {
7017 parent = parent.Parent;
7019 current_block.Parent = parent;
7021 ((Linq.QueryBlock)current_block).AddRangeVariable (sn);
7023 lt = (LocatedToken) $12;
7024 into = new Linq.RangeVariable (lt.Value, lt.Location);
7026 $$ = new Linq.GroupJoin (block, sn, (Expression)$5, outer_selector, (Linq.QueryBlock) current_block, into, GetLocation ($1));
7027 lbag.AddLocation ($$, GetLocation ($3), GetLocation ($6), GetLocation ($9), GetLocation ($12));
7030 current_block = block.Parent;
7031 ((Linq.QueryBlock)current_block).AddRangeVariable (into);
7033 | JOIN type identifier_inside_body IN
7035 if (linq_clause_blocks == null)
7036 linq_clause_blocks = new Stack<Linq.QueryBlock> ();
7038 current_block = new Linq.QueryBlock (current_block, lexer.Location);
7039 linq_clause_blocks.Push ((Linq.QueryBlock) current_block);
7041 expression_or_error ON
7043 current_block.SetEndLocation (lexer.Location);
7044 current_block = current_block.Parent;
7046 current_block = new Linq.QueryBlock (current_block, lexer.Location);
7047 linq_clause_blocks.Push ((Linq.QueryBlock) current_block);
7049 expression_or_error EQUALS
7051 current_block.AddStatement (new ContextualReturn ((Expression) $9));
7052 current_block.SetEndLocation (lexer.Location);
7053 current_block = current_block.Parent;
7055 current_block = new Linq.QueryBlock (current_block, lexer.Location);
7057 expression_or_error opt_join_into
7059 current_block.AddStatement (new ContextualReturn ((Expression) $12));
7060 current_block.SetEndLocation (lexer.Location);
7062 var outer_selector = linq_clause_blocks.Pop ();
7063 var block = linq_clause_blocks.Pop ();
7065 var lt = (LocatedToken) $3;
7066 var sn = new Linq.RangeVariable (lt.Value, lt.Location);
7067 Linq.RangeVariable into;
7071 $$ = new Linq.Join (block, sn, (Expression)$6, outer_selector, (Linq.QueryBlock) current_block, GetLocation ($1)) {
7072 IdentifierType = (FullNamedExpression)$2
7074 lbag.AddLocation ($$, GetLocation ($3), GetLocation ($6), GetLocation ($9));
7077 // Set equals right side parent to beginning of linq query, it is not accessible therefore cannot cause name collisions
7079 var parent = block.Parent;
7080 while (parent is Linq.QueryBlock) {
7081 parent = parent.Parent;
7083 current_block.Parent = parent;
7085 ((Linq.QueryBlock)current_block).AddRangeVariable (sn);
7087 lt = (LocatedToken) $13;
7088 into = new Linq.RangeVariable (lt.Value, lt.Location); // TODO:
7090 $$ = new Linq.GroupJoin (block, sn, (Expression)$6, outer_selector, (Linq.QueryBlock) current_block, into, GetLocation ($1)) {
7091 IdentifierType = (FullNamedExpression)$2
7095 current_block = block.Parent;
7096 ((Linq.QueryBlock)current_block).AddRangeVariable (into);
7102 | INTO identifier_inside_body
7111 current_block = new Linq.QueryBlock (current_block, lexer.Location);
7115 current_block.SetEndLocation (lexer.Location);
7116 current_block = current_block.Parent;
7126 current_block.SetEndLocation (lexer.Location);
7127 current_block = current_block.Parent;
7129 current_block = new Linq.QueryBlock (current_block, lexer.Location);
7133 ((Linq.AQueryClause)$1).Next = (Linq.AQueryClause)$4;
7140 | orderings_then_by COMMA
7142 current_block.SetEndLocation (lexer.Location);
7143 current_block = current_block.Parent;
7145 current_block = new Linq.QueryBlock ((Linq.QueryBlock) current_block, lexer.Location);
7149 ((Linq.AQueryClause)$1).Tail.Next = (Linq.AQueryClause)$4;
7157 $$ = new Linq.OrderByAscending ((Linq.QueryBlock) current_block, (Expression)$1);
7159 | expression ASCENDING
7161 $$ = new Linq.OrderByAscending ((Linq.QueryBlock) current_block, (Expression)$1);
7162 lbag.AddLocation ($$, GetLocation ($2));
7164 | expression DESCENDING
7166 $$ = new Linq.OrderByDescending ((Linq.QueryBlock) current_block, (Expression)$1);
7167 lbag.AddLocation ($$, GetLocation ($2));
7174 $$ = new Linq.ThenByAscending ((Linq.QueryBlock) current_block, (Expression)$1);
7176 | expression ASCENDING
7178 $$ = new Linq.ThenByAscending ((Linq.QueryBlock) current_block, (Expression)$1);
7179 lbag.AddLocation ($$, GetLocation ($2));
7181 | expression DESCENDING
7183 $$ = new Linq.ThenByDescending ((Linq.QueryBlock) current_block, (Expression)$1);
7184 lbag.AddLocation ($$, GetLocation ($2));
7189 opt_query_continuation
7191 | INTO identifier_inside_body
7193 // query continuation block is not linked with query block but with block
7194 // before. This means each query can use same range variable names for
7195 // different identifiers.
7197 current_block.SetEndLocation (GetLocation ($1));
7198 current_block = current_block.Parent;
7200 current_block = new Linq.QueryBlock (current_block, lexer.Location);
7202 if (linq_clause_blocks == null)
7203 linq_clause_blocks = new Stack<Linq.QueryBlock> ();
7205 linq_clause_blocks.Push ((Linq.QueryBlock) current_block);
7209 var current_block = linq_clause_blocks.Pop ();
7210 var lt = (LocatedToken) $2;
7211 var rv = new Linq.RangeVariable (lt.Value, lt.Location);
7212 $$ = new Linq.QueryStartClause ((Linq.QueryBlock)current_block, null, rv, GetLocation ($1)) {
7213 next = (Linq.AQueryClause)$4
7219 // Support for using the compiler as an interactive parser
7221 // The INTERACTIVE_PARSER token is first sent to parse our
7222 // productions; If the result is a Statement, the parsing
7223 // is repeated, this time with INTERACTIVE_PARSE_WITH_BLOCK
7224 // to setup the blocks in advance.
7226 // This setup is here so that in the future we can add
7227 // support for other constructs (type parsing, namespaces, etc)
7228 // that do not require a block to be setup in advance
7232 : EVAL_STATEMENT_PARSER EOF
7233 | EVAL_USING_DECLARATIONS_UNIT_PARSER using_directives opt_COMPLETE_COMPLETION
7234 | EVAL_STATEMENT_PARSER
7236 current_container = current_type = new Class (current_container, new MemberName ("<InteractiveExpressionClass>"), Modifiers.PUBLIC, null);
7238 // (ref object retval)
7239 Parameter [] mpar = new Parameter [1];
7240 mpar [0] = new Parameter (new TypeExpression (compiler.BuiltinTypes.Object, Location.Null), "$retval", Parameter.Modifier.REF, null, Location.Null);
7242 ParametersCompiled pars = new ParametersCompiled (mpar);
7243 var mods = Modifiers.PUBLIC | Modifiers.STATIC;
7244 if (settings.Unsafe)
7245 mods |= Modifiers.UNSAFE;
7247 current_local_parameters = pars;
7248 var method = new InteractiveMethod (
7250 new TypeExpression (compiler.BuiltinTypes.Void, Location.Null),
7254 current_type.AddMember (method);
7255 oob_stack.Push (method);
7257 interactive_async = false;
7259 ++lexer.parsing_block;
7260 start_block (lexer.Location);
7262 interactive_statement_list opt_COMPLETE_COMPLETION
7264 --lexer.parsing_block;
7265 var method = (InteractiveMethod) oob_stack.Pop ();
7266 method.Block = (ToplevelBlock) end_block(lexer.Location);
7268 if (interactive_async == true) {
7269 method.ChangeToAsync ();
7272 InteractiveResult = (Class) pop_current_class ();
7273 current_local_parameters = null;
7275 | EVAL_COMPILATION_UNIT_PARSER interactive_compilation_unit
7278 interactive_compilation_unit
7279 : opt_extern_alias_directives opt_using_directives
7280 | opt_extern_alias_directives opt_using_directives namespace_or_type_declarations
7283 opt_COMPLETE_COMPLETION
7285 | COMPLETE_COMPLETION
7288 close_brace_or_complete_completion
7290 | COMPLETE_COMPLETION
7294 // XML documentation code references micro parser
7296 documentation_parsing
7299 module.DocumentationBuilder.ParsedName = (MemberName) $2;
7304 : doc_type_declaration_name opt_doc_method_sig
7306 module.DocumentationBuilder.ParsedParameters = (List<DocumentationParameter>)$2;
7308 | builtin_types opt_doc_method_sig
7310 module.DocumentationBuilder.ParsedBuiltinType = (TypeExpression)$1;
7311 module.DocumentationBuilder.ParsedParameters = (List<DocumentationParameter>)$2;
7314 | VOID opt_doc_method_sig
7316 module.DocumentationBuilder.ParsedBuiltinType = new TypeExpression (compiler.BuiltinTypes.Void, GetLocation ($1));
7317 module.DocumentationBuilder.ParsedParameters = (List<DocumentationParameter>)$2;
7320 | builtin_types DOT IDENTIFIER opt_doc_method_sig
7322 module.DocumentationBuilder.ParsedBuiltinType = (TypeExpression)$1;
7323 module.DocumentationBuilder.ParsedParameters = (List<DocumentationParameter>)$4;
7324 var lt = (LocatedToken) $3;
7325 $$ = new MemberName (lt.Value);
7327 | doc_type_declaration_name DOT THIS
7329 $$ = new MemberName ((MemberName) $1, MemberCache.IndexerNameAlias, Location.Null);
7331 | doc_type_declaration_name DOT THIS OPEN_BRACKET
7333 valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out;
7335 opt_doc_parameters CLOSE_BRACKET
7337 module.DocumentationBuilder.ParsedParameters = (List<DocumentationParameter>)$6;
7338 $$ = new MemberName ((MemberName) $1, MemberCache.IndexerNameAlias, Location.Null);
7340 | EXPLICIT OPERATOR type opt_doc_method_sig
7342 var p = (List<DocumentationParameter>)$4 ?? new List<DocumentationParameter> (1);
7343 p.Add (new DocumentationParameter ((FullNamedExpression) $3));
7344 module.DocumentationBuilder.ParsedParameters = p;
7345 module.DocumentationBuilder.ParsedOperator = Operator.OpType.Explicit;
7348 | IMPLICIT OPERATOR type opt_doc_method_sig
7350 var p = (List<DocumentationParameter>)$4 ?? new List<DocumentationParameter> (1);
7351 p.Add (new DocumentationParameter ((FullNamedExpression) $3));
7352 module.DocumentationBuilder.ParsedParameters = p;
7353 module.DocumentationBuilder.ParsedOperator = Operator.OpType.Implicit;
7356 | OPERATOR overloadable_operator opt_doc_method_sig
7358 var p = (List<DocumentationParameter>)$3;
7359 module.DocumentationBuilder.ParsedParameters = p;
7360 module.DocumentationBuilder.ParsedOperator = (Operator.OpType) $2;
7365 doc_type_declaration_name
7366 : type_declaration_name
7367 | doc_type_declaration_name DOT type_declaration_name
7369 $$ = new MemberName (((MemberName) $1), (MemberName) $3);
7377 valid_param_mod = ParameterModifierType.Ref | ParameterModifierType.Out;
7379 opt_doc_parameters CLOSE_PARENS
7388 $$ = new List<DocumentationParameter> (0);
7396 var parameters = new List<DocumentationParameter> ();
7397 parameters.Add ((DocumentationParameter) $1);
7400 | doc_parameters COMMA doc_parameter
7402 var parameters = $1 as List<DocumentationParameter>;
7403 parameters.Add ((DocumentationParameter) $3);
7409 : opt_parameter_modifier parameter_type
7412 $$ = new DocumentationParameter ((Parameter.Modifier) $1, (FullNamedExpression) $2);
7414 $$ = new DocumentationParameter ((FullNamedExpression) $2);
7421 // A class used to hold info about an operator declarator
7423 class OperatorDeclaration {
7424 public readonly Operator.OpType optype;
7425 public readonly FullNamedExpression ret_type;
7426 public readonly Location location;
7428 public OperatorDeclaration (Operator.OpType op, FullNamedExpression ret_type, Location location)
7431 this.ret_type = ret_type;
7432 this.location = location;
7436 void Error_ExpectingTypeName (Expression expr)
7438 if (expr is Invocation){
7439 report.Error (1002, expr.Location, "Expecting `;'");
7441 expr.Error_InvalidExpressionStatement (report);
7445 void Error_ParameterModifierNotValid (string modifier, Location loc)
7447 report.Error (631, loc, "The parameter modifier `{0}' is not valid in this context",
7451 void Error_DuplicateParameterModifier (Location loc, Parameter.Modifier mod)
7453 report.Error (1107, loc, "Duplicate parameter modifier `{0}'",
7454 Parameter.GetModifierSignature (mod));
7457 void Error_TypeExpected (Location loc)
7459 report.Error (1031, loc, "Type expected");
7462 void Error_UnsafeCodeNotAllowed (Location loc)
7464 report.Error (227, loc, "Unsafe code requires the `unsafe' command line option to be specified");
7467 void Warning_EmptyStatement (Location loc)
7469 report.Warning (642, 3, loc, "Possible mistaken empty statement");
7472 void Error_NamedArgumentExpected (NamedArgument a)
7474 report.Error (1738, a.Location, "Named arguments must appear after the positional arguments");
7477 void Error_MissingInitializer (Location loc)
7479 report.Error (210, loc, "You must provide an initializer in a fixed or using statement declaration");
7482 object Error_AwaitAsIdentifier (object token)
7485 report.Error (4003, GetLocation (token), "`await' cannot be used as an identifier within an async method or lambda expression");
7486 return new LocatedToken ("await", GetLocation (token));
7492 void push_current_container (TypeDefinition tc, object partial_token)
7494 if (module.Evaluator != null){
7495 tc.Definition.Modifiers = tc.ModFlags = (tc.ModFlags & ~Modifiers.AccessibilityMask) | Modifiers.PUBLIC;
7499 undo.AddTypeContainer (current_container, tc);
7502 if (partial_token != null)
7503 current_container.AddPartial (tc);
7505 current_container.AddTypeContainer (tc);
7507 ++lexer.parsing_declaration;
7508 current_container = tc;
7512 TypeContainer pop_current_class ()
7514 var retval = current_container;
7516 current_container = current_container.Parent;
7517 current_type = current_type.Parent as TypeDefinition;
7522 [System.Diagnostics.Conditional ("FULL_AST")]
7523 void StoreModifierLocation (object token, Location loc)
7528 if (mod_locations == null)
7529 mod_locations = new List<Tuple<Modifiers, Location>> ();
7531 mod_locations.Add (Tuple.Create ((Modifiers) token, loc));
7534 [System.Diagnostics.Conditional ("FULL_AST")]
7535 void PushLocation (Location loc)
7537 if (location_stack == null)
7538 location_stack = new Stack<Location> ();
7540 location_stack.Push (loc);
7543 Location PopLocation ()
7545 if (location_stack == null)
7546 return Location.Null;
7548 return location_stack.Pop ();
7551 string CheckAttributeTarget (int token, string a, Location l)
7554 case "assembly" : case "module" : case "field" : case "method" : case "param" : case "property" : case "type" :
7558 if (!Tokenizer.IsValidIdentifier (a)) {
7559 Error_SyntaxError (token);
7561 report.Warning (658, 1, l,
7562 "`{0}' is invalid attribute target. All attributes in this attribute section will be ignored", a);
7565 return string.Empty;
7568 static bool IsUnaryOperator (Operator.OpType op)
7572 case Operator.OpType.LogicalNot:
7573 case Operator.OpType.OnesComplement:
7574 case Operator.OpType.Increment:
7575 case Operator.OpType.Decrement:
7576 case Operator.OpType.True:
7577 case Operator.OpType.False:
7578 case Operator.OpType.UnaryPlus:
7579 case Operator.OpType.UnaryNegation:
7585 void syntax_error (Location l, string msg)
7587 report.Error (1003, l, "Syntax error, " + msg);
7592 public Tokenizer Lexer {
7598 public CSharpParser (SeekableStreamReader reader, CompilationSourceFile file, ParserSession session)
7599 : this (reader, file, file.Compiler.Report, session)
7603 public CSharpParser (SeekableStreamReader reader, CompilationSourceFile file, Report report, ParserSession session)
7606 current_container = current_namespace = file;
7608 this.module = file.Module;
7609 this.compiler = file.Compiler;
7610 this.settings = compiler.Settings;
7611 this.report = report;
7613 lang_version = settings.Version;
7614 yacc_verbose_flag = settings.VerboseParserFlag;
7615 doc_support = settings.DocumentationFile != null;
7616 lexer = new Tokenizer (reader, file, session, report);
7617 oob_stack = new Stack<object> ();
7618 lbag = session.LocationsBag;
7619 use_global_stacks = session.UseJayGlobalArrays;
7620 parameters_bucket = session.ParametersStack;
7623 public void parse ()
7625 eof_token = Token.EOF;
7628 if (yacc_verbose_flag > 1)
7629 yyparse (lexer, new yydebug.yyDebugSimple ());
7633 Tokenizer tokenizer = lexer as Tokenizer;
7634 tokenizer.cleanup ();
7635 } catch (Exception e){
7636 if (e is yyParser.yyUnexpectedEof) {
7637 Error_SyntaxError (yyToken);
7638 UnexpectedEOF = true;
7642 if (e is yyParser.yyException) {
7643 if (report.Errors == 0)
7644 report.Error (-25, lexer.Location, "Parsing error");
7646 // Used by compiler-tester to test internal errors
7647 if (yacc_verbose_flag > 0 || e is FatalException)
7650 report.Error (589, lexer.Location, "Internal compiler error during parsing" + e);
7655 void CheckToken (int error, int yyToken, string msg, Location loc)
7657 if (yyToken >= Token.FIRST_KEYWORD && yyToken <= Token.LAST_KEYWORD)
7658 report.Error (error, loc, "{0}: `{1}' is a keyword", msg, GetTokenName (yyToken));
7660 report.Error (error, loc, msg);
7663 string ConsumeStoredComment ()
7665 string s = tmpComment;
7667 Lexer.doc_state = XmlCommentState.Allowed;
7671 void FeatureIsNotAvailable (Location loc, string feature)
7673 report.FeatureIsNotAvailable (compiler, loc, feature);
7676 Location GetLocation (object obj)
7678 var lt = obj as LocatedToken;
7682 var mn = obj as MemberName;
7686 var expr = obj as Expression;
7688 return expr.Location;
7690 return lexer.Location;
7693 void start_block (Location loc)
7695 if (current_block == null) {
7696 current_block = new ToplevelBlock (compiler, current_local_parameters, loc);
7697 parsing_anonymous_method = false;
7698 } else if (parsing_anonymous_method) {
7699 current_block = new ParametersBlock (current_block, current_local_parameters, loc);
7700 parsing_anonymous_method = false;
7702 current_block = new ExplicitBlock (current_block, loc, Location.Null);
7707 end_block (Location loc)
7709 Block retval = current_block.Explicit;
7710 retval.SetEndLocation (loc);
7711 current_block = retval.Parent;
7715 void start_anonymous (bool isLambda, ParametersCompiled parameters, bool isAsync, Location loc)
7717 oob_stack.Push (current_anonymous_method);
7718 oob_stack.Push (current_local_parameters);
7719 oob_stack.Push (current_variable);
7720 oob_stack.Push (async_block);
7722 current_local_parameters = parameters;
7724 if (lang_version <= LanguageVersion.ISO_2)
7725 FeatureIsNotAvailable (loc, "lambda expressions");
7727 current_anonymous_method = new LambdaExpression (loc);
7729 if (lang_version == LanguageVersion.ISO_1)
7730 FeatureIsNotAvailable (loc, "anonymous methods");
7732 current_anonymous_method = new AnonymousMethodExpression (loc);
7735 async_block = isAsync;
7736 // Force the next block to be created as a ToplevelBlock
7737 parsing_anonymous_method = true;
7741 * Completes the anonymous method processing, if lambda_expr is null, this
7742 * means that we have a Statement instead of an Expression embedded
7744 AnonymousMethodExpression end_anonymous (ParametersBlock anon_block)
7746 AnonymousMethodExpression retval;
7749 anon_block.IsAsync = true;
7751 current_anonymous_method.Block = anon_block;
7752 retval = current_anonymous_method;
7754 async_block = (bool) oob_stack.Pop ();
7755 current_variable = (BlockVariable) oob_stack.Pop ();
7756 current_local_parameters = (ParametersCompiled) oob_stack.Pop ();
7757 current_anonymous_method = (AnonymousMethodExpression) oob_stack.Pop ();
7762 void Error_SyntaxError (int token)
7764 Error_SyntaxError (0, token);
7767 void Error_SyntaxError (int error_code, int token)
7769 Error_SyntaxError (error_code, token, "Unexpected symbol");
7772 void Error_SyntaxError (int error_code, int token, string msg)
7774 Lexer.CompleteOnEOF = false;
7776 // An error message has been reported by tokenizer
7777 if (token == Token.ERROR)
7780 // Avoid duplicit error message after unterminated string literals
7781 if (token == Token.LITERAL && lexer.Location.Column == 0)
7784 string symbol = GetSymbolName (token);
7785 string expecting = GetExpecting ();
7786 var loc = lexer.Location - symbol.Length;
7788 if (error_code == 0) {
7789 if (expecting == "`identifier'") {
7790 if (token > Token.FIRST_KEYWORD && token < Token.LAST_KEYWORD) {
7791 report.Error (1041, loc, "Identifier expected, `{0}' is a keyword", symbol);
7796 expecting = "identifier";
7797 } else if (expecting == "`)'") {
7804 if (string.IsNullOrEmpty (expecting))
7805 report.Error (error_code, loc, "{1} `{0}'", symbol, msg);
7807 report.Error (error_code, loc, "{2} `{0}', expecting {1}", symbol, expecting, msg);
7810 string GetExpecting ()
7812 int [] tokens = yyExpectingTokens (yyExpectingState);
7813 var names = new List<string> (tokens.Length);
7814 bool has_type = false;
7815 bool has_identifier = false;
7816 for (int i = 0; i < tokens.Length; i++){
7817 int token = tokens [i];
7818 has_identifier |= token == Token.IDENTIFIER;
7820 string name = GetTokenName (token);
7821 if (name == "<internal>")
7824 has_type |= name == "type";
7825 if (names.Contains (name))
7832 // Too many tokens to enumerate
7834 if (names.Count > 8)
7837 if (has_type && has_identifier)
7838 names.Remove ("identifier");
7840 if (names.Count == 1)
7841 return "`" + GetTokenName (tokens [0]) + "'";
7843 StringBuilder sb = new StringBuilder ();
7845 int count = names.Count;
7846 for (int i = 0; i < count; i++){
7847 bool last = i + 1 == count;
7851 sb.Append (names [i]);
7852 sb.Append (last ? "'" : count < 3 ? "' " : "', ");
7854 return sb.ToString ();
7858 string GetSymbolName (int token)
7862 return ((Constant)lexer.Value).GetValue ().ToString ();
7863 case Token.IDENTIFIER:
7864 return ((LocatedToken)lexer.Value).Value;
7906 case Token.BITWISE_AND:
7908 case Token.BITWISE_OR:
7922 case Token.OP_SHIFT_LEFT:
7924 case Token.OP_SHIFT_RIGHT:
7944 case Token.OP_COALESCING:
7946 case Token.OP_MULT_ASSIGN:
7948 case Token.OP_DIV_ASSIGN:
7950 case Token.OP_MOD_ASSIGN:
7952 case Token.OP_ADD_ASSIGN:
7954 case Token.OP_SUB_ASSIGN:
7956 case Token.OP_SHIFT_LEFT_ASSIGN:
7958 case Token.OP_SHIFT_RIGHT_ASSIGN:
7960 case Token.OP_AND_ASSIGN:
7962 case Token.OP_XOR_ASSIGN:
7964 case Token.OP_OR_ASSIGN:
7968 return GetTokenName (token);
7971 static string GetTokenName (int token)
7974 case Token.ABSTRACT:
7996 case Token.CONTINUE:
8000 case Token.DELEGATE:
8010 case Token.EXPLICIT:
8013 case Token.EXTERN_ALIAS:
8029 case Token.IMPLICIT:
8033 case Token.INTERFACE:
8035 case Token.INTERNAL:
8041 case Token.NAMESPACE:
8047 case Token.OPERATOR:
8051 case Token.OVERRIDE:
8057 case Token.PROTECTED:
8061 case Token.READONLY:
8073 case Token.STACKALLOC:
8074 return "stackalloc";
8091 case Token.UNCHECKED:
8099 case Token.VOLATILE:
8107 case Token.REFVALUE:
8108 return "__refvalue";
8118 case Token.FROM_FIRST:
8136 case Token.ASCENDING:
8138 case Token.DESCENDING:
8139 return "descending";
8146 case Token.OPEN_BRACE:
8148 case Token.CLOSE_BRACE:
8150 case Token.OPEN_BRACKET:
8151 case Token.OPEN_BRACKET_EXPR:
8153 case Token.CLOSE_BRACKET:
8155 case Token.OPEN_PARENS_CAST:
8156 case Token.OPEN_PARENS_LAMBDA:
8157 case Token.OPEN_PARENS:
8159 case Token.CLOSE_PARENS:
8165 case Token.DEFAULT_COLON:
8169 case Token.SEMICOLON:
8175 case Token.INTERPOLATED_STRING_END:
8177 case Token.INTERPOLATED_STRING:
8186 case Token.BITWISE_AND:
8187 case Token.BITWISE_OR:
8194 case Token.OP_SHIFT_LEFT:
8195 case Token.OP_SHIFT_RIGHT:
8203 case Token.OP_COALESCING:
8204 case Token.OP_MULT_ASSIGN:
8205 case Token.OP_DIV_ASSIGN:
8206 case Token.OP_MOD_ASSIGN:
8207 case Token.OP_ADD_ASSIGN:
8208 case Token.OP_SUB_ASSIGN:
8209 case Token.OP_SHIFT_LEFT_ASSIGN:
8210 case Token.OP_SHIFT_RIGHT_ASSIGN:
8211 case Token.OP_AND_ASSIGN:
8212 case Token.OP_XOR_ASSIGN:
8213 case Token.OP_OR_ASSIGN:
8214 case Token.INTERR_OPERATOR:
8215 return "<operator>";
8237 case Token.OP_GENERICS_LT:
8238 case Token.GENERIC_DIMENSION:
8240 case Token.OP_GENERICS_GT:
8243 case Token.INTERR_NULLABLE:
8245 case Token.DOUBLE_COLON:
8249 case Token.IDENTIFIER:
8251 return "identifier";
8254 return "end-of-file";
8256 // All of these are internal.
8259 case Token.FIRST_KEYWORD:
8260 case Token.EVAL_COMPILATION_UNIT_PARSER:
8261 case Token.EVAL_USING_DECLARATIONS_UNIT_PARSER:
8262 case Token.EVAL_STATEMENT_PARSER:
8263 case Token.LAST_KEYWORD:
8264 case Token.GENERATE_COMPLETION:
8265 case Token.COMPLETE_COMPLETION:
8266 return "<internal>";
8268 // A bit more robust.
8270 return yyNames [token];