[mono-api-html] Print string fields with no (or null) value without an NRE.
[mono.git] / mcs / mcs / cs-parser.jay
index c65a7ae5e72bc2515cfe0459246444d69c82e381..97cfaaca0e8b225f0171d73bc31ad0d183b6a7f6 100644 (file)
@@ -35,7 +35,8 @@ namespace Mono.CSharp
                        Arglist = 1 << 5,
                        DefaultValue = 1 << 6,
                        
-                       All = Ref | Out | This | Params | Arglist | DefaultValue
+                       All = Ref | Out | This | Params | Arglist | DefaultValue,
+                       PrimaryConstructor = Ref | Out | Params | DefaultValue
                }
                
                static readonly object ModifierNone = 0;
@@ -54,7 +55,7 @@ namespace Mono.CSharp
                /// </summary>
                Block      current_block;
                
-               BlockVariableDeclaration current_variable;
+               BlockVariable current_variable;
 
                Delegate   current_delegate;
                
@@ -116,6 +117,8 @@ namespace Mono.CSharp
                // Keeps track of global data changes to undo on parser error
                //
                public Undo undo;
+
+               bool? interactive_async;
                
                Stack<Linq.QueryBlock> linq_clause_blocks;
 
@@ -139,6 +142,7 @@ namespace Mono.CSharp
                //
                LocationsBag lbag;
                List<Tuple<Modifiers, Location>> mod_locations;
+               Stack<Location> location_stack;
 %}
 
 %token EOF
@@ -416,7 +420,7 @@ extern_alias_directives
 extern_alias_directive
        : EXTERN_ALIAS IDENTIFIER IDENTIFIER SEMICOLON
          {
-               var lt = (Tokenizer.LocatedToken) $2;
+               var lt = (LocatedToken) $2;
                string s = lt.Value;
                if (s != "alias") {
                        syntax_error (lt.Location, "`alias' expected");
@@ -424,7 +428,7 @@ extern_alias_directive
                        if (lang_version == LanguageVersion.ISO_1)
                                FeatureIsNotAvailable (lt.Location, "external alias");
 
-                       lt = (Tokenizer.LocatedToken) $3;
+                       lt = (LocatedToken) $3;
                        if (lt.Value == QualifiedAliasMember.GlobalAlias) {
                                RootNamespace.Error_GlobalNamespaceRedefined (report, lt.Location);
                        }
@@ -464,7 +468,7 @@ using_namespace
          }
        | USING IDENTIFIER ASSIGN namespace_or_type_expr SEMICOLON
          {
-               var lt = (Tokenizer.LocatedToken) $2;
+               var lt = (LocatedToken) $2;
                if (lang_version != LanguageVersion.ISO_1 && lt.Value == "global") {
                        report.Warning (440, 2, lt.Location,
                         "An alias named `global' will not be used when resolving `global::'. The global namespace will be used instead");
@@ -554,13 +558,14 @@ opt_semicolon_error
 namespace_name
        : IDENTIFIER
          {
-               var lt = (Tokenizer.LocatedToken) $1;
+               var lt = (LocatedToken) $1;
                $$ = new MemberName (lt.Value, lt.Location);
          }
        | namespace_name DOT IDENTIFIER
          {
-               var lt = (Tokenizer.LocatedToken) $3;
+               var lt = (LocatedToken) $3;
                $$ = new MemberName ((MemberName) $1, lt.Value, lt.Location);           
+               lbag.AddLocation ($$, GetLocation ($2));
          }
        | error
          {
@@ -666,7 +671,7 @@ attribute_sections
                var sect = (List<Attribute>) $2;
                if (attrs == null)
                        attrs = new Attributes (sect);
-               else
+               else if (sect != null)
                        attrs.AddAttributes (sect);
                $$ = attrs;
          }
@@ -675,6 +680,7 @@ attribute_sections
 attribute_section
        : OPEN_BRACKET
          {
+               PushLocation (GetLocation ($1));
                lexer.parsing_attribute_section = true;
          }
          attribute_section_cont
@@ -700,18 +706,32 @@ attribute_section_cont
                else
                        $$ = $4;
 
+               lbag.InsertLocation ($$, 0, PopLocation ());
+               if ($5 != null) {
+                       lbag.AddLocation ($$, GetLocation ($2), GetLocation ($5), GetLocation ($6));
+               } else {
+                       lbag.AddLocation ($$, GetLocation ($2), GetLocation ($6));
+               }
+
                current_attr_target = null;
                lexer.parsing_attribute_section = false;
          }
        | attribute_list opt_comma CLOSE_BRACKET
          {
                $$ = $1;
+
+               lbag.InsertLocation ($$, 0, PopLocation ());
+               if ($2 != null) {
+                       lbag.AddLocation ($$, GetLocation($2), GetLocation ($3));
+               } else {
+                       lbag.AddLocation ($$, GetLocation($3));
+               }
          }
        | IDENTIFIER error
          {
                Error_SyntaxError (yyToken);
 
-               var lt = (Tokenizer.LocatedToken) $1;
+               var lt = (LocatedToken) $1;
                var tne = new SimpleName (lt.Value, null, lt.Location);
 
                $$ = new List<Attribute> () {
@@ -720,7 +740,7 @@ attribute_section_cont
          }
        | error
          {
-               $$ = CheckAttributeTarget (GetTokenName (yyToken), GetLocation ($1)); 
+               CheckAttributeTarget (yyToken, GetTokenName (yyToken), GetLocation ($1)); 
                $$ = null;
          }
        ;       
@@ -728,8 +748,8 @@ attribute_section_cont
 attribute_target
        : IDENTIFIER
          {
-               var lt = (Tokenizer.LocatedToken) $1;
-               $$ = CheckAttributeTarget (lt.Value, lt.Location);
+               var lt = (LocatedToken) $1;
+               $$ = CheckAttributeTarget (yyToken, lt.Value, lt.Location);
          }
        | EVENT  { $$ = "event"; }
        | RETURN { $$ = "return"; }
@@ -743,7 +763,10 @@ attribute_list
        | attribute_list COMMA attribute
          {
                var attrs = (List<Attribute>) $1;
-               attrs.Add ((Attribute) $3);
+               if (attrs != null) {
+                       attrs.Add ((Attribute) $3);
+                       lbag.AppendTo (attrs, GetLocation ($2));
+               }
 
                $$ = attrs;
          }
@@ -840,14 +863,14 @@ named_attribute_argument
          expression
          {
                --lexer.parsing_block;
-               var lt = (Tokenizer.LocatedToken) $1;
+               var lt = (LocatedToken) $1;
                $$ = new NamedArgument (lt.Value, lt.Location, (Expression) $4);          
                lbag.AddLocation ($$, GetLocation($2));
          }
        ;
        
 named_argument
-       : identifier_inside_body COLON opt_named_modifier expression
+       : identifier_inside_body COLON opt_named_modifier expression_or_error
          {
                if (lang_version <= LanguageVersion.V_3)
                        FeatureIsNotAvailable (GetLocation ($1), "named argument");
@@ -855,7 +878,7 @@ named_argument
                // Avoid boxing in common case (no modifier)
                var arg_mod = $3 == null ? Argument.AType.None : (Argument.AType) $3;
                        
-               var lt = (Tokenizer.LocatedToken) $1;
+               var lt = (LocatedToken) $1;
                $$ = new NamedArgument (lt.Value, lt.Location, (Expression) $4, arg_mod);
                lbag.AddLocation ($$, GetLocation($2));
          }
@@ -882,10 +905,12 @@ class_member_declarations
        : class_member_declaration
          {
                lexer.parsing_modifiers = true;
+               lexer.parsing_block = 0;
          }
        | class_member_declarations class_member_declaration
          {
                lexer.parsing_modifiers = true;
+               lexer.parsing_block = 0;
          }
        ;
        
@@ -921,15 +946,21 @@ struct_declaration
          type_declaration_name
          { 
                lexer.ConstraintsParsing = true;
+               valid_param_mod = ParameterModifierType.PrimaryConstructor;
                push_current_container (new Struct (current_container, (MemberName) $6, (Modifiers) $2, (Attributes) $1), $3);
          }
+         opt_primary_parameters
          opt_class_base
          opt_type_parameter_constraints_clauses
          {
+               valid_param_mod = 0;
                lexer.ConstraintsParsing = false;
 
-               if ($9 != null)
-                       current_container.SetConstraints ((List<Constraints>) $9);
+               if ($8 != null)
+                       current_type.PrimaryConstructorParameters = (ParametersCompiled) $8;
+
+               if ($10 != null)
+                       current_container.SetConstraints ((List<Constraints>) $10);
 
                if (doc_support)
                        current_container.PartialContainer.DocComment = Lexer.consume_doc_comment ();
@@ -951,7 +982,11 @@ struct_declaration
          }
          opt_semicolon
          {
-               lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($14), GetLocation ($16));
+               if ($16 == null) {
+                       lbag.AppendToMember (current_container, GetLocation ($12), GetLocation ($15));
+               } else {
+                       lbag.AppendToMember (current_container, GetLocation ($12), GetLocation ($15), GetLocation ($17));
+               }
                $$ = pop_current_class ();
          }
        | opt_attributes opt_modifiers opt_partial STRUCT error
@@ -965,7 +1000,7 @@ constant_declaration
          opt_modifiers
          CONST type IDENTIFIER
          {
-               var lt = (Tokenizer.LocatedToken) $5;
+               var lt = (LocatedToken) $5;
                var mod = (Modifiers) $2;
                current_field = new Const (current_type, (FullNamedExpression) $4, mod, new MemberName (lt.Value, lt.Location), (Attributes) $1);
                current_type.AddMember (current_field);
@@ -1016,7 +1051,7 @@ constant_declarators
 constant_declarator
        : COMMA IDENTIFIER constant_initializer
          {
-               var lt = (Tokenizer.LocatedToken) $2;
+               var lt = (LocatedToken) $2;
                $$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), (ConstInitializer) $3);
                lbag.AddLocation ($$, GetLocation ($1));
          }
@@ -1055,7 +1090,7 @@ field_declaration
                if (type.Type != null && type.Type.Kind == MemberKind.Void)
                        report.Error (670, GetLocation ($3), "Fields cannot have void type");
                        
-               var lt = (Tokenizer.LocatedToken) $4;
+               var lt = (LocatedToken) $4;
                current_field = new Field (current_type, type, (Modifiers) $2, new MemberName (lt.Value, lt.Location), (Attributes) $1);
                current_type.AddField (current_field);
                $$ = current_field;
@@ -1080,7 +1115,7 @@ field_declaration
                if (lang_version < LanguageVersion.ISO_2)
                        FeatureIsNotAvailable (GetLocation ($3), "fixed size buffers");
 
-               var lt = (Tokenizer.LocatedToken) $5;
+               var lt = (LocatedToken) $5;
                current_field = new FixedField (current_type, (FullNamedExpression) $4, (Modifiers) $2,
                        new MemberName (lt.Value, lt.Location), (Attributes) $1);
                        
@@ -1119,6 +1154,7 @@ opt_field_initializer
          {
                --lexer.parsing_block;
                current_field.Initializer = (Expression) $3;
+               lbag.AppendToMember (current_field, GetLocation ($1));
                end_block (lexer.Location);
                current_local_parameters = null;
          }
@@ -1143,7 +1179,7 @@ field_declarators
 field_declarator
        : COMMA IDENTIFIER
          {
-               var lt = (Tokenizer.LocatedToken) $2;
+               var lt = (LocatedToken) $2;
                $$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), null);
                lbag.AddLocation ($$, GetLocation ($1));
          }
