misc parser changes
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / compiler / parser / Parser.java
index 7369a24..f389faa 100644 (file)
@@ -165,6 +165,12 @@ public class Parser //extends PHPParserSuperclass
             problemEndPosition, referenceContext,
             compilationUnit.compilationResult);
   }
+  private void reportSyntaxWarning(String error, int problemStartPosition,
+      int problemEndPosition) {
+    problemReporter.phpParsingWarning(new String[]{error},
+        problemStartPosition, problemEndPosition, referenceContext,
+        compilationUnit.compilationResult);
+  }
   /**
    * Method Declaration.
    * 
@@ -1222,38 +1228,38 @@ public class Parser //extends PHPParserSuperclass
       //          getNextToken();
       //        }
       //        return;
-//    } else if (token == TokenNamedefine) {
-//      getNextToken();
-//      if (token == TokenNameLPAREN) {
-//        getNextToken();
-//      } else {
-//        throwSyntaxError("'(' expected after 'define' keyword.");
-//      }
-//      expr();
-//      if (token == TokenNameCOMMA) {
-//        getNextToken();
-//      } else {
-//        throwSyntaxError("',' expected after first 'define' constant.");
-//      }
-//      expr();
-//      if (token == TokenNameCOMMA) {
-//        getNextToken();
-//        expr();
-//      }
-//      if (token == TokenNameRPAREN) {
-//        getNextToken();
-//      } else {
-//        throwSyntaxError("')' expected after 'define' statement.");
-//      }
-//      if (token == TokenNameSEMICOLON) {
-//        getNextToken();
-//      } else {
-//        if (token != TokenNameStopPHP) {
-//          throwSyntaxError("';' expected after 'define' statement.");
-//        }
-//        getNextToken();
-//      }
-//      return;
+      //    } else if (token == TokenNamedefine) {
+      //      getNextToken();
+      //      if (token == TokenNameLPAREN) {
+      //        getNextToken();
+      //      } else {
+      //        throwSyntaxError("'(' expected after 'define' keyword.");
+      //      }
+      //      expr();
+      //      if (token == TokenNameCOMMA) {
+      //        getNextToken();
+      //      } else {
+      //        throwSyntaxError("',' expected after first 'define' constant.");
+      //      }
+      //      expr();
+      //      if (token == TokenNameCOMMA) {
+      //        getNextToken();
+      //        expr();
+      //      }
+      //      if (token == TokenNameRPAREN) {
+      //        getNextToken();
+      //      } else {
+      //        throwSyntaxError("')' expected after 'define' statement.");
+      //      }
+      //      if (token == TokenNameSEMICOLON) {
+      //        getNextToken();
+      //      } else {
+      //        if (token != TokenNameStopPHP) {
+      //          throwSyntaxError("';' expected after 'define' statement.");
+      //        }
+      //        getNextToken();
+      //      }
+      //      return;
     } else if (token == TokenNamefunction) {
       MethodDeclaration methodDecl = new MethodDeclaration(
           this.compilationUnit.compilationResult);
@@ -1437,7 +1443,7 @@ public class Parser //extends PHPParserSuperclass
       }
       getNextToken();
     } else {
-        throwSyntaxError("Keyword 'class' 'final' or 'abstract' expected");
+      throwSyntaxError("Keyword 'class' 'final' or 'abstract' expected");
     }
   }
   private void interface_extends_list() {
@@ -1492,14 +1498,10 @@ public class Parser //extends PHPParserSuperclass
   private void class_statement_list() {
     do {
       class_statement();
-    } while (token == TokenNamepublic || 
-        token == TokenNameprotected || 
-        token == TokenNameprivate || 
-        token == TokenNamestatic || 
-        token == TokenNameabstract || 
-        token == TokenNamefinal || 
-        token == TokenNamefunction || 
-        token == TokenNamevar);
+    } while (token == TokenNamepublic || token == TokenNameprotected
+        || token == TokenNameprivate || token == TokenNamestatic
+        || token == TokenNameabstract || token == TokenNamefinal
+        || token == TokenNamefunction || token == TokenNamevar);
   }
   private void class_statement() {
     //    class_statement:
@@ -1510,12 +1512,12 @@ public class Parser //extends PHPParserSuperclass
     initializeModifiers();
     if (token == TokenNamevar) {
       checkAndSetModifiers(AccPublic);
-      reportSyntaxError(
-          "Keyword 'var' is deprecated. Please use 'public' 'private' or 'protected' modifier for field declarations.",
-          scanner.getCurrentTokenStartPosition(), scanner
-              .getCurrentTokenEndPosition());
+      problemReporter.phpVarDeprecatedWarning(scanner
+          .getCurrentTokenStartPosition(),
+          scanner.getCurrentTokenEndPosition(), referenceContext,
+          compilationUnit.compilationResult);
       getNextToken();
-      classProperty();
+      class_variable_declaration();
     } else {
       boolean hasModifiers = member_modifiers();
       if (token == TokenNamefunction) {
@@ -1533,7 +1535,7 @@ public class Parser //extends PHPParserSuperclass
         if (!hasModifiers) {
           throwSyntaxError("'public' 'private' or 'protected' modifier expected for field declarations.");
         }
-        classProperty();
+        class_variable_declaration();
       }
     }
     //    if (token == TokenNamefunction) {
@@ -1618,32 +1620,34 @@ public class Parser //extends PHPParserSuperclass
     }
     return foundToken;
   }
-  private void classProperty() {
-    //'var' variable ';'
-    //'var' variable '=' constant ';'
+  private void class_variable_declaration() {
+    //    class_variable_declaration:
+    //         class_variable_declaration ',' T_VARIABLE
+    // | class_variable_declaration ',' T_VARIABLE '=' static_scalar
+    // | T_VARIABLE
+    // | T_VARIABLE '=' static_scalar
     do {
       if (token == TokenNameVariable) {
         getNextToken();
         if (token == TokenNameEQUAL) {
           getNextToken();
-          constant();
+          static_scalar();
         }
       } else {
         if (token == TokenNamethis) {
-          throwSyntaxError("Reserved word '$this' not allowed after keyword 'var'.");
+          throwSyntaxError("'$this' not allowed after keyword 'public' 'protected' 'private' 'var'.");
         }
-        throwSyntaxError("Variable expected after keyword 'var'.");
+        throwSyntaxError("Variable expected keyword 'public' 'protected' 'private' 'var'.");
       }
       if (token != TokenNameCOMMA) {
         break;
       }
       getNextToken();
     } while (true);
-    if (token == TokenNameSEMICOLON) {
-      getNextToken();
-    } else {
-      throwSyntaxError("';' expected after variable declaration.");
+    if (token != TokenNameSEMICOLON) {
+      throwSyntaxError("';' expected after field declaration.");
     }
+    getNextToken();
   }
   private void functionDefinition(MethodDeclaration methodDecl) {
     if (astPtr == 0) {
@@ -1730,7 +1734,7 @@ public class Parser //extends PHPParserSuperclass
       getNextToken();
       if (token == TokenNameEQUAL) {
         getNextToken();
-        constant();
+        static_scalar();
       }
       return;
     }
@@ -2077,15 +2081,16 @@ public class Parser //extends PHPParserSuperclass
         getNextToken();
         expr();
         break;
-      case TokenNamenull :
-        getNextToken();
-        break;
-      case TokenNamefalse :
-        getNextToken();
-        break;
-      case TokenNametrue :
-        getNextToken();
-        break;
+      //        
+      //      case TokenNamenull :
+      //        getNextToken();
+      //        break;
+      //      case TokenNamefalse :
+      //        getNextToken();
+      //        break;
+      //      case TokenNametrue :
+      //        getNextToken();
+      //        break;
       case TokenNameStringConstant :
         getNextToken();
         break;
@@ -2193,7 +2198,7 @@ public class Parser //extends PHPParserSuperclass
         }
         break;
       case TokenNamearray :
-    //    T_ARRAY '(' array_pair_list ')'
+        //    T_ARRAY '(' array_pair_list ')'
         getNextToken();
         if (token == TokenNameLPAREN) {
           getNextToken();
@@ -2299,7 +2304,7 @@ public class Parser //extends PHPParserSuperclass
           }
           getNextToken();
           break;
-        case TokenNameCOLON_COLON :
+        case TokenNamePAAMAYIM_NEKUDOTAYIM :
         // ::
         case TokenNameMINUS_GREATER :
           // ->
@@ -2386,28 +2391,48 @@ public class Parser //extends PHPParserSuperclass
     } while (while_flag);
   }
   private void array_pair_list() {
-//  array_pair_list:
-//     /* empty */  
-//|    non_empty_array_pair_list possible_comma        
+    //  array_pair_list:
+    // /* empty */
+    //| non_empty_array_pair_list possible_comma
     non_empty_array_pair_list();
     if (token == TokenNameCOMMA) {
       getNextToken();
     }
   }
   private void non_empty_array_pair_list() {
-//non_empty_array_pair_list:
-//     non_empty_array_pair_list ',' expr T_DOUBLE_ARROW expr   
-//|    non_empty_array_pair_list ',' expr                       
-//|    expr T_DOUBLE_ARROW expr 
-//|    expr                             
-//|    non_empty_array_pair_list ',' expr T_DOUBLE_ARROW '&' w_variable 
-//|    non_empty_array_pair_list ',' '&' w_variable  
-//|    expr T_DOUBLE_ARROW '&' w_variable 
-//|    '&' w_variable                   
-  }
-  
+    //non_empty_array_pair_list:
+    // non_empty_array_pair_list ',' expr T_DOUBLE_ARROW expr
+    //| non_empty_array_pair_list ',' expr
+    //| expr T_DOUBLE_ARROW expr
+    //| expr
+    //| non_empty_array_pair_list ',' expr T_DOUBLE_ARROW '&' w_variable
+    //| non_empty_array_pair_list ',' '&' w_variable
+    //| expr T_DOUBLE_ARROW '&' w_variable
+    //| '&' w_variable
+    while (true) {
+      expr();
+      if (token == TokenNameAND) {
+        getNextToken();
+        variable();
+        return;
+      } else if (token == TokenNameEQUAL_GREATER) {
+        getNextToken();
+        if (token == TokenNameAND) {
+          getNextToken();
+          variable();
+        } else {
+          expr();
+        }
+      }
+      if (token != TokenNameCOMMA) {
+        return;
+      }
+      getNextToken();
+      if (token == TokenNameRPAREN) {
+        return;
+      }
+    }
+  }
   private void unaryExpression() {
     switch (token) {
       case TokenNamePLUS_PLUS :
@@ -2706,7 +2731,7 @@ public class Parser //extends PHPParserSuperclass
           getNextToken();
         } else if (token == TokenNameEQUAL) {
           getNextToken();
-          constant();
+          static_scalar();
         }
       } else {
         throwSyntaxError("$-variable expected in variable-list.");
@@ -2809,80 +2834,132 @@ public class Parser //extends PHPParserSuperclass
       }
     }
   }
