improved php parser (if-statement); but a lot of things don't work yet
authorkhartlage <khartlage>
Sun, 17 Nov 2002 13:44:26 +0000 (13:44 +0000)
committerkhartlage <khartlage>
Sun, 17 Nov 2002 13:44:26 +0000 (13:44 +0000)
net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPParser.java
net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPParserAction.java
net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPKeywords.java

index e2f1dce..fd8bec2 100644 (file)
@@ -62,8 +62,10 @@ public class PHPParser extends PHPKeywords {
   final static int TT_DOTASSIGN = 48;
 
   final static int TT_SET = 49;
-
+  final static int TT_REF = 50;
   final static int TT_FOREACH = 51;
+  final static int TT_AMPERSAND = 52;
+  final static int TT_DOLLARLISTOPEN = 53;
   final static int TT_ARGOPEN = 128;
   final static int TT_ARGCLOSE = 129;
   final static int TT_LISTOPEN = 130;
@@ -97,17 +99,17 @@ public class PHPParser extends PHPKeywords {
    *@param  sess  Description of Parameter
    *@see
    */
-  public PHPParser(String s, int rowCount) {
+  public PHPParser() {
     if (keywordMap == null) {
       keywordMap = new HashMap();
       for (int i = 0; i < PHP_KEYWORS.length; i++) {
         keywordMap.put(PHP_KEYWORS[i], new Integer(PHP_KEYWORD_TOKEN[i]));
       }
     }
-    this.str = s;
+    this.str = "";
     this.token = TT_EOF;
     this.chIndx = 0;
-    this.rowCount = rowCount;
+    this.rowCount = 1;
     this.columnCount = 0;
 
     getNextToken();
@@ -127,7 +129,7 @@ public class PHPParser extends PHPKeywords {
         break;
       }
     }
-    throw new SyntaxError(rowCount, chIndx - columnCount, str.substring(columnCount + 1, eol), error);
+    throw new SyntaxError(rowCount, chIndx - columnCount + 1, str.substring(columnCount, eol), error);
   }
 
   /**
@@ -182,9 +184,7 @@ public class PHPParser extends PHPKeywords {
               chIndx++;
               // multi line comment:
               while (str.length() > chIndx) {
-                if  (str.charAt(chIndx) == '*' &&
-                      (str.length() > (chIndx+1) ) && 
-                      str.charAt(chIndx+1) == '/') {
+                if (str.charAt(chIndx) == '*' && (str.length() > (chIndx + 1)) && str.charAt(chIndx + 1) == '/') {
                   chIndx += 2;
                   break;
                 }
@@ -216,9 +216,9 @@ public class PHPParser extends PHPKeywords {
               }
             }
           }
-          if (str.length() > chIndx) {
-            chIndx++;
-          }
+          //          if (str.length() > chIndx) {
+          //            chIndx++;
+          //          }
           token = TT_INTERPOLATED_STRING;
           return;
         } else if (ch == '\'') {
@@ -233,9 +233,9 @@ public class PHPParser extends PHPKeywords {
               }
             }
           }
-          if (str.length() > chIndx) {
-            chIndx++;
-          }
+          //          if (str.length() > chIndx) {
+          //            chIndx++;
+          //          }
           token = TT_STRING_CONSTANT;
           return;
         }
@@ -362,6 +362,12 @@ public class PHPParser extends PHPKeywords {
 
                 break;
               }
+              if (str.charAt(chIndx) == '>') {
+                chIndx++;
+                token = TT_REF;
+
+                break;
+              }
             }
 
             break;
@@ -428,7 +434,8 @@ public class PHPParser extends PHPKeywords {
 
           case '|' :
             if (str.length() > chIndx) {
-              if (str.charAt(chIndx++) == '|') {
+              if (str.charAt(chIndx) == '|') {
+                chIndx++;
                 token = TT_OR;
 
                 break;
@@ -438,10 +445,15 @@ public class PHPParser extends PHPKeywords {
             break;
           case '&' :
             if (str.length() > chIndx) {
-              if (str.charAt(chIndx++) == '&') {
+              if (str.charAt(chIndx) == '&') {
+                chIndx++;
                 token = TT_AND;
 
                 break;
+              } else {
+                token = TT_AMPERSAND;
+
+                break;
               }
             }
 
@@ -477,7 +489,6 @@ public class PHPParser extends PHPKeywords {
 
   void getIdentifier() {
     StringBuffer ident = new StringBuffer();
-    ident.append(ch);
 
     ident.append(ch);
     if (ch == '$') {
@@ -491,8 +502,9 @@ public class PHPParser extends PHPKeywords {
       getChar();
     }
     identifier = ident.toString();
+    chIndx--;
 
-    Integer i = (Integer) keywordMap.get(identifier);
+    Integer i = (Integer) keywordMap.get(identifier.toLowerCase());
     if (i != null) {
       token = i.intValue();
     }
@@ -565,8 +577,7 @@ public class PHPParser extends PHPKeywords {
         }
       }
     }
-
-    // token = TT_INT_NUMBER;
+    chIndx--;
 
     try {
       if (dFlag != ' ') {
@@ -584,7 +595,15 @@ public class PHPParser extends PHPKeywords {
     }
   }
 
-  public void start() throws SyntaxError {
+  public void start(String s, int rowCount) throws SyntaxError {
+    // start up
+    this.str = s;
+    this.token = TT_EOF;
+    this.chIndx = 0;
+    this.rowCount = rowCount;
+    this.columnCount = 0;
+    getNextToken();
+
     statementList();
     if (token != TT_EOF) {
       if (token == TT_ARGCLOSE) {
@@ -597,17 +616,39 @@ public class PHPParser extends PHPKeywords {
         throwSyntaxError("too many closing ']'; end-of-file not reached");
       }
 
+      if (token == TT_ARGOPEN) {
+        throwSyntaxError("read character '('; end-of-file not reached");
+      }
+      if (token == TT_LISTOPEN) {
+        throwSyntaxError("read character '{';  end-of-file not reached");
+      }
+      if (token == TT_PARTOPEN) {
+        throwSyntaxError("read character '[';  end-of-file not reached");
+      }
+
       throwSyntaxError("end-of-file not reached");
     }
 
   }
 
   public void statementList() {
-    statement();
+    do {
+      statement();
+      if ((token == TT_LISTCLOSE)
+        || (token == TT_elseif)
+        || (token == TT_endif)
+        || (token == TT_endfor)
+        || (token == TT_endforeach)
+        || (token == TT_endwhile)
+        || (token == TT_endswitch)
+        || (token == TT_EOF)) {
+        return;
+      }
+    } while (true);
   }
 
   public void statement() {
-    while (token != TT_UNDEFINED) {
+    while (token != TT_UNDEFINED && token != TT_EOF) {
       if (token > TT_KEYWORD) {
         if (token == TT_case) {
           getNextToken();
@@ -639,7 +680,8 @@ public class PHPParser extends PHPKeywords {
           return;
         } else if (token == TT_require || token == TT_require_once) {
           getNextToken();
-          constant();
+          //constant();
+          expression();
           if (token == TT_SEMICOLON) {
             getNextToken();
           } else {
@@ -859,22 +901,26 @@ public class PHPParser extends PHPKeywords {
 
         }
 
-      } else {
-        if (token == TT_LISTOPEN) {
-          getNextToken();
+      } else if (token == TT_LISTOPEN) {
+        // compundStatement
+        getNextToken();
+        if (token != TT_LISTCLOSE) {
           statementList();
-          if (token == TT_LISTCLOSE) {
-            getNextToken();
-          } else {
-            throwSyntaxError("'}' expected.");
-          }
         }
-      }
-      expression();
-      if (token == TT_SEMICOLON) {
-        getNextToken();
+        if (token == TT_LISTCLOSE) {
+          getNextToken();
+        } else {
+          throwSyntaxError("'}' expected.");
+        }
       } else {
-        throwSyntaxError("';' expected after expression.");
+        if (token != TT_SEMICOLON) {
+          expression();
+        }
+        if (token == TT_SEMICOLON) {
+          getNextToken();
+        } else {
+          throwSyntaxError("';' expected after expression.");
+        }
       }
     }
   }
@@ -888,8 +934,8 @@ public class PHPParser extends PHPKeywords {
   public void inclusionStatement() {
   }
 
-  public void compoundStatement() {
-  }
+  //  public void compoundStatement() {
+  //  }
 
   public void selectionStatement() {
   }
@@ -913,6 +959,12 @@ public class PHPParser extends PHPKeywords {
   }
 
   public void ifStatement() {
+    // statement [else-statement]
+    statement();
+    if (token == TT_else) {
+      getNextToken();
+      statement();
+    }
   }
 
   public void switchStatement() {
@@ -966,7 +1018,79 @@ public class PHPParser extends PHPKeywords {
   }
 
   public void postfixExpression() {
+    switch (token) {
+      case TT_ARGOPEN :
+        getNextToken();
+        expression();
+        if (token != TT_ARGCLOSE) {
+          throwSyntaxError(") expected in postfix-expression.");
+        }
+        getNextToken();
+        break;
+      case TT_DOUBLE_NUMBER :
+        getNextToken();
+        break;
+      case TT_INT_NUMBER :
+        getNextToken();
+        break;
+      case TT_VARIABLE :
+        getNextToken();
+        break;
+      case TT_IDENTIFIER :
+        getNextToken();
+        if (token == TT_ARGOPEN) {
+          getNextToken();
+          if (token != TT_ARGCLOSE) {
+            expressionList();
+            if (token != TT_ARGCLOSE) {
+              throwSyntaxError(") expected after identifier in postfix-expression.");
+            }
+          }
+          getNextToken();
+        }
+        break;
 
+    }
+    boolean while_flag = true;
+    do {
+      switch (token) {
+        case TT_PARTOPEN :
+          getNextToken();
+          expression();
+          if (token != TT_PARTCLOSE) {
+            throwSyntaxError("] expected in postfix-expression.");
+          }
+          getNextToken();
+          break;
+        case TT_REF :
+          switch (token) {
+            case TT_VARIABLE :
+              getNextToken();
+              break;
+            case TT_IDENTIFIER :
+              getNextToken();
+              break;
+            case TT_LISTOPEN :
+              getNextToken();
+              expression();
+              if (token != TT_LISTCLOSE) {
+                throwSyntaxError("] expected in postfix-expression.");
+              }
+              getNextToken();
+              break;
+            default :
+              throwSyntaxError("Syntax error after '->' token.");
+          }
+        case TT_INCREMENT :
+          getNextToken();
+          break;
+        case TT_DECREMENT :
+          getNextToken();
+          break;
+        default :
+          while_flag = false;
+      }
+    } while (while_flag);
   }
 
   public void variableList() {
@@ -991,4 +1115,5 @@ public class PHPParser extends PHPKeywords {
   public void constant() {
 
   }
+
 }
\ No newline at end of file
index a5ae10a..6882db1 100644 (file)
@@ -286,8 +286,8 @@ public class PHPParserAction extends TextEditorAction {
               phpMode = false;
               //             phpList.add(input.substring(startIndex, i-2));
               try {
-                PHPParser parser = new PHPParser(input.substring(startIndex, i - 2), startLineNumber);
-                parser.start();
+                PHPParser parser = new PHPParser();
+                parser.start(input.substring(startIndex, i - 2), startLineNumber);
               } catch (SyntaxError err) {
                 setMarker(err.getMessage(), err.getLine());
               }
index 9d33fef..f4f7ddd 100644 (file)
@@ -52,7 +52,7 @@ public class PHPKeywords {
       "extends",
       "empty",
       "array",
-      "isset",
+   //   "isset",
       "echo",
       "var",
       "as",
@@ -94,7 +94,7 @@ public class PHPKeywords {
   public final static int TT_extends = 1029;
   public final static int TT_empty = 1030;
   public final static int TT_array = 1031;
-  public final static int TT_isset = 1032;
+ // public final static int TT_isset = 1032;
   public final static int TT_echo = 1033;
   public final static int TT_var = 1034;
   public final static int TT_as = 1035;
@@ -137,7 +137,7 @@ public class PHPKeywords {
     TT_extends,
     TT_empty,
     TT_array,
-    TT_isset,
+ //   TT_isset,
     TT_echo,
     TT_var,
     TT_as,