@@ -1154,7 +1190,7 @@ field_declarator
          variable_initializer
          {
                --lexer.parsing_block;
-               var lt = (Tokenizer.LocatedToken) $2;     
+               var lt = (LocatedToken) $2;       
                $$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), (Expression) $5);
                lbag.AddLocation ($$, GetLocation ($1), GetLocation ($3));
          }
@@ -1179,7 +1215,7 @@ fixed_field_declarators
 fixed_field_declarator
        : COMMA IDENTIFIER fixed_field_size
          {
-               var lt = (Tokenizer.LocatedToken) $2;     
+               var lt = (LocatedToken) $2;       
                $$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), (ConstInitializer) $3);
                lbag.AddLocation ($$, GetLocation ($1));
          }
@@ -1323,8 +1359,10 @@ method_header
 
                current_type.AddMember (method);
 
-               if ($11 != null)
-                       method.SetConstraints ((List<Constraints>) $11);
+               async_block = (method.ModFlags & Modifiers.ASYNC) != 0;
+
+               if ($12 != null)
+                       method.SetConstraints ((List<Constraints>) $12);
 
                if (doc_support)
                        method.DocComment = Lexer.consume_doc_comment ();
@@ -1487,7 +1525,7 @@ fixed_parameter
          parameter_type
          identifier_inside_body
          {
-               var lt = (Tokenizer.LocatedToken) $4;
+               var lt = (LocatedToken) $4;
                $$ = new Parameter ((FullNamedExpression) $3, lt.Value, (Parameter.Modifier) $2, (Attributes) $1, lt.Location);
          }
        | opt_attributes
@@ -1495,7 +1533,7 @@ fixed_parameter
          parameter_type
          identifier_inside_body OPEN_BRACKET CLOSE_BRACKET
          {
-               var lt = (Tokenizer.LocatedToken) $4;
+               var lt = (LocatedToken) $4;
                report.Error (1552, lt.Location, "Array type specifier, [], must appear before parameter name");
                $$ = new Parameter ((FullNamedExpression) $3, lt.Value, (Parameter.Modifier) $2, (Attributes) $1, lt.Location);
          }
@@ -1552,7 +1590,7 @@ fixed_parameter
                if ((valid_param_mod & ParameterModifierType.DefaultValue) == 0)
                        report.Error (1065, GetLocation ($5), "Optional parameter is not valid in this context");
                
-               var lt = (Tokenizer.LocatedToken) $4;
+               var lt = (LocatedToken) $4;
                $$ = new Parameter ((FullNamedExpression) $3, lt.Value, mod, (Attributes) $1, lt.Location);
                lbag.AddLocation ($$, GetLocation ($5));
                
@@ -1624,14 +1662,14 @@ parameter_modifier
 parameter_array
        : opt_attributes params_modifier type IDENTIFIER
          {
-               var lt = (Tokenizer.LocatedToken) $4;
+               var lt = (LocatedToken) $4;
                $$ = new ParamsParameter ((FullNamedExpression) $3, lt.Value, (Attributes) $1, lt.Location);
          }
        | opt_attributes params_modifier type IDENTIFIER ASSIGN constant_expression
          {
                report.Error (1751, GetLocation ($2), "Cannot specify a default value for a parameter array");
                
-               var lt = (Tokenizer.LocatedToken) $4;
+               var lt = (LocatedToken) $4;
                $$ = new ParamsParameter ((FullNamedExpression) $3, lt.Value, (Attributes) $1, lt.Location);            
          }
        | opt_attributes params_modifier type error
@@ -1917,7 +1955,11 @@ interface_declaration
          }
          opt_semicolon 
          {
-           lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($13));
+               if ($15 == null) {
+                       lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($13));
+               } else {
+                       lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($13), GetLocation ($15));
+               }
                $$ = pop_current_class ();
          }
        | opt_attributes opt_modifiers opt_partial INTERFACE error
@@ -1935,10 +1977,12 @@ interface_member_declarations
        : interface_member_declaration
          {
                lexer.parsing_modifiers = true;
+               lexer.parsing_block = 0;
          }
        | interface_member_declarations interface_member_declaration
          {
                lexer.parsing_modifiers = true;
+               lexer.parsing_block = 0;
          }
        ;
 
@@ -2043,11 +2087,11 @@ operator_declarator
                                        Operator.GetName (op));
                        }
                } else {
-                       if (p_count > 2) {
+                       if (p_count == 1) {
+                               report.Error (1019, loc, "Overloadable unary operator expected");
+                       } else if (p_count != 2) {
                                report.Error (1534, loc, "Overloaded binary operator `{0}' takes two parameters",
                                        Operator.GetName (op));
-                       } else if (p_count != 2) {
-                               report.Error (1019, loc, "Overloadable unary operator expected");
                        }
                }
                
@@ -2184,7 +2228,7 @@ constructor_declarator
                valid_param_mod = 0;
                current_local_parameters = (ParametersCompiled) $6;
                
-               var lt = (Tokenizer.LocatedToken) $3;
+               var lt = (LocatedToken) $3;
                var mods = (Modifiers) $2;
                var c = new Constructor (current_type, lt.Value, mods, (Attributes) $1, current_local_parameters, lt.Location);
 
@@ -2281,7 +2325,7 @@ destructor_declaration
          }
          IDENTIFIER OPEN_PARENS CLOSE_PARENS method_body
          {
-               var lt = (Tokenizer.LocatedToken) $5;
+               var lt = (LocatedToken) $5;
                if (lt.Value != current_container.MemberName.Name){
                        report.Error (574, lt.Location, "Name of destructor must match name of class");
                } else if (current_container.Kind != MemberKind.Class){
@@ -2399,7 +2443,7 @@ event_declarators
 event_declarator
        : COMMA IDENTIFIER
          {
-               var lt = (Tokenizer.LocatedToken) $2;
+               var lt = (LocatedToken) $2;
                $$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), null);
                lbag.AddLocation ($$, GetLocation ($1));
          }