-  /**
-   * It will look for a value (after a '=' for example) @
-   */
-  private void constant() {
-    //   String ident;
+  private boolean common_scalar() {
+    //  common_scalar:
+    // T_LNUMBER
+    // | T_DNUMBER
+    // | T_CONSTANT_ENCAPSED_STRING
+    // | T_LINE
+    // | T_FILE
+    // | T_CLASS_C
+    // | T_METHOD_C
+    // | T_FUNC_C
     switch (token) {
-      case TokenNamePLUS :
+      case TokenNameIntegerLiteral :
         getNextToken();
-        switch (token) {
-          case TokenNameDoubleLiteral :
-            getNextToken();
-            break;
-          case TokenNameIntegerLiteral :
-            getNextToken();
-            break;
-          default :
-            throwSyntaxError("Constant expected after '+' presign.");
-        }
-        break;
-      case TokenNameMINUS :
+        return true;
+      case TokenNameDoubleLiteral :
         getNextToken();
-        switch (token) {
-          case TokenNameDoubleLiteral :
-            getNextToken();
-            break;
-          case TokenNameIntegerLiteral :
-            getNextToken();
-            break;
-          default :
-            throwSyntaxError("Constant expected after '-' presign.");
-        }
-        break;
-      case TokenNamenull :
+        return true;
+      case TokenNameStringLiteral :
         getNextToken();
-        break;
-      case TokenNamefalse :
+        return true;
+      case TokenNameStringConstant :
         getNextToken();
-        break;
-      case TokenNametrue :
+        return true;
+      case TokenNameStringInterpolated :
         getNextToken();
-        break;
+        return true;
+      case TokenNameFILE :
+        getNextToken();
+        return true;
+      case TokenNameLINE :
+        getNextToken();
+        return true;
+      case TokenNameCLASS_C :
+        getNextToken();
+        return true;
+      case TokenNameMETHOD_C :
+        getNextToken();
+        return true;
+      case TokenNameFUNC_C :
+        getNextToken();
+        return true;
+    }
+    return false;
+  }
+  private void static_scalar() {
+    //    static_scalar: /* compile-time evaluated scalars */
+    //         common_scalar
+    // | T_STRING
+    // | '+' static_scalar
+    // | '-' static_scalar
+    // | T_ARRAY '(' static_array_pair_list ')'
+    // | static_class_constant
+    if (common_scalar()) {
+      return;
+    }
+    switch (token) {
       case TokenNameIdentifier :
-        //   ident = identifier;
-        char[] ident = scanner.getCurrentIdentifierSource();
         getNextToken();
-        if (token == TokenNameLPAREN) {
+        //        static_class_constant:
+        //             T_STRING T_PAAMAYIM_NEKUDOTAYIM T_STRING
+        if (token == TokenNamePAAMAYIM_NEKUDOTAYIM) {
           getNextToken();
-          if (token != TokenNameRPAREN) {
-            expressionList();
-            if (token != TokenNameRPAREN) {
-              throwSyntaxError("')' expected after identifier '"
-                  + new String(ident) + "' in postfix-expression.");
-            }
+          if (token == TokenNameIdentifier) {
+            getNextToken();
+          } else {
+            throwSyntaxError("Identifier expected after '::' operator.");
           }
-          getNextToken();
         }
         break;
-      case TokenNameStringLiteral :
+      case TokenNamePLUS :
         getNextToken();
+        static_scalar();
         break;
-      case TokenNameStringConstant :
+      case TokenNameMINUS :
         getNextToken();
+        static_scalar();
         break;
-      case TokenNameStringInterpolated :
+      case TokenNamearray :
         getNextToken();
-        break;
-      case TokenNameDoubleLiteral :
+        if (token != TokenNameLPAREN) {
+          throwSyntaxError("'(' expected after keyword 'array'");
+        }
         getNextToken();
-        break;
-      case TokenNameIntegerLiteral :
+        if (token == TokenNameRPAREN) {
+          getNextToken();
+          break;
+        }
+        non_empty_static_array_pair_list();
+        if (token != TokenNameRPAREN) {
+          throwSyntaxError("')' expected after keyword 'array'");
+        }
         getNextToken();
         break;
+      //      case TokenNamenull :
+      //        getNextToken();
+      //        break;
+      //      case TokenNamefalse :
+      //        getNextToken();
+      //        break;
+      //      case TokenNametrue :
+      //        getNextToken();
+      //        break;
       default :
-        throwSyntaxError("Constant expected.");
+        throwSyntaxError("Static scalar/constant expected.");
+    }
+  }
+  private void non_empty_static_array_pair_list() {
+    //  non_empty_static_array_pair_list:
+    // non_empty_static_array_pair_list ',' static_scalar T_DOUBLE_ARROW
+    // static_scalar
+    //| non_empty_static_array_pair_list ',' static_scalar
+    //| static_scalar T_DOUBLE_ARROW static_scalar
+    //| static_scalar
+    while (true) {
+      static_scalar();
+      if (token == TokenNameEQUAL_GREATER) {
+        getNextToken();
+        static_scalar();
+      }
+      if (token != TokenNameCOMMA) {
+        break;
+      }
+      getNextToken();
+      if (token != TokenNameRPAREN) {
+        break;
+      }
     }
   }
   public void reportSyntaxError() { //int act, int currentKind, int