2008-11-05 Francisco Figueiredo Jr. <francisco@npgsql.org>
[mono.git] / mcs / mcs / cs-parser.jay
index a321a05e6d1c6cf07c6d3ba71dfecd0f5358308d..82665c5e9d1b92c107b51f89c22c0e58908ec6ab 100644 (file)
@@ -1738,7 +1738,7 @@ get_accessor_declaration
          accessor_body
          {
                if (has_get) {
-                       Report.Error (1007, (Location) $3, "Property accessor already defined");
+                       Report.Error (1007, GetLocation ($3), "Property accessor already defined");
                        break;
                }
                Accessor accessor = new Accessor ((ToplevelBlock) $5, (int) $2, (Attributes) $1, current_local_parameters, (Location) $3);
@@ -1773,7 +1773,7 @@ set_accessor_declaration
          accessor_body
          {
                if (has_set) {
-                       Report.Error (1007, ((LocatedToken) $3).Location, "Property accessor already defined");
+                       Report.Error (1007, GetLocation ($3), "Property accessor already defined");
                        break;
                }
                Accessor accessor = new Accessor ((ToplevelBlock) $5, (int) $2, (Attributes) $1, current_local_parameters, (Location) $3);
@@ -2040,11 +2040,13 @@ conversion_operator_declarator
          }
        | IMPLICIT error 
          {
-               syntax_error ((Location) $1, "'operator' expected");
+               Error_SyntaxError (yyToken);
+               $$ = new OperatorDeclaration (Operator.OpType.Implicit, null, GetLocation ($1));
          }
        | EXPLICIT error 
          {
-               syntax_error ((Location) $1, "'operator' expected");
+               Error_SyntaxError (yyToken);
+               $$ = new OperatorDeclaration (Operator.OpType.Explicit, null, GetLocation ($1));
          }
        ;
 
@@ -2872,7 +2874,7 @@ base_type_name
        
 /*
  * replaces all the productions for isolating the various
- * simple types, but we need this to reuse it easily in local_variable_type
+ * simple types, but we need this to reuse it easily in variable_type
  */
 builtin_types
        : OBJECT        { $$ = TypeManager.system_object_expr; }
@@ -4355,7 +4357,7 @@ declaration_statement
  * > expressions to prevent reduce/reduce errors in the grammar.
  * > The expressions are converted into types during semantic analysis.
  */
-local_variable_type
+variable_type
        : primary_expression_no_array_creation opt_rank_specifier_or_nullable
          { 
                // FIXME: Do something smart here regarding the composition of the type.
@@ -4439,6 +4441,23 @@ local_variable_pointer_type
          }
        ;
 
+local_variable_type
+       : variable_type
+       | local_variable_pointer_type opt_rank_specifier
+         {
+               if ($1 != null){
+                       string rank = (string)$2;
+
+                       if (rank == "")
+                               $$ = $1;
+                       else
+                               $$ = current_array_type = new ComposedCast ((FullNamedExpression) $1, rank);
+               } else {
+                       $$ = null;
+               }
+         }
+       ;
+
 local_variable_declaration
        : local_variable_type local_variable_declarators
          {
@@ -4451,23 +4470,10 @@ local_variable_declaration
                } else
                        $$ = null;
          }
-       | local_variable_pointer_type opt_rank_specifier local_variable_declarators
-         {
-               if ($1 != null){
-                       Expression t;
-
-                       if ((string) $2 == "")
-                               t = (Expression) $1;
-                       else
-                               t = new ComposedCast ((FullNamedExpression) $1, (string) $2);
-                       $$ = new DictionaryEntry (t, $3);
-               } else 
-                       $$ = null;
-         }
        ;
 
 local_constant_declaration
-       : CONST local_variable_type constant_declarators
+       : CONST variable_type constant_declarators
          {
                if ($2 != null)
                        $$ = new DictionaryEntry ($2, $3);
@@ -4498,10 +4504,9 @@ statement_expression
 
                if (s == null) {
                        expr.Error_InvalidExpressionStatement ();
-                       $$ = null;
-               } else {
-                       $$ = new StatementExpression (s);
                }
+
+               $$ = new StatementExpression (s);
          }
        | error
          {