@@ -2410,7 +2454,7 @@ event_declarator
          event_variable_initializer
          {
                --lexer.parsing_block;
-               var lt = (Tokenizer.LocatedToken) $2;     
+               var lt = (LocatedToken) $2;       
                $$ = new FieldDeclarator (new SimpleMemberName (lt.Value, lt.Location), (Expression) $5);
                lbag.AddLocation ($$, GetLocation ($1), GetLocation ($3));
          }
@@ -2568,6 +2612,8 @@ enum_declaration
          }
          opt_enum_member_declarations
          {
+               lexer.parsing_modifiers = true;
+         
                // here will be evaluated after CLOSE_BLACE is consumed.
                if (doc_support)
                        Lexer.doc_state = XmlCommentState.Allowed;
@@ -2625,7 +2671,7 @@ enum_member_declarations
 enum_member_declaration
        : opt_attributes IDENTIFIER
          {
-               var lt = (Tokenizer.LocatedToken) $2;
+               var lt = (LocatedToken) $2;
                var em = new EnumMember ((Enum) current_type, new MemberName (lt.Value, lt.Location), (Attributes) $1);
                ((Enum) current_type).AddEnumMember (em);
 
@@ -2648,7 +2694,7 @@ enum_member_declaration
          { 
                --lexer.parsing_block;
                
-               var lt = (Tokenizer.LocatedToken) $2;
+               var lt = (LocatedToken) $2;
                var em = new EnumMember ((Enum) current_type, new MemberName (lt.Value, lt.Location), (Attributes) $1);
                em.Initializer = new ConstInitializer (em, (Expression) $5, GetLocation ($4));
                ((Enum) current_type).AddEnumMember (em);
@@ -2662,7 +2708,7 @@ enum_member_declaration
          {
                Error_SyntaxError (yyToken);
          
-               var lt = (Tokenizer.LocatedToken) $2;
+               var lt = (LocatedToken) $2;
                var em = new EnumMember ((Enum) current_type, new MemberName (lt.Value, lt.Location), (Attributes) $1);
                ((Enum) current_type).AddEnumMember (em);
 
@@ -2736,8 +2782,8 @@ namespace_or_type_expr
        : member_name
        | qualified_alias_member IDENTIFIER opt_type_argument_list
          {
-               var lt1 = (Tokenizer.LocatedToken) $1;
-               var lt2 = (Tokenizer.LocatedToken) $2;
+               var lt1 = (LocatedToken) $1;
+               var lt2 = (LocatedToken) $2;
                
                $$ = new QualifiedAliasMember (lt1.Value, lt2.Value, (TypeArguments) $3, lt1.Location);
                lbag.AddLocation ($$, GetLocation ($2));
@@ -2748,7 +2794,7 @@ member_name
        : simple_name_expr
        | namespace_or_type_expr DOT IDENTIFIER opt_type_argument_list
          {
-               var lt = (Tokenizer.LocatedToken) $3;
+               var lt = (LocatedToken) $3;
                $$ = new MemberAccess ((Expression) $1, lt.Value, (TypeArguments) $4, lt.Location);
                lbag.AddLocation ($$, GetLocation ($2));
          }
@@ -2757,7 +2803,7 @@ member_name
 simple_name_expr
        : IDENTIFIER opt_type_argument_list
          {
-               var lt = (Tokenizer.LocatedToken) $1;
+               var lt = (LocatedToken) $1;
                $$ = new SimpleName (lt.Value, (TypeArguments)$2, lt.Location);
          }
        ;
@@ -2807,7 +2853,7 @@ type_declaration_name
          opt_type_parameter_list
          {
                lexer.parsing_generic_declaration = false;
-               var lt = (Tokenizer.LocatedToken) $1;
+               var lt = (LocatedToken) $1;
                $$ = new MemberName (lt.Value, (TypeParameters)$3, lt.Location);
          }
        ;
@@ -2827,7 +2873,7 @@ method_declaration_name
        | explicit_interface IDENTIFIER opt_type_parameter_list
          {
                lexer.parsing_generic_declaration = false;        
-               var lt = (Tokenizer.LocatedToken) $2;
+               var lt = (LocatedToken) $2;
                $$ = new MemberName (lt.Value, (TypeParameters) $3, (ATypeNameExpression) $1, lt.Location);
          }
        ;
@@ -2848,21 +2894,21 @@ indexer_declaration_name
 explicit_interface
        : IDENTIFIER opt_type_argument_list DOT
          {
-               var lt = (Tokenizer.LocatedToken) $1;
+               var lt = (LocatedToken) $1;
                $$ = new SimpleName (lt.Value, (TypeArguments) $2, lt.Location);
                lbag.AddLocation ($$, GetLocation ($3));
          }
        | qualified_alias_member IDENTIFIER opt_type_argument_list DOT
          {
-               var lt1 = (Tokenizer.LocatedToken) $1;
-               var lt2 = (Tokenizer.LocatedToken) $2;
+               var lt1 = (LocatedToken) $1;
+               var lt2 = (LocatedToken) $2;
 
                $$ = new QualifiedAliasMember (lt1.Value, lt2.Value, (TypeArguments) $3, lt1.Location);
                lbag.AddLocation ($$, GetLocation ($4));
          }
        | explicit_interface IDENTIFIER opt_type_argument_list DOT
          {
-               var lt = (Tokenizer.LocatedToken) $2;
+               var lt = (LocatedToken) $2;
                $$ = new MemberAccess ((ATypeNameExpression) $1, lt.Value, (TypeArguments) $3, lt.Location);
                lbag.AddLocation ($$, GetLocation ($4));
          }
@@ -2899,8 +2945,8 @@ type_parameters
 type_parameter
        : opt_attributes opt_type_parameter_variance IDENTIFIER
          {
-               var lt = (Tokenizer.LocatedToken)$3;
-               $$ = new TypeParameter (new MemberName (lt.Value, lt.Location), (Attributes)$1, (Variance) $2);
+               var lt = (LocatedToken)$3;
+               $$ = new TypeParameter (new MemberName (lt.Value, lt.Location), (Attributes)$1, (VarianceDecl) $2);
          }
        | error
          {
@@ -2909,7 +2955,7 @@ type_parameter
                else
                        Error_SyntaxError (yyToken);
                        
-               $$ = new TypeParameter (MemberName.Null, null, Variance.None);
+               $$ = new TypeParameter (MemberName.Null, null, null);
          }
        ;
 
@@ -3083,11 +3129,11 @@ primary_expression
 primary_expression_or_type
        : IDENTIFIER opt_type_argument_list
          {
-               var lt = (Tokenizer.LocatedToken) $1;
+               var lt = (LocatedToken) $1;
                $$ = new SimpleName (lt.Value, (TypeArguments)$2, lt.Location);   
          }
        | IDENTIFIER GENERATE_COMPLETION {
-               var lt = (Tokenizer.LocatedToken) $1;
+               var lt = (LocatedToken) $1;
               $$ = new CompletionSimpleName (MemberName.MakeName (lt.Value, null), lt.Location);
          }
        | member_access
@@ -3140,26 +3186,32 @@ parenthesized_expression
 member_access
        : primary_expression DOT identifier_inside_body opt_type_argument_list
          {
-               var lt = (Tokenizer.LocatedToken) $3;
+               var lt = (LocatedToken) $3;
                $$ = new MemberAccess ((Expression) $1, lt.Value, (TypeArguments) $4, lt.Location);
                lbag.AddLocation ($$, GetLocation ($2));
          }
        | builtin_types DOT identifier_inside_body opt_type_argument_list
          {
-               var lt = (Tokenizer.LocatedToken) $3;
+               var lt = (LocatedToken) $3;
                $$ = new MemberAccess ((Expression) $1, lt.Value, (TypeArguments) $4, lt.Location);
                lbag.AddLocation ($$, GetLocation ($2));
          }
        | BASE DOT identifier_inside_body opt_type_argument_list
          {
-               var lt = (Tokenizer.LocatedToken) $3;
+               var lt = (LocatedToken) $3;
                $$ = new MemberAccess (new BaseThis (GetLocation ($1)), lt.Value, (TypeArguments) $4, lt.Location);
                lbag.AddLocation ($$, GetLocation ($2));
          }
+       | AWAIT DOT identifier_inside_body opt_type_argument_list
+         {
+               var lt = (LocatedToken) $3;
+               $$ = new MemberAccess (new SimpleName ("await", ((LocatedToken) $1).Location), lt.Value, (TypeArguments) $4, lt.Location);
+               lbag.AddLocation ($$, GetLocation ($2));
+         }
        | qualified_alias_member identifier_inside_body opt_type_argument_list
          {
-               var lt1 = (Tokenizer.LocatedToken) $1;
-               var lt2 = (Tokenizer.LocatedToken) $2;
+               var lt1 = (LocatedToken) $1;
+               var lt2 = (LocatedToken) $2;
 
                $$ = new QualifiedAliasMember (lt1.Value, lt2.Value, (TypeArguments) $3, lt1.Location);
                lbag.AddLocation ($$, GetLocation ($2));
@@ -3168,7 +3220,7 @@ member_access
                $$ = new CompletionMemberAccess ((Expression) $1, null,GetLocation ($3));
          }
        | primary_expression DOT IDENTIFIER GENERATE_COMPLETION {
-               var lt = (Tokenizer.LocatedToken) $3;
+               var lt = (LocatedToken) $3;
                $$ = new CompletionMemberAccess ((Expression) $1, lt.Value, lt.Location);
          }
        | builtin_types DOT GENERATE_COMPLETION
@@ -3176,7 +3228,7 @@ member_access
                $$ = new CompletionMemberAccess ((Expression) $1, null, lexer.Location);
          }
        | builtin_types DOT IDENTIFIER GENERATE_COMPLETION {
-               var lt = (Tokenizer.LocatedToken) $3;
+               var lt = (LocatedToken) $3;
                $$ = new CompletionMemberAccess ((Expression) $1, lt.Value, lt.Location);
          }
        ;
@@ -3255,13 +3307,13 @@ member_initializer_list
 member_initializer
        : IDENTIFIER ASSIGN initializer_value
          {
-               var lt = (Tokenizer.LocatedToken) $1;
+               var lt = (LocatedToken) $1;
                $$ = new ElementInitializer (lt.Value, (Expression)$3, lt.Location);
                lbag.AddLocation ($$, GetLocation ($2));
          }
        | AWAIT ASSIGN initializer_value
          {
-               var lt = (Tokenizer.LocatedToken) Error_AwaitAsIdentifier ($1);
+               var lt = (LocatedToken) Error_AwaitAsIdentifier ($1);
                $$ = new ElementInitializer (lt.Value, (Expression)$3, lt.Location);
                lbag.AddLocation ($$, GetLocation ($2));
          }
@@ -3279,15 +3331,18 @@ member_initializer
        | OPEN_BRACE expression_list CLOSE_BRACE
          {
                if ($2 == null)
-                       $$ = null;
+                       $$ = new CollectionElementInitializer (GetLocation ($1));
                else
                        $$ = new CollectionElementInitializer ((List<Expression>)$2, GetLocation ($1));
+
+               lbag.AddLocation ($$, GetLocation ($2));
          }
        | OPEN_BRACE CLOSE_BRACE
          {
                report.Error (1920, GetLocation ($1), "An element initializer cannot be empty");
-               $$ = null;
-         }       
+               $$ = new CollectionElementInitializer (GetLocation ($1));
+               lbag.AddLocation ($$, GetLocation ($2));
+         }
        ;
 
 initializer_value
@@ -3403,22 +3458,18 @@ element_access
        ;
 
 expression_list
-       : expression
+       : expression_or_error
          {
                var list = new List<Expression> (4);
                list.Add ((Expression) $1);
                $$ = list;
          }
-       | expression_list COMMA expression
+       | expression_list COMMA expression_or_error
          {
                var list = (List<Expression>) $1;
                list.Add ((Expression) $3);
                $$ = list;
          }
-       | expression_list error {
-               Error_SyntaxError (yyToken);
-               $$ = $1;
-         }
        ;
        
 expression_list_arguments
@@ -3594,13 +3645,13 @@ anonymous_type_parameters
 anonymous_type_parameter
        : identifier_inside_body ASSIGN variable_initializer
          {
-               var lt = (Tokenizer.LocatedToken)$1;
+               var lt = (LocatedToken)$1;
                $$ = new AnonymousTypeParameter ((Expression)$3, lt.Value, lt.Location);
                lbag.AddLocation ($$, GetLocation ($2));
          }
        | identifier_inside_body
          {
-               var lt = (Tokenizer.LocatedToken)$1;
+               var lt = (LocatedToken)$1;
                $$ = new AnonymousTypeParameter (new SimpleName (lt.Value, lt.Location),
                        lt.Value, lt.Location);
          }
@@ -3728,27 +3779,27 @@ typeof_type_expression
 unbound_type_name
        : identifier_inside_body generic_dimension
          {  
-               var lt = (Tokenizer.LocatedToken) $1;
+               var lt = (LocatedToken) $1;
 
                $$ = new SimpleName (lt.Value, (int) $2, lt.Location);
          }
        | qualified_alias_member identifier_inside_body generic_dimension
          {
-               var lt1 = (Tokenizer.LocatedToken) $1;
-               var lt2 = (Tokenizer.LocatedToken) $2;
+               var lt1 = (LocatedToken) $1;
+               var lt2 = (LocatedToken) $2;
 
                $$ = new QualifiedAliasMember (lt1.Value, lt2.Value, (int) $3, lt1.Location);
                lbag.AddLocation ($$, GetLocation ($2));
          }
        | unbound_type_name DOT identifier_inside_body
          {
-               var lt = (Tokenizer.LocatedToken) $3;
+               var lt = (LocatedToken) $3;
                
                $$ = new MemberAccess ((Expression) $1, lt.Value, lt.Location);         
          }
        | unbound_type_name DOT identifier_inside_body generic_dimension
          {
-               var lt = (Tokenizer.LocatedToken) $3;
+               var lt = (LocatedToken) $3;
                
                $$ = new MemberAccess ((Expression) $1, lt.Value, (int) $4, lt.Location);               
          }
@@ -3758,7 +3809,7 @@ unbound_type_name
                if (tne.HasTypeArguments)
                        Error_TypeExpected (GetLocation ($4));
 
-               var lt = (Tokenizer.LocatedToken) $3;
+               var lt = (LocatedToken) $3;
                $$ = new MemberAccess (tne, lt.Value, (int) $4, lt.Location);           
          }
        ;
@@ -3776,7 +3827,7 @@ generic_dimension
 qualified_alias_member
        : IDENTIFIER DOUBLE_COLON
          {
-               var lt = (Tokenizer.LocatedToken) $1;
+               var lt = (LocatedToken) $1;
                if (lang_version == LanguageVersion.ISO_1)
                        FeatureIsNotAvailable (lt.Location, "namespace alias qualifier");
 
@@ -3830,7 +3881,7 @@ unchecked_expression
 pointer_member_access
        : primary_expression OP_PTR IDENTIFIER opt_type_argument_list
          {
-               var lt = (Tokenizer.LocatedToken) $3;
+               var lt = (LocatedToken) $3;
                $$ = new MemberAccess (new Indirection ((Expression) $1, GetLocation ($2)), lt.Value, (TypeArguments) $4, lt.Location);
          }
        ;
@@ -3906,9 +3957,12 @@ unary_expression
                         if (current_anonymous_method is LambdaExpression) {
                                report.Error (4034, GetLocation ($1),
                                        "The `await' operator can only be used when its containing lambda expression is marked with the `async' modifier");
-                       } else if (current_anonymous_method is AnonymousMethodExpression) {
+                       } else if (current_anonymous_method != null) {
                                report.Error (4035, GetLocation ($1),
                                        "The `await' operator can only be used when its containing anonymous method is marked with the `async' modifier");
+                       } else if (interactive_async != null) {
+                               current_block.Explicit.RegisterAsyncAwait ();
+                               interactive_async = true;
                        } else {
                                report.Error (4033, GetLocation ($1),
                                        "The `await' operator can only be used when its containing method is marked with the `async' modifier");
@@ -4322,6 +4376,14 @@ conditional_expression
                $$ = new Conditional (new BooleanExpression ((Expression) $1), (Expression) $3, null, GetLocation ($2));
                lbag.AddLocation ($$, GetLocation ($4));
          }
+       | null_coalescing_expression INTERR expression COLON CLOSE_BRACE
+         {
+               Error_SyntaxError (Token.CLOSE_BRACE);
+
+               $$ = new Conditional (new BooleanExpression ((Expression) $1), (Expression) $3, null, GetLocation ($2));
+               lbag.AddLocation ($$, GetLocation ($4));
+               lexer.putback ('}');
+         }
        ;
 
 assignment_expression
@@ -4406,24 +4468,24 @@ lambda_parameter_list
 lambda_parameter
        : parameter_modifier parameter_type identifier_inside_body
          {
-               var lt = (Tokenizer.LocatedToken) $3;
+               var lt = (LocatedToken) $3;
 
                $$ = new Parameter ((FullNamedExpression) $2, lt.Value, (Parameter.Modifier) $1, null, lt.Location);
          }
        | parameter_type identifier_inside_body
          {
-               var lt = (Tokenizer.LocatedToken) $2;
+               var lt = (LocatedToken) $2;
 
                $$ = new Parameter ((FullNamedExpression) $1, lt.Value, Parameter.Modifier.NONE, null, lt.Location);
          }
        | IDENTIFIER
          {
-               var lt = (Tokenizer.LocatedToken) $1;
+               var lt = (LocatedToken) $1;
                $$ = new ImplicitLambdaParameter (lt.Value, lt.Location);
          }
        | AWAIT
          {
-               var lt = (Tokenizer.LocatedToken) Error_AwaitAsIdentifier ($1);
+               var lt = (LocatedToken) Error_AwaitAsIdentifier ($1);
                $$ = new ImplicitLambdaParameter (lt.Value, lt.Location);
          }
        ;
@@ -4472,7 +4534,7 @@ expression_or_error
 lambda_expression
        : IDENTIFIER ARROW 
          {
-               var lt = (Tokenizer.LocatedToken) $1;   
+               var lt = (LocatedToken) $1;     
                Parameter p = new ImplicitLambdaParameter (lt.Value, lt.Location);
                start_anonymous (true, new ParametersCompiled (p), false, lt.Location);
          }
@@ -4483,7 +4545,7 @@ lambda_expression
          }
        | AWAIT ARROW
          {
-               var lt = (Tokenizer.LocatedToken) Error_AwaitAsIdentifier ($1);
+               var lt = (LocatedToken) Error_AwaitAsIdentifier ($1);
                Parameter p = new ImplicitLambdaParameter (lt.Value, lt.Location);
                start_anonymous (true, new ParametersCompiled (p), false, lt.Location);
          }
@@ -4494,7 +4556,7 @@ lambda_expression
          }
        | ASYNC identifier_inside_body ARROW
          {
-               var lt = (Tokenizer.LocatedToken) $2;
+               var lt = (LocatedToken) $2;
                Parameter p = new ImplicitLambdaParameter (lt.Value, lt.Location);
                start_anonymous (true, new ParametersCompiled (p), true, lt.Location);
          }
@@ -4577,6 +4639,51 @@ boolean_expression
          }
        ;
 
+opt_primary_parameters
+       : /* empty */
+         {
+               $$ = null;
+         }
+       | primary_parameters
+       ;
+
+primary_parameters
+       : OPEN_PARENS opt_formal_parameter_list CLOSE_PARENS
+         {
+               $$ = $2;
+
+               // Cannot use opt_formal_parameter_list because it can be shared instance for empty parameters
+               lbag.AppendToMember (current_container, GetLocation ($1), GetLocation ($3));
+         }
+       ;
+
+opt_primary_parameters_with_class_base
+       : /* empty */
+         {
+               $$ = null;
+         }
+       | class_base
+         {
+               $$ = null;
+         }
+       | primary_parameters
+         {
+               $$ = $1;
+         }
+       | primary_parameters class_base OPEN_PARENS
+         {
+               ++lexer.parsing_block;
+         }
+         opt_argument_list CLOSE_PARENS
+         {
+               lbag.AppendToMember (current_container, GetLocation ($3), GetLocation ($6));
+               ((Class)current_type).PrimaryConstructorBaseArguments = (Arguments) $5;
+               --lexer.parsing_block;
+
+               $$ = $1;
+         }
+       ;
+
 //
 // 10 classes
 //
@@ -4597,12 +4704,17 @@ class_declaration
                }
                        
                push_current_container (c, $3);
+               valid_param_mod = ParameterModifierType.PrimaryConstructor;
          }
-         opt_class_base
+         opt_primary_parameters_with_class_base
          opt_type_parameter_constraints_clauses
          {
+               valid_param_mod = 0;
                lexer.ConstraintsParsing = false;
 
+               if ($8 != null)
+                       current_type.PrimaryConstructorParameters = (ParametersCompiled) $8;
+
                if ($9 != null)
                        current_container.SetConstraints ((List<Constraints>) $9);
                lbag.AddMember (current_container, mod_locations, GetLocation ($4));
@@ -4622,7 +4734,11 @@ class_declaration
          }
          opt_semicolon 
          {
-               lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($13), GetLocation ($15));
+               if ($15 == null) {
+                       lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($13));
+               } else {
+                       lbag.AppendToMember (current_container, GetLocation ($11), GetLocation ($13), GetLocation ($15));
+               }
                $$ = pop_current_class ();
          }
        ;       
@@ -4752,15 +4868,19 @@ modifier
        
 opt_class_base
        : /* empty */
-       | COLON type_list
+       | class_base
+       ;
+
+class_base
+       : COLON type_list
         {
-               current_type.AddBasesForPart ((List<FullNamedExpression>) $2);
+               current_type.SetBaseTypes ((List<FullNamedExpression>) $2);
         }
        | COLON type_list error
          {
                Error_SyntaxError (yyToken);
 
-               current_type.AddBasesForPart ((List<FullNamedExpression>) $2);
+               current_type.SetBaseTypes ((List<FullNamedExpression>) $2);
          }
        ;
 
@@ -4800,7 +4920,7 @@ type_parameter_constraints_clauses
 type_parameter_constraints_clause
        : WHERE IDENTIFIER COLON type_parameter_constraints
          {
-               var lt = (Tokenizer.LocatedToken) $2;
+               var lt = (LocatedToken) $2;
                $$ = new Constraints (new SimpleMemberName (lt.Value, lt.Location), (List<FullNamedExpression>) $4, GetLocation ($1));
                lbag.AddLocation ($$, GetLocation ($3));
          }
@@ -4808,7 +4928,7 @@ type_parameter_constraints_clause
          {
                Error_SyntaxError (yyToken);
          
-               var lt = (Tokenizer.LocatedToken) $2;
+               var lt = (LocatedToken) $2;
                $$ = new Constraints (new SimpleMemberName (lt.Value, lt.Location), null, GetLocation ($1));
          }
        ; 
@@ -4871,7 +4991,7 @@ type_parameter_constraint
 opt_type_parameter_variance
        : /* empty */
          {
-               $$ = Variance.None;
+               $$ = null;
          }
        | type_parameter_variance
          {
@@ -4885,11 +5005,11 @@ opt_type_parameter_variance
 type_parameter_variance
        : OUT
          {
-               $$ = Variance.Covariant;
+               $$ = new VarianceDecl (Variance.Covariant, GetLocation ($1));
          }
        | IN
          {
-               $$ = Variance.Contravariant;
+               $$ = new VarianceDecl (Variance.Contravariant, GetLocation ($1));
          }
        ;
 
@@ -5057,7 +5177,7 @@ empty_statement
 labeled_statement
        : identifier_inside_body COLON 
          {
-               var lt = (Tokenizer.LocatedToken) $1;
+               var lt = (LocatedToken) $1;
                LabeledStatement labeled = new LabeledStatement (lt.Value, current_block, lt.Location);
                lbag.AddLocation (labeled, GetLocation ($2));
                current_block.AddLabel (labeled);
@@ -5174,23 +5294,26 @@ identifier_inside_body
 block_variable_declaration
        : variable_type identifier_inside_body
          {
-               var lt = (Tokenizer.LocatedToken) $2;
+               var lt = (LocatedToken) $2;
                var li = new LocalVariable (current_block, lt.Value, lt.Location);
                current_block.AddLocalName (li);
-               current_variable = new BlockVariableDeclaration ((FullNamedExpression) $1, li);
+               current_variable = new BlockVariable ((FullNamedExpression) $1, li);
          }
          opt_local_variable_initializer opt_variable_declarators SEMICOLON
          {
                $$ = current_variable;
                current_variable = null;
-               lbag.AddLocation ($$, GetLocation ($6));
+               if ($4 != null)
+                       lbag.AddLocation ($$, PopLocation (), GetLocation ($6));
+               else
+                       lbag.AddLocation ($$, GetLocation ($6));
          }
        | CONST variable_type identifier_inside_body
          {
-               var lt = (Tokenizer.LocatedToken) $3;
+               var lt = (LocatedToken) $3;
                var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.Constant, lt.Location);
                current_block.AddLocalName (li);
-               current_variable = new BlockConstantDeclaration ((FullNamedExpression) $2, li);
+               current_variable = new BlockConstant ((FullNamedExpression) $2, li);
          }
          const_variable_initializer opt_const_declarators SEMICOLON
          {
@@ -5205,7 +5328,8 @@ opt_local_variable_initializer
        | ASSIGN block_variable_initializer
          {
                current_variable.Initializer = (Expression) $2;
-               // TODO: lbag
+               PushLocation (GetLocation ($1));
+               $$ = current_variable;
          }
        | error
          {
@@ -5242,18 +5366,18 @@ variable_declarators
 variable_declarator
        : COMMA identifier_inside_body
          {
-               var lt = (Tokenizer.LocatedToken) $2;     
+               var lt = (LocatedToken) $2;       
                var li = new LocalVariable (current_variable.Variable, lt.Value, lt.Location);
-               var d = new BlockVariableDeclaration.Declarator (li, null);
+               var d = new BlockVariableDeclarator (li, null);
                current_variable.AddDeclarator (d);
                current_block.AddLocalName (li);
                lbag.AddLocation (d, GetLocation ($1));
          }
        | COMMA identifier_inside_body ASSIGN block_variable_initializer
          {
-               var lt = (Tokenizer.LocatedToken) $2;     
+               var lt = (LocatedToken) $2;       
                var li = new LocalVariable (current_variable.Variable, lt.Value, lt.Location);
-               var d = new BlockVariableDeclaration.Declarator (li, (Expression) $4);
+               var d = new BlockVariableDeclarator (li, (Expression) $4);
                current_variable.AddDeclarator (d);
                current_block.AddLocalName (li);
                lbag.AddLocation (d, GetLocation ($1), GetLocation ($3));
@@ -5284,9 +5408,9 @@ const_declarators
 const_declarator
        : COMMA identifier_inside_body ASSIGN constant_initializer_expr
          {
-               var lt = (Tokenizer.LocatedToken) $2;     
+               var lt = (LocatedToken) $2;       
                var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.Constant, lt.Location);
-               var d = new BlockVariableDeclaration.Declarator (li, (Expression) $4);
+               var d = new BlockVariableDeclarator (li, (Expression) $4);
                current_variable.AddDeclarator (d);
                current_block.AddLocalName (li);
                lbag.AddLocation (d, GetLocation ($1), GetLocation ($3));
@@ -5337,7 +5461,6 @@ statement_expression
                ExpressionStatement s = $1 as ExpressionStatement;
                if (s == null) {
                        var expr = $1 as Expression;
-                       expr.Error_InvalidExpressionStatement (report);
                        $$ = new StatementErrorExpression (expr);
                } else {
                        $$ = new StatementExpression (s);
@@ -5349,10 +5472,7 @@ interactive_statement_expression
        : expression
          {
                Expression expr = (Expression) $1;
-               ExpressionStatement s;
-
-               s = new OptionalAssign (new SimpleName ("$retval", lexer.Location), expr, lexer.Location);
-               $$ = new StatementExpression (s);
+               $$ = new StatementExpression (new OptionalAssign (expr, lexer.Location));
          }
        | error
          {
@@ -5604,14 +5724,17 @@ opt_for_initializer
 for_initializer
        : variable_type identifier_inside_body
          {
-               var lt = (Tokenizer.LocatedToken) $2;
+               var lt = (LocatedToken) $2;
                var li = new LocalVariable (current_block, lt.Value, lt.Location);
                current_block.AddLocalName (li);
-               current_variable = new BlockVariableDeclaration ((FullNamedExpression) $1, li);
+               current_variable = new BlockVariable ((FullNamedExpression) $1, li);
          }
          opt_local_variable_initializer opt_variable_declarators
          {
                $$ = current_variable;
+               if ($4 != null)
+                       lbag.AddLocation (current_variable, PopLocation ());
+
                current_variable = null;
          }
        | statement_expression_list
@@ -5669,7 +5792,7 @@ foreach_statement
                start_block (GetLocation ($2));
                current_block.IsCompilerGenerated = true;
                
-               var lt = (Tokenizer.LocatedToken) $4;
+               var lt = (LocatedToken) $4;
                var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.ForeachVariable | LocalVariable.Flags.Used, lt.Location);
                current_block.AddLocalName (li);
                
@@ -5684,7 +5807,7 @@ foreach_statement
                start_block (GetLocation ($2));
                current_block.IsCompilerGenerated = true;
                
-               var lt = (Tokenizer.LocatedToken) $4;
+               var lt = (LocatedToken) $4;
                var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.ForeachVariable | LocalVariable.Flags.Used, lt.Location);
                current_block.AddLocalName (li);
                $$ = li;
@@ -5735,7 +5858,7 @@ continue_statement
 goto_statement
        : GOTO identifier_inside_body SEMICOLON 
          {
-               var lt = (Tokenizer.LocatedToken) $2;
+               var lt = (LocatedToken) $2;
                $$ = new Goto (lt.Value, GetLocation ($1));
                lbag.AddStatement ($$, GetLocation ($2), GetLocation ($3));
          }
@@ -5775,6 +5898,11 @@ throw_statement
                $$ = new Throw ((Expression) $2, GetLocation ($1));
                lbag.AddStatement ($$, GetLocation ($3));
          }
+       | THROW expression error
+         {
+               Error_SyntaxError (yyToken);
+               $$ = new Throw ((Expression) $2, GetLocation ($1));
+         }
        | THROW error
          {
                Error_SyntaxError (yyToken);
@@ -5785,7 +5913,7 @@ throw_statement
 yield_statement 
        : identifier_inside_body RETURN opt_expression SEMICOLON
          {
-               var lt = (Tokenizer.LocatedToken) $1;
+               var lt = (LocatedToken) $1;
                string s = lt.Value;
                if (s != "yield"){
                        report.Error (1003, lt.Location, "; expected");
@@ -5803,7 +5931,7 @@ yield_statement
          {
                Error_SyntaxError (yyToken);
 
-               var lt = (Tokenizer.LocatedToken) $1;
+               var lt = (LocatedToken) $1;
                string s = lt.Value;
                if (s != "yield"){
                        report.Error (1003, lt.Location, "; expected");
@@ -5819,7 +5947,7 @@ yield_statement
          }
        | identifier_inside_body BREAK SEMICOLON
          {
-               var lt = (Tokenizer.LocatedToken) $1;
+               var lt = (LocatedToken) $1;
                string s = lt.Value;
                if (s != "yield"){
                        report.Error (1003, lt.Location, "; expected");
@@ -5827,7 +5955,7 @@ yield_statement
                        FeatureIsNotAvailable (lt.Location, "iterators");
                }
                
-               current_block.Explicit.RegisterIteratorYield ();
+               current_block.ParametersBlock.TopBlock.IsIterator = true;
                $$ = new YieldBreak (lt.Location);
                lbag.AddStatement ($$, GetLocation ($2), GetLocation ($3));
          }
@@ -5845,12 +5973,12 @@ try_statement
          }
        | TRY block FINALLY block
          {
-               $$ = new TryFinally ((Statement) $2, (Block) $4, GetLocation ($1));
+               $$ = new TryFinally ((Statement) $2, (ExplicitBlock) $4, GetLocation ($1));
                lbag.AddStatement ($$, GetLocation ($3));
          }
        | TRY block catch_clauses FINALLY block
          {
-               $$ = new TryFinally (new TryCatch ((Block) $2, (List<Catch>) $3, Location.Null, true), (Block) $5, GetLocation ($1));
+               $$ = new TryFinally (new TryCatch ((Block) $2, (List<Catch>) $3, Location.Null, true), (ExplicitBlock) $5, GetLocation ($1));
                lbag.AddStatement ($$, GetLocation ($4));
          }
        | TRY block error
@@ -5873,7 +6001,8 @@ catch_clauses
                var l = (List<Catch>) $1;
                
                Catch c = (Catch) $2;
-               if (l [l.Count - 1].IsGeneral) {
+               var prev_catch = l [l.Count - 1];
+               if (prev_catch.IsGeneral && prev_catch.Filter == null) {
                        report.Error (1017, c.loc, "Try statement already has an empty catch block");
                }
                
@@ -5888,18 +6017,20 @@ opt_identifier
        ;
 
 catch_clause 
-       : CATCH block
+       : CATCH opt_catch_filter block
          {
-               $$ = new Catch ((Block) $2, GetLocation ($1));
+               var c = new Catch ((ExplicitBlock) $3, GetLocation ($1));
+               c.Filter = (CatchFilterExpression) $2;
+               $$ = c;
          }
        | CATCH open_parens_any type opt_identifier CLOSE_PARENS
          {
                start_block (GetLocation ($2));
-               var c = new Catch (current_block, GetLocation ($1));
+               var c = new Catch ((ExplicitBlock) current_block, GetLocation ($1));
                c.TypeExpression = (FullNamedExpression) $3;
 
                if ($4 != null) {
-                       var lt = (Tokenizer.LocatedToken) $4;
+                       var lt = (LocatedToken) $4;
                        c.Variable = new LocalVariable (current_block, lt.Value, lt.Location);
                        current_block.AddLocalName (c.Variable);
                }
@@ -5907,8 +6038,9 @@ catch_clause
                lbag.AddLocation (c, GetLocation ($2), GetLocation ($5));
                $$ = c;
          }
-         block_prepared
+         opt_catch_filter block_prepared
          {
+               ((Catch) $6).Filter = (CatchFilterExpression) $7;
                $$ = $6;
          }
        | CATCH open_parens_any error
@@ -5932,7 +6064,7 @@ catch_clause
                c.TypeExpression = (FullNamedExpression) $3;
 
                if ($4 != null) {
-                       var lt = (Tokenizer.LocatedToken) $4;
+                       var lt = (LocatedToken) $4;
                        c.Variable = new LocalVariable (current_block, lt.Value, lt.Location);
                }
 
@@ -5942,6 +6074,18 @@ catch_clause
          }
        ;
 
+opt_catch_filter
+       : /* empty */
+       | IF open_parens_any expression CLOSE_PARENS
+         {
+               if (lang_version <= LanguageVersion.V_5)
+                       FeatureIsNotAvailable (GetLocation ($1), "exception filter");
+
+               $$ = new CatchFilterExpression ((Expression) $3, GetLocation ($1));
+               lbag.AddLocation ($$, GetLocation ($2), GetLocation ($4));
+         }
+       ;
+
 checked_statement
        : CHECKED block
          {
@@ -5990,7 +6134,7 @@ fixed_statement
            start_block (GetLocation ($2));
            
                current_block.IsCompilerGenerated = true;
-               var lt = (Tokenizer.LocatedToken) $4;
+               var lt = (LocatedToken) $4;
                var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.FixedVariable | LocalVariable.Flags.Used, lt.Location);
                current_block.AddLocalName (li);
                current_variable = new Fixed.VariableDeclaration ((FullNamedExpression) $3, li);
@@ -6007,6 +6151,7 @@ fixed_statement
          
                Fixed f = new Fixed ((Fixed.VariableDeclaration) $9, (Statement) $10, GetLocation ($1));
                current_block.AddStatement (f);
+               lbag.AddStatement (f, GetLocation ($2), GetLocation ($8));
                $$ = end_block (GetLocation ($8));
          }
        ;
@@ -6017,7 +6162,7 @@ using_statement
            start_block (GetLocation ($2));
            
                current_block.IsCompilerGenerated = true;
-               var lt = (Tokenizer.LocatedToken) $4;
+               var lt = (LocatedToken) $4;
                var li = new LocalVariable (current_block, lt.Value, LocalVariable.Flags.UsingVariable | LocalVariable.Flags.Used, lt.Location);
                current_block.AddLocalName (li);
                current_variable = new Using.VariableDeclaration ((FullNamedExpression) $3, li);
@@ -6121,21 +6266,23 @@ first_from_clause
          {
                current_block = new Linq.QueryBlock (current_block, lexer.Location);
          
-               var lt = (Tokenizer.LocatedToken) $2;
+               var lt = (LocatedToken) $2;
                var rv = new Linq.RangeVariable (lt.Value, lt.Location);
-               $$ = new Linq.QueryExpression (new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$4, rv, GetLocation ($1)));
+               var clause = new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$4, rv, GetLocation ($1));
+               lbag.AddLocation (clause, GetLocation ($3));
+               $$ = new Linq.QueryExpression (clause);
          }
        | FROM_FIRST type identifier_inside_body IN expression
          {
                current_block = new Linq.QueryBlock (current_block, lexer.Location);
          
-               var lt = (Tokenizer.LocatedToken) $3;
+               var lt = (LocatedToken) $3;
                var rv = new Linq.RangeVariable (lt.Value, lt.Location);
-               $$ = new Linq.QueryExpression (
-                       new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$5, rv, GetLocation ($1)) {
+               var clause = new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$5, rv, GetLocation ($1)) {
                                IdentifierType = (FullNamedExpression)$2
-                       }
-               );
+               };
+               lbag.AddLocation (clause, GetLocation ($4));
+               $$ = new Linq.QueryExpression (clause);
          }
        ;
 
@@ -6144,21 +6291,23 @@ nested_from_clause
          {
                current_block = new Linq.QueryBlock (current_block, lexer.Location);
          
-               var lt = (Tokenizer.LocatedToken) $2;
+               var lt = (LocatedToken) $2;
                var rv = new Linq.RangeVariable (lt.Value, lt.Location);
-               $$ = new Linq.QueryExpression (new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$4, rv, GetLocation ($1)));
+               var clause = new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$4, rv, GetLocation ($1));
+               lbag.AddLocation (clause, GetLocation ($3));
+               $$ = new Linq.QueryExpression (clause);
          }
        | FROM type identifier_inside_body IN expression
          {
                current_block = new Linq.QueryBlock (current_block, lexer.Location);
          
-               var lt = (Tokenizer.LocatedToken) $3;
+               var lt = (LocatedToken) $3;
                var rv = new Linq.RangeVariable (lt.Value, lt.Location);
-               $$ = new Linq.QueryExpression (
-                       new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$5, rv, GetLocation ($1)) {
+               var clause = new Linq.QueryStartClause ((Linq.QueryBlock)current_block, (Expression)$5, rv, GetLocation ($1)) {
                                IdentifierType = (FullNamedExpression)$2
-                       }
-               );
+               };
+               lbag.AddLocation (clause, GetLocation ($4));
+               $$ = new Linq.QueryExpression (clause);
          }
        ;
        
@@ -6169,7 +6318,7 @@ from_clause
          }
          expression_or_error
          {
-               var lt = (Tokenizer.LocatedToken) $2;
+               var lt = (LocatedToken) $2;
                var sn = new Linq.RangeVariable (lt.Value, lt.Location);
                $$ = new Linq.SelectMany ((Linq.QueryBlock)current_block, sn, (Expression)$5, GetLocation ($1));
                
@@ -6177,6 +6326,7 @@ from_clause
                current_block = current_block.Parent;
                
                ((Linq.QueryBlock)current_block).AddRangeVariable (sn);
+               lbag.AddLocation ($$, GetLocation ($3));
          }       
        | FROM type identifier_inside_body IN
          {
@@ -6184,7 +6334,7 @@ from_clause
          }
          expression_or_error
          {
-               var lt = (Tokenizer.LocatedToken) $3;
+               var lt = (LocatedToken) $3;
                var sn = new Linq.RangeVariable (lt.Value, lt.Location);
 
                $$ = new Linq.SelectMany ((Linq.QueryBlock)current_block, sn, (Expression)$6, GetLocation ($1)) {
@@ -6195,6 +6345,8 @@ from_clause
                current_block = current_block.Parent;
                
                ((Linq.QueryBlock)current_block).AddRangeVariable (sn);
+               
+               lbag.AddLocation ($$, GetLocation ($4));
          }
        ;       
 
@@ -6314,7 +6466,7 @@ let_clause
          }
          expression_or_error
          {
-               var lt = (Tokenizer.LocatedToken) $2;
+               var lt = (LocatedToken) $2;
                var sn = new Linq.RangeVariable (lt.Value, lt.Location);
                $$ = new Linq.Let ((Linq.QueryBlock) current_block, sn, (Expression)$5, GetLocation ($1));
                lbag.AddLocation ($$, GetLocation ($3));
@@ -6373,7 +6525,7 @@ join_clause
                var outer_selector = linq_clause_blocks.Pop ();
                var block = linq_clause_blocks.Pop ();
 
-               var lt = (Tokenizer.LocatedToken) $2;   
+               var lt = (LocatedToken) $2;     
                var sn = new Linq.RangeVariable (lt.Value, lt.Location);
                Linq.RangeVariable into;
                
@@ -6393,7 +6545,7 @@ join_clause
                        
                        ((Linq.QueryBlock)current_block).AddRangeVariable (sn);
                
-                       lt = (Tokenizer.LocatedToken) $12;
+                       lt = (LocatedToken) $12;
                        into = new Linq.RangeVariable (lt.Value, lt.Location);
 
                        $$ = new Linq.GroupJoin (block, sn, (Expression)$5, outer_selector, (Linq.QueryBlock) current_block, into, GetLocation ($1));   
@@ -6435,7 +6587,7 @@ join_clause
                var outer_selector = linq_clause_blocks.Pop ();
                var block = linq_clause_blocks.Pop ();
                
-               var lt = (Tokenizer.LocatedToken) $3;
+               var lt = (LocatedToken) $3;
                var sn = new Linq.RangeVariable (lt.Value, lt.Location);
                Linq.RangeVariable into;
                
@@ -6444,6 +6596,7 @@ join_clause
                        $$ = new Linq.Join (block, sn, (Expression)$6, outer_selector, (Linq.QueryBlock) current_block, GetLocation ($1)) {
                                IdentifierType = (FullNamedExpression)$2
                        };
+                       lbag.AddLocation ($$, GetLocation ($3), GetLocation ($6), GetLocation ($9));
                } else {
                        //
                        // Set equals right side parent to beginning of linq query, it is not accessible therefore cannot cause name collisions
@@ -6456,7 +6609,7 @@ join_clause
                
                        ((Linq.QueryBlock)current_block).AddRangeVariable (sn);
                
-                       lt = (Tokenizer.LocatedToken) $13;
+                       lt = (LocatedToken) $13;
                        into = new Linq.RangeVariable (lt.Value, lt.Location); // TODO:
                        
                        $$ = new Linq.GroupJoin (block, sn, (Expression)$6, outer_selector, (Linq.QueryBlock) current_block, into, GetLocation ($1)) {
@@ -6579,7 +6732,7 @@ opt_query_continuation
          query_body
          {
                var current_block = linq_clause_blocks.Pop ();    
-               var lt = (Tokenizer.LocatedToken) $2;
+               var lt = (LocatedToken) $2;
                var rv = new Linq.RangeVariable (lt.Value, lt.Location);
                $$ = new Linq.QueryStartClause ((Linq.QueryBlock)current_block, null, rv, GetLocation ($1)) {
                        next = (Linq.AQueryClause)$4
@@ -6617,27 +6770,30 @@ interactive_parsing
                        mods |= Modifiers.UNSAFE;
 
                current_local_parameters = pars;
-               Method method = new Method (
+               var method = new InteractiveMethod (
                        current_type,
                        new TypeExpression (compiler.BuiltinTypes.Void, Location.Null),
                        mods,
-                       new MemberName ("Host"),
-                       pars,
-                       null /* attributes */);
+                       pars);
                        
                current_type.AddMember (method);                        
-
                oob_stack.Push (method);
+
+               interactive_async = false;
+
                ++lexer.parsing_block;
                start_block (lexer.Location);
          }             
          interactive_statement_list opt_COMPLETE_COMPLETION
          {
                --lexer.parsing_block;
-               Method method = (Method) oob_stack.Pop ();
-
+               var method = (InteractiveMethod) oob_stack.Pop ();
                method.Block = (ToplevelBlock) end_block(lexer.Location);
 
+               if (interactive_async == true) {
+                       method.ChangeToAsync ();
+               }
+
                InteractiveResult = (Class) pop_current_class ();
                current_local_parameters = null;
          } 
@@ -6684,7 +6840,7 @@ doc_cref
          {
                module.DocumentationBuilder.ParsedBuiltinType = (TypeExpression)$1;
                module.DocumentationBuilder.ParsedParameters = (List<DocumentationParameter>)$4;
-               var lt = (Tokenizer.LocatedToken) $3;
+               var lt = (LocatedToken) $3;
                $$ = new MemberName (lt.Value);
          }
        | doc_type_declaration_name DOT THIS
@@ -6846,7 +7002,7 @@ object Error_AwaitAsIdentifier (object token)
 {
        if (async_block) {
                report.Error (4003, GetLocation (token), "`await' cannot be used as an identifier within an async method or lambda expression");
-               return new Tokenizer.LocatedToken ("await", GetLocation (token));
+               return new LocatedToken ("await", GetLocation (token));
        }
 
        return token;
@@ -6894,15 +7050,37 @@ void StoreModifierLocation (object token, Location loc)
        mod_locations.Add (Tuple.Create ((Modifiers) token, loc));
 }
 
-string CheckAttributeTarget (string a, Location l)
+[System.Diagnostics.Conditional ("FULL_AST")]
+void PushLocation (Location loc)
+{
+       if (location_stack == null)
+               location_stack = new Stack<Location> ();
+
+       location_stack.Push (loc);
+}
+
+Location PopLocation ()
+{
+       if (location_stack == null)
+               return Location.Null;
+
+       return location_stack.Pop ();
+}
+
+string CheckAttributeTarget (int token, string a, Location l)
 {
        switch (a) {
        case "assembly" : case "module" : case "field" : case "method" : case "param" : case "property" : case "type" :
                        return a;
        }
 
-       report.Warning (658, 1, l,
-                "`{0}' is invalid attribute target. All attributes in this attribute section will be ignored", a);
+       if (!Tokenizer.IsValidIdentifier (a)) {
+               Error_SyntaxError (token);
+       } else {
+               report.Warning (658, 1, l,
+                        "`{0}' is invalid attribute target. All attributes in this attribute section will be ignored", a);
+       }
+
        return string.Empty;
 }
 
@@ -6954,7 +7132,7 @@ public CSharpParser (SeekableStreamReader reader, CompilationSourceFile file, Re
        lang_version = settings.Version;
        yacc_verbose_flag = settings.VerboseParserFlag;
        doc_support = settings.DocumentationFile != null;
-       lexer = new Tokenizer (reader, file, session);
+       lexer = new Tokenizer (reader, file, session, report);
        oob_stack = new Stack<object> ();
        lbag = session.LocationsBag;
        use_global_stacks = session.UseJayGlobalArrays;
@@ -7016,7 +7194,7 @@ void FeatureIsNotAvailable (Location loc, string feature)
 
 Location GetLocation (object obj)
 {
-       var lt = obj as Tokenizer.LocatedToken;
+       var lt = obj as LocatedToken;
        if (lt != null)
                return lt.Location;
                
@@ -7093,7 +7271,7 @@ AnonymousMethodExpression end_anonymous (ParametersBlock anon_block)
        retval = current_anonymous_method;
 
        async_block = (bool) oob_stack.Pop ();
-       current_variable = (BlockVariableDeclaration) oob_stack.Pop ();
+       current_variable = (BlockVariable) oob_stack.Pop ();
        current_local_parameters = (ParametersCompiled) oob_stack.Pop ();
        current_anonymous_method = (AnonymousMethodExpression) oob_stack.Pop ();
 
@@ -7202,7 +7380,7 @@ string GetSymbolName (int token)
        case Token.LITERAL:
                return ((Constant)lexer.Value).GetValue ().ToString ();
        case Token.IDENTIFIER:
-               return ((Tokenizer.LocatedToken)lexer.Value).Value;
+               return ((LocatedToken)lexer.Value).Value;
 
        case Token.BOOL:
                return "bool";