imporved php parser
authorkhartlage <khartlage>
Fri, 22 Nov 2002 22:01:42 +0000 (22:01 +0000)
committerkhartlage <khartlage>
Fri, 22 Nov 2002 22:01:42 +0000 (22:01 +0000)
net.sourceforge.phpeclipse/src/junit/sourceforge/phpeclipse/PHPParserTestCase.java
net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/PHPEclipsePreferencePage.java
net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/PHPeclipsePlugin.java
net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/actions/PHPStartApacheAction.java
net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPParser.java
net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPKeywords.java
net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/views/PHPConsole.java

index 1eecdec..c0a677c 100644 (file)
@@ -26,14 +26,29 @@ public class PHPParserTestCase extends TestCase {
    *  Test the PHP Parser with different PHP snippets
    */
   public void testPHPParser() {
-    check("if (isset($test)) { }");
+    check("if (isset($test)) { } elseif (isset($lang)) { }");
     check("require_once(\"mainfile.php\");  ");
-    check("if (eregi(\"footer.php\",$PHP_SELF)) {\n" + 
-          "Header(\"Location: index.php\");\n" + 
-          "die();\n" + 
-          "}\n");
-
+    check("if (eregi(\"footer.php\",$PHP_SELF)) {\n" + "Header(\"Location: index.php\");\n" + "die();\n" + "}\n");
+    check("while (eregi(\"footer.php\",$PHP_SELF)) {\n" + "Header(\"Location: index.php\");\n" + "die();\n" + "}\n");
+    check("while (eregi(\"footer.php\",$PHP_SELF)) :\n" + "Header(\"Location: index.php\");\n" + "die();\n" + "endwhile;\n");
+    check("$tipath = \"images/topics/\";");
+    check("$reasons = array(\"1\", \"2\",\"test\");");
+    check("if ($home == 1) { message_box(); blocks(Center);}");
+    check("$bresult = sql_query(\"select * from \".$prefix.\"_banner WHERE type='0' AND active='1'\", $dbi);");
+    check("switch($func) {\n case \"f1\":\n f1();\n break; \n default: \n f0(); \n break;\n }");
+    check("list ($catid) = sql_fetch_row($result, $dbi);");
+    check("if (!$name) { \n }");
+    check("mt_srand((double)microtime()*1000000);");
+    check("\"\\\"\";");
+    check("$alttext = ereg_replace(\"\\\"\", \"\", $alttext);");
+    check("$message .= \"\"._THISISAUTOMATED.\"\\n\\n\";");
+    check("if (!empty($pass) AND $pass==$passwd) { }");
+    check("$AllowableHTML = array(\"b\"=>1,\n \"i\"=>1);");
+    check("if ($term{0}!=$firstChar) {}");
+    check("echo \"<center><b>\"._NOADMINYET.\"</b></center><br><br>\"\n"
+    + ".\"<form action=\\\"admin.php\\\" method=\\\"post\\\">\"\n"
+    + ".\"<tr><td><b>\"._NICKNAME.\":</b></td><td><input type=\\\"text\\\" name=\\\"name\\\" size=\\\"30\\\" maxlength=\\\"25\\\"></td></tr>\"\n"
+    +";");
   }
 
   public void check(String strEval) {
index b0c494c..065a53d 100644 (file)
@@ -25,57 +25,58 @@ import org.eclipse.ui.IWorkbenchPreferencePage;
  */
 public class PHPEclipsePreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage {
 
-       public PHPEclipsePreferencePage() {
-               super(FieldEditorPreferencePage.GRID);
-               //Initialize the preference store we wish to use
-               setPreferenceStore(PHPeclipsePlugin.getDefault().getPreferenceStore());
-       }
+  public PHPEclipsePreferencePage() {
+    super(FieldEditorPreferencePage.GRID);
+    //Initialize the preference store we wish to use
+    setPreferenceStore(PHPeclipsePlugin.getDefault().getPreferenceStore());
+  }
 
-       protected void createFieldEditors() {
-               final IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore();
+  protected void createFieldEditors() {
+    final IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore();
 
-               StringFieldEditor localhost = new StringFieldEditor(PHPeclipsePlugin.LOCALHOST_PREF, "&Localhost:", 60, getFieldEditorParent());
+    StringFieldEditor localhost = new StringFieldEditor(PHPeclipsePlugin.LOCALHOST_PREF, "&Localhost:", 60, getFieldEditorParent());
 
-               DirectoryFieldEditor documentRoot =
-                       new DirectoryFieldEditor(PHPeclipsePlugin.DOCUMENTROOT_PREF, "&DocumentRoot:", getFieldEditorParent());
+    DirectoryFieldEditor documentRoot =
+      new DirectoryFieldEditor(PHPeclipsePlugin.DOCUMENTROOT_PREF, "&DocumentRoot:", getFieldEditorParent());
 
-               BooleanFieldEditor useExternalBrowser =
-                       new BooleanFieldEditor(PHPeclipsePlugin.USE_EXTERNAL_BROWSER_PREF, "&Use External Browser", getFieldEditorParent());
+    BooleanFieldEditor useExternalBrowser =
+      new BooleanFieldEditor(PHPeclipsePlugin.USE_EXTERNAL_BROWSER_PREF, "&Use External Browser", getFieldEditorParent());
 
-               StringFieldEditor externalBrowser =
-                       new StringFieldEditor(PHPeclipsePlugin.EXTERNAL_BROWSER_PREF, "&External Browser command:", 60, getFieldEditorParent());
+    StringFieldEditor externalBrowser =
+      new StringFieldEditor(PHPeclipsePlugin.EXTERNAL_BROWSER_PREF, "&External Browser command:", 60, getFieldEditorParent());
 
-               StringFieldEditor startMySQL =
-                       new StringFieldEditor(PHPeclipsePlugin.MYSQL_PREF, "&MySQL command:", 60, getFieldEditorParent());
+    StringFieldEditor startMySQL =
+      new StringFieldEditor(PHPeclipsePlugin.MYSQL_PREF, "&MySQL command:", 60, getFieldEditorParent());
 
+    StringFieldEditor startApache =
+      new StringFieldEditor(PHPeclipsePlugin.APACHE_START_PREF, "Start &Apache command:", 60, getFieldEditorParent());
 
-               StringFieldEditor startApache =
-                       new StringFieldEditor(PHPeclipsePlugin.APACHE_START_PREF, "Start &Apache command:", 60, getFieldEditorParent());
+    StringFieldEditor stopApache =
+      new StringFieldEditor(PHPeclipsePlugin.APACHE_STOP_PREF, "&Stop Apache command:", 60, getFieldEditorParent());
 
+    StringFieldEditor restartApache =
+      new StringFieldEditor(PHPeclipsePlugin.APACHE_RESTART_PREF, "&Restart Apache command:", 60, getFieldEditorParent());
 
-               StringFieldEditor stopApache = 
-                       new StringFieldEditor(PHPeclipsePlugin.APACHE_STOP_PREF, "&Stop Apache command:", 60, getFieldEditorParent());
+    StringFieldEditor externalParser =
+      new StringFieldEditor(PHPeclipsePlugin.EXTERNAL_PARSER_PREF, "&External Parser command:", 60, getFieldEditorParent());
 
-    
-               StringFieldEditor restartApache =
-                       new StringFieldEditor(PHPeclipsePlugin.APACHE_RESTART_PREF, "&Restart Apache command:", 60, getFieldEditorParent());
+    addField(localhost);
+    addField(documentRoot);
+    addField(useExternalBrowser);
+    addField(externalBrowser);
+    addField(startMySQL);
+    addField(startApache);
 
+    addField(stopApache);
+    addField(restartApache);
     
-               addField(localhost);
-               addField(documentRoot);
-               addField(useExternalBrowser);
-               addField(externalBrowser);
-               addField(startMySQL);
-               addField(startApache);
-
-               addField(stopApache);
-               addField(restartApache);
-       }
-
-       /**
-        * @see IWorkbenchPreferencePage#init
-        */
-       public void init(IWorkbench workbench) {
-       }
+    addField(externalParser);
+  }
+
+  /**
+   * @see IWorkbenchPreferencePage#init
+   */
+  public void init(IWorkbench workbench) {
+  }
 
 }
index 5e95d2e..23d818c 100644 (file)
@@ -44,6 +44,8 @@ public class PHPeclipsePlugin extends AbstractUIPlugin {
        public static final String APACHE_STOP_PREF = "_apache_stop";
        public static final String APACHE_RESTART_PREF = "_apache_restart";
   public static final String SHOW_OUTPUT_IN_CONSOLE = "_sho_output_in_console";
+  public static final String EXTERNAL_PARSER_PREF = "_external_parser";
+  
   /**
    * The id of the PHP plugin (value <code>"net.sourceforge.phpeclipse"</code>).
    */ 
@@ -231,17 +233,20 @@ public class PHPeclipsePlugin extends AbstractUIPlugin {
                        store.setDefault(EXTERNAL_BROWSER_PREF, "netscape {0}");
                }
                if ((jvm == WINDOWS_9x) || (jvm == WINDOWS_NT)) {
+      store.setDefault(EXTERNAL_PARSER_PREF, "c:\\apache\\php\\php -l -f {0}");
       store.setDefault(DOCUMENTROOT_PREF, "c:\\eclipse\\workspace");
                        store.setDefault(MYSQL_PREF, "c:\\apache\\mysql\\bin\\mysqld.exe --standalone");
                        store.setDefault(APACHE_START_PREF, "c:\\apache\\apache.exe -c \"DocumentRoot \"{0}\"\"");
                        store.setDefault(APACHE_STOP_PREF, "c:\\apache\\apache.exe -k shutdown");
                        store.setDefault(APACHE_RESTART_PREF, "c:\\apache\\apache.exe -k restart");
                } else {
+      store.setDefault(EXTERNAL_PARSER_PREF, "/apache/php/php -l -f {0}");
       store.setDefault(DOCUMENTROOT_PREF, "/eclipse/workspace");
                        store.setDefault(MYSQL_PREF, "/apache/mysql/bin/mysqld --standalone");
                        store.setDefault(APACHE_START_PREF, "/apache/apache -c \"DocumentRoot \"{0}\"\"");
                        store.setDefault(APACHE_STOP_PREF, "/apache/apache.exe -k shutdown");
                        store.setDefault(APACHE_RESTART_PREF, "/apache/apache -k restart");
+      
                }
        }
 }
\ No newline at end of file
index 8a6b5e2..3f1839a 100644 (file)
@@ -43,7 +43,7 @@ public class PHPStartApacheAction implements IWorkbenchWindowActionDelegate {
     execute(form.format(arguments), "Start Apache: ");
   }
 
-  public void execute(String command, String consoleMessage) {
+  public static String execute(String command, String consoleMessage) {
     //         MessageDialog.openInformation(activeWindow.getShell(), "Exec command: ", command);
     try {
       PHPConsole.write(consoleMessage+command+"\n");
@@ -55,23 +55,20 @@ public class PHPStartApacheAction implements IWorkbenchWindowActionDelegate {
       // gets the input stream to have the post-compile-time information
       InputStream stream = p.getInputStream();
 
-      // and get the string from it
-      String compilerOutput = PHPConsole.getStringFromStream(stream);
+      // get the string from Stream
+      String consoleOutput = PHPConsole.getStringFromStream(stream);
 
       // prints out the information
-      PHPConsole.write(compilerOutput);
-
-      // parse the buffer to find the errors and create markers
-    //  createMarkers(compilerOutput, fileToCompile);
+      PHPConsole.write(consoleOutput);
+      return consoleOutput;
 
     } catch (IOException e) {
-      // @todo should throw the exception again
+     
       System.err.println("Problem");
       e.printStackTrace();
-//    } catch (CoreException e) {
-//      e.printStackTrace();
-//      // @todo do something here !
+
     }
+    return "";
   }
 
   public void selectionChanged(IAction action, ISelection selection) {
index fd8bec2..5848e7d 100644 (file)
@@ -42,10 +42,11 @@ public class PHPParser extends PHPKeywords {
   final static int TT_EOF = 0;
   final static int TT_UNDEFINED = 1;
 
+  final static int TT_MOD = 30;
   final static int TT_NOT = 31;
   final static int TT_DOT = 32;
   final static int TT_POW = 33;
-  final static int TT_DIVIDE = 34;
+  final static int TT_DIV = 34;
   final static int TT_MULTIPLY = 35;
   final static int TT_SUBTRACT = 36;
   final static int TT_ADD = 37;
@@ -66,6 +67,8 @@ public class PHPParser extends PHPKeywords {
   final static int TT_FOREACH = 51;
   final static int TT_AMPERSAND = 52;
   final static int TT_DOLLARLISTOPEN = 53;
+  final static int TT_TILDE = 54;
+
   final static int TT_ARGOPEN = 128;
   final static int TT_ARGCLOSE = 129;
   final static int TT_LISTOPEN = 130;
@@ -73,7 +76,7 @@ public class PHPParser extends PHPKeywords {
   final static int TT_PARTOPEN = 132;
   final static int TT_PARTCLOSE = 133;
   final static int TT_COMMA = 134;
-  final static int TT_PERCENT = 135;
+
   final static int TT_STRING = 136;
   final static int TT_IDENTIFIER = 138;
   final static int TT_DIGIT = 139;
@@ -91,6 +94,12 @@ public class PHPParser extends PHPKeywords {
   final static int TT_DOUBLE_NUMBER = 152;
   final static int TT_INTERPOLATED_STRING = 153;
   final static int TT_STRING_CONSTANT = 154;
+
+  final static int TT_LSHIFT = 155;
+  final static int TT_RSHIFT = 156;
+  final static int TT_EX_EQUAL = 157;
+  final static int TT_EX_UNEQUAL = 158;
+  final static int TT_LINE = 159;
   //  final static int TT_AT = 153; // @
   /**
    *  Class Constructor.
@@ -201,41 +210,50 @@ public class PHPParser extends PHPKeywords {
           continue;
         } else if (ch == '"') {
           // read string until end
-          while ((str.length() > chIndx) && (str.charAt(chIndx++) != '"')) {
-            if (str.charAt(chIndx) == '\\') {
+          boolean openString = true;
+          while (str.length() > chIndx) {
+            ch = str.charAt(chIndx++);
+            if (ch == '\\') {
               if (str.length() > chIndx) {
-                chIndx++;
-              }
-              if (str.length() > chIndx) {
-                chIndx++;
+                ch = str.charAt(chIndx++);
               }
+            } else if (ch == '"') {
+              openString = false;
+              break;
             } else {
-              if (str.charAt(chIndx) == '\n') {
+              if (ch == '\n') {
                 rowCount++;
                 columnCount = chIndx;
               }
             }
           }
-          //          if (str.length() > chIndx) {
-          //            chIndx++;
-          //          }
+          if (openString) {
+            throwSyntaxError("Open string character '\"' at end of file.");
+          }
           token = TT_INTERPOLATED_STRING;
           return;
         } else if (ch == '\'') {
           // read string until end
-          while ((str.length() > chIndx) && (str.charAt(chIndx++) != '\'')) {
-            if (str.charAt(chIndx) == '\\') {
+          boolean openString = true;
+          while (str.length() > chIndx) {
+            ch = str.charAt(chIndx++);
+            if (ch == '\\') {
               if (str.length() > chIndx) {
-                chIndx++;
+                ch = str.charAt(chIndx++);
               }
-              if (str.length() > chIndx) {
-                chIndx++;
+            } else if (ch == '\'') {
+              openString = false;
+              break;
+            } else {
+              if (ch == '\n') {
+                rowCount++;
+                columnCount = chIndx;
               }
             }
           }
-          //          if (str.length() > chIndx) {
-          //            chIndx++;
-          //          }
+          if (openString) {
+            throwSyntaxError("Open string character \"'\" at end of file.");
+          }
           token = TT_STRING_CONSTANT;
           return;
         }
@@ -270,7 +288,10 @@ public class PHPParser extends PHPKeywords {
             token = TT_COMMA;
 
             break;
+          case '~' :
+            token = TT_TILDE;
 
+            break;
           case '.' :
             token = TT_DOT;
             if (str.length() > chIndx) {
@@ -288,7 +309,7 @@ public class PHPParser extends PHPKeywords {
 
             break;
           case '%' :
-            token = TT_PERCENT;
+            token = TT_MOD;
 
             break;
           case ';' :
@@ -300,7 +321,7 @@ public class PHPParser extends PHPKeywords {
 
             break;
           case '/' :
-            token = TT_DIVIDE;
+            token = TT_DIV;
 
             if (str.length() > chIndx) {
               if (str.charAt(chIndx) == '=') {
@@ -380,7 +401,14 @@ public class PHPParser extends PHPKeywords {
               if (ch == '=') {
                 chIndx++;
                 token = TT_EQUAL;
+                if (str.length() > chIndx) {
+                  ch = str.charAt(chIndx);
 
+                  if (ch == '=') {
+                    chIndx++;
+                    token = TT_EX_EQUAL;
+                  }
+                }
                 break;
               }
               if (ch == '>') {
@@ -399,7 +427,14 @@ public class PHPParser extends PHPKeywords {
               if (str.charAt(chIndx) == '=') {
                 chIndx++;
                 token = TT_UNEQUAL;
+                if (str.length() > chIndx) {
+                  ch = str.charAt(chIndx);
 
+                  if (ch == '=') {
+                    chIndx++;
+                    token = TT_EX_UNEQUAL;
+                  }
+                }
                 break;
               }
             }
@@ -415,6 +450,12 @@ public class PHPParser extends PHPKeywords {
 
                 break;
               }
+              if (str.charAt(chIndx) == '>') {
+                chIndx++;
+                token = TT_RSHIFT;
+
+                break;
+              }
             }
 
             break;
@@ -428,11 +469,19 @@ public class PHPParser extends PHPKeywords {
 
                 break;
               }
+              if (str.charAt(chIndx) == '<') {
+                chIndx++;
+                token = TT_LSHIFT;
+
+                break;
+              }
             }
 
             break;
 
           case '|' :
+            token = TT_LINE;
+
             if (str.length() > chIndx) {
               if (str.charAt(chIndx) == '|') {
                 chIndx++;
@@ -497,7 +546,7 @@ public class PHPParser extends PHPKeywords {
       token = TT_IDENTIFIER;
     }
     getChar();
-    while ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || (ch >= '_')) {
+    while ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || (ch == '_')) {
       ident.append(ch);
       getChar();
     }
@@ -635,6 +684,8 @@ public class PHPParser extends PHPKeywords {
     do {
       statement();
       if ((token == TT_LISTCLOSE)
+        || (token == TT_case)
+        || (token == TT_default)
         || (token == TT_elseif)
         || (token == TT_endif)
         || (token == TT_endfor)
@@ -647,336 +698,599 @@ public class PHPParser extends PHPKeywords {
     } while (true);
   }
 
+  public void compoundStatement() {
+    // '{' [statement-list] '}'
+    if (token == TT_LISTOPEN) {
+      getNextToken();
+    } else {
+      throwSyntaxError("'{' expected in compound-statement.");
+    }
+    if (token != TT_LISTCLOSE) {
+      statementList();
+    }
+    if (token == TT_LISTCLOSE) {
+      getNextToken();
+    } else {
+      throwSyntaxError("'}' expected in compound-statement.");
+    }
+  }
+
   public void statement() {
-    while (token != TT_UNDEFINED && token != TT_EOF) {
-      if (token > TT_KEYWORD) {
-        if (token == TT_case) {
+    if (token > TT_KEYWORD && token != TT_list) {
+      String keyword = identifier;
+      if (token == TT_include || token == TT_include_once) {
+        getNextToken();
+        expression();
+        if (token == TT_SEMICOLON) {
           getNextToken();
-          constant();
-          if (token == TT_DDOT) {
-            getNextToken();
-            statement();
-          } else {
-            throwSyntaxError("':' character after 'case' constant expected.");
-          }
-          return;
-        } else if (token == TT_default) {
+        } else {
+          throwSyntaxError("';' character after 'include' or 'include_once' expected.");
+        }
+        return;
+      } else if (token == TT_require || token == TT_require_once) {
+        getNextToken();
+        //constant();
+        expression();
+        if (token == TT_SEMICOLON) {
           getNextToken();
-          if (token == TT_DDOT) {
-            getNextToken();
-            statement();
-          } else {
-            throwSyntaxError("':' character after 'default' expected.");
-          }
-          return;
-        } else if (token == TT_include || token == TT_include_once) {
+        } else {
+          throwSyntaxError("';' character after 'require' or 'require_once' expected.");
+        }
+        return;
+      } else if (token == TT_if) {
+        getNextToken();
+        if (token == TT_ARGOPEN) {
+          getNextToken();
+        } else {
+          throwSyntaxError("'(' expected after 'if' keyword.");
+        }
+        expression();
+        if (token == TT_ARGCLOSE) {
+          getNextToken();
+        } else {
+          throwSyntaxError("')' expected after 'if' condition.");
+        }
+        ifStatement();
+        return;
+
+      } else if (token == TT_switch) {
+        getNextToken();
+        if (token == TT_ARGOPEN) {
+          getNextToken();
+        } else {
+          throwSyntaxError("'(' expected after 'switch' keyword.");
+        }
+        expression();
+        if (token == TT_ARGCLOSE) {
+          getNextToken();
+        } else {
+          throwSyntaxError("')' expected after 'switch' condition.");
+        }
+        switchStatement();
+        return;
+      } else if (token == TT_for) {
+        getNextToken();
+        if (token == TT_ARGOPEN) {
           getNextToken();
+        } else {
+          throwSyntaxError("'(' expected after 'for' keyword.");
+        }
+        if (token == TT_SEMICOLON) {
+          getNextToken();
+        } else {
           expression();
           if (token == TT_SEMICOLON) {
             getNextToken();
           } else {
-            throwSyntaxError("';' character after 'include' or 'include_once' expected.");
+            throwSyntaxError("';' character after 'for' expected.");
           }
-          return;
-        } else if (token == TT_require || token == TT_require_once) {
+        }
+        if (token == TT_SEMICOLON) {
           getNextToken();
-          //constant();
+        } else {
           expression();
           if (token == TT_SEMICOLON) {
             getNextToken();
           } else {
-            throwSyntaxError("';' character after 'require' or 'require_once' expected.");
+            throwSyntaxError("';' character after 'for' expected.");
           }
-          return;
-        } else if (token == TT_if) {
+        }
+        if (token == TT_ARGCLOSE) {
           getNextToken();
-          if (token == TT_ARGOPEN) {
-            getNextToken();
-          } else {
-            throwSyntaxError("'(' expected after 'if' keyword.");
-          }
+        } else {
           expression();
           if (token == TT_ARGCLOSE) {
             getNextToken();
           } else {
-            throwSyntaxError("')' expected after 'if' condition.");
+            throwSyntaxError("')' expected after 'for' condition.");
           }
-          ifStatement();
-          return;
-
-        } else if (token == TT_switch) {
+        }
+        forStatement();
+        return;
+      } else if (token == TT_while) {
+        getNextToken();
+        if (token == TT_ARGOPEN) {
           getNextToken();
-          if (token == TT_ARGOPEN) {
-            getNextToken();
-          } else {
-            throwSyntaxError("'(' expected after 'switch' keyword.");
-          }
-          expression();
-          if (token == TT_ARGCLOSE) {
-            getNextToken();
-          } else {
-            throwSyntaxError("')' expected after 'switch' condition.");
-          }
-          switchStatement();
-          return;
-        } else if (token == TT_for) {
+        } else {
+          throwSyntaxError("'(' expected after 'while' keyword.");
+        }
+        expression();
+        if (token == TT_ARGCLOSE) {
           getNextToken();
-          if (token == TT_ARGOPEN) {
-            getNextToken();
-          } else {
-            throwSyntaxError("'(' expected after 'for' keyword.");
-          }
-          if (token == TT_SEMICOLON) {
-            getNextToken();
-          } else {
-            expression();
-            if (token == TT_SEMICOLON) {
-              getNextToken();
-            } else {
-              throwSyntaxError("';' character after 'for' expected.");
-            }
-          }
-          if (token == TT_SEMICOLON) {
-            getNextToken();
-          } else {
-            expression();
-            if (token == TT_SEMICOLON) {
-              getNextToken();
-            } else {
-              throwSyntaxError("';' character after 'for' expected.");
-            }
-          }
-          if (token == TT_ARGCLOSE) {
-            getNextToken();
-          } else {
-            expression();
-            if (token == TT_ARGCLOSE) {
-              getNextToken();
-            } else {
-              throwSyntaxError("')' expected after 'for' condition.");
-            }
-          }
-          forStatement();
-          return;
-        } else if (token == TT_while) {
+        } else {
+          throwSyntaxError("')' expected after 'while' condition.");
+        }
+        whileStatement();
+        return;
+      } else if (token == TT_foreach) {
+        getNextToken();
+        if (token == TT_ARGOPEN) {
           getNextToken();
-          if (token == TT_ARGOPEN) {
-            getNextToken();
-          } else {
-            throwSyntaxError("'(' expected after 'while' keyword.");
-          }
-          expression();
-          if (token == TT_ARGCLOSE) {
-            getNextToken();
-          } else {
-            throwSyntaxError("')' expected after 'while' condition.");
-          }
-          whileStatement();
-          return;
-        } else if (token == TT_foreach) {
+        } else {
+          throwSyntaxError("'(' expected after 'foreach' keyword.");
+        }
+        expression();
+        if (token == TT_as) {
+          getNextToken();
+        } else {
+          throwSyntaxError("'as' expected after 'foreach' exxpression.");
+        }
+        variable();
+        if (token == TT_FOREACH) {
           getNextToken();
-          if (token == TT_ARGOPEN) {
-            getNextToken();
-          } else {
-            throwSyntaxError("'(' expected after 'foreach' keyword.");
-          }
-          expression();
-          if (token == TT_as) {
-            getNextToken();
-          } else {
-            throwSyntaxError("'as' expected after 'foreach' exxpression.");
-          }
           variable();
-          if (token == TT_FOREACH) {
-            getNextToken();
-            variable();
-          }
-          if (token == TT_ARGCLOSE) {
-            getNextToken();
-          } else {
-            throwSyntaxError("')' expected after 'foreach' expression.");
-          }
-          foreachStatement();
-          return;
-
-        } else if (token == TT_continue || token == TT_break || token == TT_return) {
+        }
+        if (token == TT_ARGCLOSE) {
           getNextToken();
-          if (token != TT_SEMICOLON) {
-            expression();
-          }
-          if (token == TT_SEMICOLON) {
-            getNextToken();
-          } else {
-            throwSyntaxError("';' expected after 'continue', 'break' or 'return'.");
-          }
-          return;
+        } else {
+          throwSyntaxError("')' expected after 'foreach' expression.");
+        }
+        foreachStatement();
+        return;
 
-        } else if (token == TT_echo) {
+      } else if (token == TT_continue || token == TT_break || token == TT_return) {
+        getNextToken();
+        if (token != TT_SEMICOLON) {
+          expression();
+        }
+        if (token == TT_SEMICOLON) {
           getNextToken();
-          expressionList();
-          if (token == TT_SEMICOLON) {
-            getNextToken();
-          } else {
-            throwSyntaxError("';' expected after 'echo' statement.");
-          }
-          return;
+        } else {
+          throwSyntaxError("';' expected after 'continue', 'break' or 'return'.");
+        }
+        return;
 
-        } else if (token == TT_print) {
+      } else if (token == TT_echo) {
+        getNextToken();
+        expressionList();
+        if (token == TT_SEMICOLON) {
           getNextToken();
-          expression();
-          if (token == TT_SEMICOLON) {
-            getNextToken();
-          } else {
-            throwSyntaxError("';' expected after 'print' statement.");
-          }
-          return;
+        } else {
+          throwSyntaxError("';' expected after 'echo' statement.");
+        }
+        return;
 
-        } else if (token == TT_global || token == TT_static) {
+      } else if (token == TT_print) {
+        getNextToken();
+        expression();
+        if (token == TT_SEMICOLON) {
           getNextToken();
-          variableList();
-          if (token == TT_SEMICOLON) {
-            getNextToken();
-          } else {
-            throwSyntaxError("';' expected after 'global' or 'static' statement.");
-          }
-          return;
+        } else {
+          throwSyntaxError("';' expected after 'print' statement.");
+        }
+        return;
 
-        } else if (token == TT_unset) {
+      } else if (token == TT_global || token == TT_static) {
+        getNextToken();
+        variableList();
+        if (token == TT_SEMICOLON) {
           getNextToken();
-          if (token == TT_ARGOPEN) {
-            getNextToken();
-          } else {
-            throwSyntaxError("'(' expected after 'unset' keyword.");
-          }
-          variableList();
-          if (token == TT_ARGCLOSE) {
-            getNextToken();
-          } else {
-            throwSyntaxError("')' expected after 'unset' statement.");
-          }
-          if (token == TT_SEMICOLON) {
-            getNextToken();
-          } else {
-            throwSyntaxError("';' expected after 'unset' statement.");
-          }
-          return;
+        } else {
+          throwSyntaxError("';' expected after 'global' or 'static' statement.");
+        }
+        return;
 
-        } else if (token == TT_exit || token == TT_die) {
+      } else if (token == TT_unset) {
+        getNextToken();
+        if (token == TT_ARGOPEN) {
           getNextToken();
-          if (token != TT_SEMICOLON) {
-            exitStatus();
-          }
-          if (token == TT_SEMICOLON) {
-            getNextToken();
-          } else {
-            throwSyntaxError("';' expected after 'exit' or 'die' statement.");
-          }
-          return;
-
-        } else if (token == TT_define) {
+        } else {
+          throwSyntaxError("'(' expected after 'unset' keyword.");
+        }
+        variableList();
+        if (token == TT_ARGCLOSE) {
           getNextToken();
-          if (token == TT_ARGOPEN) {
-            getNextToken();
-          } else {
-            throwSyntaxError("'(' expected after 'define' keyword.");
-          }
-          constant();
-          if (token == TT_COMMA) {
-            getNextToken();
-          } else {
-            throwSyntaxError("',' expected after first 'define' constant.");
-          }
-          constant();
-          if (token == TT_ARGCLOSE) {
-            getNextToken();
-          } else {
-            throwSyntaxError("')' expected after 'define' statement.");
-          }
-          if (token == TT_SEMICOLON) {
-            getNextToken();
-          } else {
-            throwSyntaxError("';' expected after 'define' statement.");
-          }
-          return;
+        } else {
+          throwSyntaxError("')' expected after 'unset' statement.");
+        }
+        if (token == TT_SEMICOLON) {
+          getNextToken();
+        } else {
+          throwSyntaxError("';' expected after 'unset' statement.");
+        }
+        return;
 
+      } else if (token == TT_exit || token == TT_die) {
+        getNextToken();
+        if (token != TT_SEMICOLON) {
+          exitStatus();
+        }
+        if (token == TT_SEMICOLON) {
+          getNextToken();
+        } else {
+          throwSyntaxError("';' expected after 'exit' or 'die' statement.");
         }
+        return;
 
-      } else if (token == TT_LISTOPEN) {
-        // compundStatement
+      } else if (token == TT_define) {
         getNextToken();
-        if (token != TT_LISTCLOSE) {
-          statementList();
+        if (token == TT_ARGOPEN) {
+          getNextToken();
+        } else {
+          throwSyntaxError("'(' expected after 'define' keyword.");
         }
-        if (token == TT_LISTCLOSE) {
+        constant();
+        if (token == TT_COMMA) {
           getNextToken();
         } else {
-          throwSyntaxError("'}' expected.");
+          throwSyntaxError("',' expected after first 'define' constant.");
         }
-      } else {
-        if (token != TT_SEMICOLON) {
-          expression();
+        constant();
+        if (token == TT_ARGCLOSE) {
+          getNextToken();
+        } else {
+          throwSyntaxError("')' expected after 'define' statement.");
         }
         if (token == TT_SEMICOLON) {
           getNextToken();
         } else {
-          throwSyntaxError("';' expected after expression.");
+          throwSyntaxError("';' expected after 'define' statement.");
         }
+        return;
+      } else if (token == TT_function) {
+        getNextToken();
+        functionDefinition();
+        return;
+      } else {
+        throwSyntaxError("Unexpected keyword '" + keyword + "'");
+      }
+
+    } else if (token == TT_LISTOPEN) {
+      // compundStatement
+      getNextToken();
+      if (token != TT_LISTCLOSE) {
+        statementList();
+      }
+      if (token == TT_LISTCLOSE) {
+        getNextToken();
+        return;
+      } else {
+        throwSyntaxError("'}' expected.");
+      }
+    } else {
+      if (token != TT_SEMICOLON) {
+        expression();
+      }
+      if (token == TT_SEMICOLON) {
+        getNextToken();
+        return;
+      } else {
+        throwSyntaxError("';' expected after expression.");
       }
     }
-  }
 
-  public void labeledStatement() {
   }
 
-  public void expressionStatement() {
+  public void functionDefinition() {
+    functionDeclarator();
+    compoundStatement();
   }
 
-  public void inclusionStatement() {
+  public void functionDeclarator() {
+    //identifier '(' [parameter-list] ')'
+    if (token == TT_IDENTIFIER) {
+      getNextToken();
+      if (token == TT_ARGOPEN) {
+        getNextToken();
+      } else {
+        throwSyntaxError("'(' expected in function declaration.");
+      }
+      if (token != TT_ARGCLOSE) {
+        parameterList();
+      }
+      if (token != TT_ARGCLOSE) {
+        throwSyntaxError("')' expected in function declaration.");
+      } else {
+        getNextToken();
+      }
+    }
   }
-
-  //  public void compoundStatement() {
-  //  }
-
-  public void selectionStatement() {
+  //
+  public void parameterList() {
+    //parameter-declaration
+    //parameter-list ',' parameter-declaration
+    do {
+      parameterDeclaration();
+      if (token != TT_COMMA) {
+        break;
+      }
+      getNextToken();
+    } while (true);
   }
 
-  public void iterationStatement() {
+  public void parameterDeclaration() {
+    //variable
+    //variable-reference
+    //variable '=' constant
+    if (token == TT_VARIABLE) {
+      getNextToken();
+      if (token == TT_SET) {
+        getNextToken();
+        constant();
+      }
+      return;
+    }
   }
 
-  public void jumpStatement() {
+  public void labeledStatementList() {
+    if (token != TT_case && token != TT_default) {
+      throwSyntaxError("'case' or 'default' expected.");
+    }
+    do {
+      if (token == TT_case) {
+        getNextToken();
+        constant();
+        if (token == TT_DDOT) {
+          getNextToken();
+          statementList();
+        } else {
+          throwSyntaxError("':' character after 'case' constant expected.");
+        }
+      } else { // TT_default 
+        getNextToken();
+        if (token == TT_DDOT) {
+          getNextToken();
+          statementList();
+        } else {
+          throwSyntaxError("':' character after 'default' expected.");
+        }
+      }
+    } while (token == TT_case || token == TT_default);
   }
 
-  public void outputStatement() {
-  }
+  //  public void labeledStatement() {
+  //    if (token == TT_case) {
+  //      getNextToken();
+  //      constant();
+  //      if (token == TT_DDOT) {
+  //        getNextToken();
+  //        statement();
+  //      } else {
+  //        throwSyntaxError("':' character after 'case' constant expected.");
+  //      }
+  //      return;
+  //    } else if (token == TT_default) {
+  //      getNextToken();
+  //      if (token == TT_DDOT) {
+  //        getNextToken();
+  //        statement();
+  //      } else {
+  //        throwSyntaxError("':' character after 'default' expected.");
+  //      }
+  //      return;
+  //    }
+  //  }
 
-  public void scopeStatement() {
+  public void expressionStatement() {
   }
 
-  public void flowStatement() {
+  public void inclusionStatement() {
   }
 
-  public void definitionStatement() {
-  }
+  //  public void compoundStatement() {
+  //  }
+
+  //  public void selectionStatement() {
+  //  }
+  //
+  //  public void iterationStatement() {
+  //  }
+  //
+  //  public void jumpStatement() {
+  //  }
+  //
+  //  public void outputStatement() {
+  //  }
+  //
+  //  public void scopeStatement() {
+  //  }
+  //
+  //  public void flowStatement() {
+  //  }
+  //
+  //  public void definitionStatement() {
+  //  }
 
   public void ifStatement() {
-    // statement [else-statement]
-    statement();
-    if (token == TT_else) {
+    // ':' statement-list [elseif-list] [else-colon-statement] 'endif' ';'
+    if (token == TT_DDOT) {
       getNextToken();
+      statementList();
+      switch (token) {
+        case TT_else :
+          getNextToken();
+          if (token == TT_DDOT) {
+            getNextToken();
+            statementList();
+          } else {
+            if (token == TT_if) { //'else if'
+              getNextToken();
+              elseifStatementList();
+            } else {
+              throwSyntaxError("':' expected after 'else'.");
+            }
+          }
+          break;
+        case TT_elseif :
+          getNextToken();
+          elseifStatementList();
+          break;
+      }
+
+      if (token != TT_endif) {
+        throwSyntaxError("'endif' expected.");
+      }
+      getNextToken();
+      if (token != TT_SEMICOLON) {
+        throwSyntaxError("';' expected after if-statement.");
+      }
+      getNextToken();
+    } else {
+      // statement [else-statement]
       statement();
+      if (token == TT_elseif) {
+        getNextToken();
+        if (token == TT_ARGOPEN) {
+          getNextToken();
+        } else {
+          throwSyntaxError("'(' expected after 'elseif' keyword.");
+        }
+        expression();
+        if (token == TT_ARGCLOSE) {
+          getNextToken();
+        } else {
+          throwSyntaxError("')' expected after 'elseif' condition.");
+        }
+        ifStatement();
+      } else if (token == TT_else) {
+        getNextToken();
+        statement();
+      }
+    }
+  }
+  public void elseifStatementList() {
+    do {
+      elseifStatement();
+      switch (token) {
+        case TT_else :
+          getNextToken();
+          if (token == TT_DDOT) {
+            getNextToken();
+            statementList();
+            return;
+          } else {
+            if (token == TT_if) { //'else if'
+              getNextToken();
+            } else {
+              throwSyntaxError("':' expected after 'else'.");
+            }
+          }
+          break;
+        case TT_elseif :
+          getNextToken();
+          break;
+        default :
+          return;
+      }
+    } while (true);
+  }
+
+  public void elseifStatement() {
+    if (token == TT_ARGOPEN) {
+      getNextToken();
+      expression();
+      if (token != TT_ARGOPEN) {
+        throwSyntaxError("')' expected in else-if-statement.");
+      }
+      getNextToken();
+      if (token != TT_DDOT) {
+        throwSyntaxError("':' expected in else-if-statement.");
+      }
+      getNextToken();
+      statementList();
     }
   }
 
   public void switchStatement() {
+    if (token == TT_DDOT) {
+      // ':' [labeled-statement-list] 'endswitch' ';'
+      getNextToken();
+      labeledStatementList();
+      if (token != TT_endswitch) {
+        throwSyntaxError("'endswitch' expected.");
+      }
+      getNextToken();
+      if (token != TT_SEMICOLON) {
+        throwSyntaxError("';' expected after switch-statement.");
+      }
+      getNextToken();
+    } else {
+      // '{' [labeled-statement-list] '}'
+      if (token != TT_LISTOPEN) {
+        throwSyntaxError("'{' expected in switch statement.");
+      }
+      getNextToken();
+      if (token != TT_LISTCLOSE) {
+        labeledStatementList();
+      }
+      if (token != TT_LISTCLOSE) {
+        throwSyntaxError("'}' expected in switch statement.");
+      }
+      getNextToken();
+
+    }
   }
 
   public void forStatement() {
+    if (token == TT_DDOT) {
+      getNextToken();
+      statementList();
+      if (token != TT_endfor) {
+        throwSyntaxError("'endfor' expected.");
+      }
+      getNextToken();
+      if (token != TT_SEMICOLON) {
+        throwSyntaxError("';' expected after for-statement.");
+      }
+      getNextToken();
+    } else {
+      statement();
+    }
   }
 
   public void whileStatement() {
+    // ':' statement-list 'endwhile' ';'
+    if (token == TT_DDOT) {
+      getNextToken();
+      statementList();
+      if (token != TT_endwhile) {
+        throwSyntaxError("'endwhile' expected.");
+      }
+      getNextToken();
+      if (token != TT_SEMICOLON) {
+        throwSyntaxError("';' expected after while-statement.");
+      }
+      getNextToken();
+    } else {
+      statement();
+    }
   }
 
   public void foreachStatement() {
+    if (token == TT_DDOT) {
+      getNextToken();
+      statementList();
+      if (token != TT_endforeach) {
+        throwSyntaxError("'endforeach' expected.");
+      }
+      getNextToken();
+      if (token != TT_SEMICOLON) {
+        throwSyntaxError("';' expected after foreach-statement.");
+      }
+      getNextToken();
+    } else {
+      statement();
+    }
   }
 
   public void exitStatus() {
@@ -1007,21 +1321,51 @@ public class PHPParser extends PHPKeywords {
   }
 
   public void expression() {
-    if (token == TT_STRING_CONSTANT || token == TT_INTERPOLATED_STRING) {
-      getNextToken();
-    } else {
-      postfixExpression();
-      //      while (token != TT_SEMICOLON) {
-      //        getNextToken();
-      //      }
-    }
+    //    if (token == TT_STRING_CONSTANT || token == TT_INTERPOLATED_STRING) {
+    //      getNextToken();
+    //    } else {
+    logicalinclusiveorExpression();
+    //      while (token != TT_SEMICOLON) {
+    //        getNextToken();
+    //      //      }
+    //    }
   }
 
   public void postfixExpression() {
+    String ident;
+    boolean castFlag = false;
     switch (token) {
+      case TT_STRING_CONSTANT :
+        getNextToken();
+        break;
+      case TT_INTERPOLATED_STRING :
+        getNextToken();
+        break;
       case TT_ARGOPEN :
         getNextToken();
-        expression();
+        if (token == TT_IDENTIFIER) {
+          // check if identifier is a type:
+          ident = identifier;
+          String str = identifier.toLowerCase();
+          for (int i = 0; i < PHP_TYPES.length; i++) {
+            if (PHP_TYPES[i].equals(str)) {
+              castFlag = true;
+              break;
+            }
+          }
+          if (castFlag) {
+            getNextToken();
+            if (token != TT_ARGCLOSE) {
+              throwSyntaxError(") expected after cast-type '" + ident + "'.");
+            }
+            getNextToken();
+            expression();
+            break;
+          }
+        }
+        if (!castFlag) {
+          expression();
+        }
         if (token != TT_ARGCLOSE) {
           throwSyntaxError(") expected in postfix-expression.");
         }
@@ -1034,22 +1378,71 @@ public class PHPParser extends PHPKeywords {
         getNextToken();
         break;
       case TT_VARIABLE :
+        ident = identifier;
         getNextToken();
+        if (token == TT_LISTOPEN) {
+          getNextToken();
+          expression();
+          if (token != TT_LISTCLOSE) {
+            throwSyntaxError("'}' expected after variable '" + ident + "' in variable-expression.");
+          }
+          getNextToken();
+        }
         break;
       case TT_IDENTIFIER :
+        ident = identifier;
         getNextToken();
         if (token == TT_ARGOPEN) {
           getNextToken();
           if (token != TT_ARGCLOSE) {
             expressionList();
             if (token != TT_ARGCLOSE) {
-              throwSyntaxError(") expected after identifier in postfix-expression.");
+              throwSyntaxError("')' expected after identifier '" + ident + "' in postfix-expression.");
             }
           }
           getNextToken();
         }
         break;
-
+      case TT_list :
+        getNextToken();
+        if (token == TT_ARGOPEN) {
+          getNextToken();
+          if (token == TT_COMMA) {
+            getNextToken();
+          }
+          expressionList();
+          if (token != TT_ARGCLOSE) {
+            throwSyntaxError("')' expected after 'list' keyword.");
+          }
+          getNextToken();
+          //          if (token == TT_SET) {
+          //            getNextToken();
+          //            logicalinclusiveorExpression();
+          //          }
+        } else {
+          throwSyntaxError("'(' expected after 'list' keyword.");
+        }
+        break;
+        //      case TT_array :
+        //        getNextToken();
+        //        if (token == TT_ARGOPEN) {
+        //          getNextToken();
+        //          if (token == TT_COMMA) {
+        //            getNextToken();
+        //          }
+        //          expressionList();
+        //          if (token != TT_ARGCLOSE) {
+        //            throwSyntaxError("')' expected after 'list' keyword.");
+        //          }
+        //          getNextToken();
+        //          if (token == TT_SET) {
+        //            getNextToken();
+        //            logicalinclusiveorExpression();
+        //          }
+        //        } else {
+        //          throwSyntaxError("'(' expected after 'list' keyword.");
+        //        }
+        //        break;
     }
     boolean while_flag = true;
     do {
@@ -1062,7 +1455,7 @@ public class PHPParser extends PHPKeywords {
           }
           getNextToken();
           break;
-        case TT_REF :
+        case TT_REF : // ->
           switch (token) {
             case TT_VARIABLE :
               getNextToken();
@@ -1074,7 +1467,7 @@ public class PHPParser extends PHPKeywords {
               getNextToken();
               expression();
               if (token != TT_LISTCLOSE) {
-                throwSyntaxError("] expected in postfix-expression.");
+                throwSyntaxError("} expected in postfix-expression.");
               }
               getNextToken();
               break;
@@ -1093,6 +1486,253 @@ public class PHPParser extends PHPKeywords {
     } while (while_flag);
   }
 
+  public void unaryExpression() {
+    switch (token) {
+      case TT_INCREMENT :
+        getNextToken();
+        unaryExpression();
+        break;
+      case TT_DECREMENT :
+        getNextToken();
+        unaryExpression();
+        break;
+        //'&' '*' '+' '-' '~' '!' 
+      case TT_AMPERSAND :
+        getNextToken();
+        castExpression();
+        break;
+      case TT_MULTIPLY :
+        getNextToken();
+        castExpression();
+        break;
+      case TT_ADD :
+        getNextToken();
+        castExpression();
+        break;
+      case TT_SUBTRACT :
+        getNextToken();
+        castExpression();
+        break;
+      case TT_TILDE :
+        getNextToken();
+        castExpression();
+        break;
+      case TT_NOT :
+        getNextToken();
+        castExpression();
+        break;
+      default :
+        postfixExpression();
+    }
+  }
+
+  public void castExpression() {
+    //    if (token == TT_ARGOPEN) {
+    //      getNextToken();
+    //      typeName();
+    //      if (token != TT_ARGCLOSE) {
+    //        throwSyntaxError(") expected after cast-expression.");
+    //      }
+    //      getNextToken();
+    //    }
+    unaryExpression();
+  }
+
+  public void typeName() {
+    //'string' 'unset' 'array' 'object'
+    //'bool' 'boolean'
+    //'real' 'double' 'float'
+    //'int' 'integer'
+    String ident = "";
+    if (token == TT_IDENTIFIER) {
+      ident = identifier;
+      String str = identifier.toLowerCase();
+      getNextToken();
+      for (int i = 0; i < PHP_TYPES.length; i++) {
+        if (PHP_TYPES[i].equals(str)) {
+          return;
+        }
+      }
+    }
+    throwSyntaxError("Expected type cast '( <type-name> )'; Got '" + ident + "'.");
+  }
+
+  public void assignExpression() {
+    castExpression();
+    if (token == TT_SET) { // =
+      getNextToken();
+      logicalinclusiveorExpression();
+    } else if (token == TT_DOTASSIGN) { // .=
+      getNextToken();
+      logicalinclusiveorExpression();
+    } else if (token == TT_FOREACH) { // =>
+      getNextToken();
+      logicalinclusiveorExpression();
+    }
+  }
+
+  public void multiplicativeExpression() {
+    do {
+      assignExpression();
+      if (token != TT_MULTIPLY && token != TT_DIV && token != TT_MOD) {
+        return;
+      }
+      getNextToken();
+    } while (true);
+  }
+
+  public void concatenationExpression() {
+    do {
+      multiplicativeExpression();
+      if (token != TT_DOT) {
+        return;
+      }
+      getNextToken();
+    } while (true);
+  }
+
+  public void additiveExpression() {
+    do {
+      concatenationExpression();
+      if (token != TT_ADD && token != TT_SUBTRACT) {
+        return;
+      }
+      getNextToken();
+    } while (true);
+  }
+
+  public void shiftExpression() {
+    do {
+      additiveExpression();
+      if (token != TT_LSHIFT && token != TT_RSHIFT) {
+        return;
+      }
+      getNextToken();
+    } while (true);
+  }
+
+  public void relationalExpression() {
+    do {
+      shiftExpression();
+      if (token != TT_LESS && token != TT_GREATER && token != TT_LESSEQUAL && token != TT_GREATEREQUAL) {
+        return;
+      }
+      getNextToken();
+    } while (true);
+  }
+
+  public void identicalExpression() {
+    do {
+      relationalExpression();
+      if (token != TT_EX_EQUAL && token != TT_EX_UNEQUAL) {
+        return;
+      }
+      getNextToken();
+    } while (true);
+  }
+
+  public void equalityExpression() {
+    do {
+      identicalExpression();
+      if (token != TT_EQUAL && token != TT_UNEQUAL) {
+        return;
+      }
+      getNextToken();
+    } while (true);
+  }
+
+  public void andExpression() {
+    do {
+      equalityExpression();
+      if (token != TT_AMPERSAND) {
+        return;
+      }
+      getNextToken();
+    } while (true);
+  }
+
+  public void exclusiveorExpression() {
+    do {
+      andExpression();
+      if (token != TT_POW) {
+        return;
+      }
+      getNextToken();
+    } while (true);
+  }
+
+  public void inclusiveorExpression() {
+    do {
+      exclusiveorExpression();
+      if (token != TT_LINE) {
+        return;
+      }
+      getNextToken();
+    } while (true);
+  }
+
+  public void booleanandExpression() {
+    do {
+      inclusiveorExpression();
+      if (token != TT_AND) {
+        return;
+      }
+      getNextToken();
+    } while (true);
+  }
+
+  public void booleanorExpression() {
+    do {
+      booleanandExpression();
+      if (token != TT_OR) {
+        return;
+      }
+      getNextToken();
+    } while (true);
+  }
+
+  public void logicalandExpression() {
+    do {
+      booleanorExpression();
+      if (token != TT_and) {
+        return;
+      }
+      getNextToken();
+    } while (true);
+  }
+
+  public void logicalexclusiveorExpression() {
+    do {
+      logicalandExpression();
+      if (token != TT_xor) {
+        return;
+      }
+      getNextToken();
+    } while (true);
+  }
+
+  public void logicalinclusiveorExpression() {
+    do {
+      logicalexclusiveorExpression();
+      if (token != TT_or) {
+        return;
+      }
+      getNextToken();
+    } while (true);
+  }
+
+  //  public void assignmentExpression() {
+  //    if (token == TT_VARIABLE) {
+  //      getNextToken();
+  //      if (token == TT_SET) {
+  //        getNextToken();
+  //        logicalinclusiveorExpression();
+  //      }
+  //    } else {
+  //      logicalinclusiveorExpression();
+  //    }
+  //  }
+
   public void variableList() {
     do {
       variable();
@@ -1113,7 +1753,22 @@ public class PHPParser extends PHPKeywords {
   }
 
   public void constant() {
-
+    switch (token) {
+      case TT_STRING_CONSTANT :
+        getNextToken();
+        break;
+      case TT_INTERPOLATED_STRING :
+        getNextToken();
+        break;
+      case TT_DOUBLE_NUMBER :
+        getNextToken();
+        break;
+      case TT_INT_NUMBER :
+        getNextToken();
+        break;
+      default :
+        throwSyntaxError("Constant expected.");
+    }
   }
 
 }
\ No newline at end of file
index f4f7ddd..8e86fb0 100644 (file)
@@ -11,8 +11,6 @@ Contributors:
 **********************************************************************/
 package net.sourceforge.phpeclipse.phpeditor.php;
 
-
-
 /**
  * PHP keyWords and Token definitions
  */
@@ -50,16 +48,15 @@ public class PHPKeywords {
       "foreach",
       "endforeach",
       "extends",
-      "empty",
-      "array",
-   //   "isset",
-      "echo",
-      "var",
-      "as",
-      "print",
-      "unset",
-      "exit",
-      "die" };
+    //  "empty",
+    //  "array",
+    //   "isset",
+    "echo", "var", "as", "print", 
+    "unset", "exit", "die", "and", "or", "xor",
+    "list" };
+
+  public final static String[] PHP_TYPES =
+    { "string", "unset", "array", "object", "bool", "boolean", "real", "double", "float", "int", "integer", };
 
   public final static int TT_KEYWORD = 1000;
   public final static int TT_if = 1001;
@@ -68,33 +65,32 @@ public class PHPKeywords {
   public final static int TT_endif = 1004;
   public final static int TT_for = 1005;
   public final static int TT_endfor = 1006;
-  public final static int TT_while = 100;
-  public final static int TT_endwhile = 1007;
-  public final static int TT_switch = 1008;
-  public final static int TT_case = 1009;
-  public final static int TT_endswitch = 1010;
-  public final static int TT_break = 1011;
-  public final static int TT_continue = 1012;
-  public final static int TT_return = 1013;
-  public final static int TT_define = 1014;
-  public final static int TT_include = 1015;
-  public final static int TT_include_once = 1016;
-  public final static int TT_require = 1017;
-  public final static int TT_require_once = 1018;
-  public final static int TT_function = 1019;
-  public final static int TT_class = 1020;
-  public final static int TT_new = 1021;
-  public final static int TT_do = 1022;
-  public final static int TT_old_function = 1023;
-  public final static int TT_default = 1024;
-  public final static int TT_global = 1025;
-  public final static int TT_static = 1026;
-  public final static int TT_foreach = 1027;
-  public final static int TT_endforeach = 1028;
-  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_while = 1007;
+  public final static int TT_endwhile = 1008;
+  public final static int TT_switch = 1009;
+  public final static int TT_case = 10010;
+  public final static int TT_endswitch = 1011;
+  public final static int TT_break = 1012;
+  public final static int TT_continue = 1013;
+  public final static int TT_return = 1014;
+  public final static int TT_define = 1015;
+  public final static int TT_include = 1016;
+  public final static int TT_include_once = 1017;
+  public final static int TT_require = 1018;
+  public final static int TT_require_once = 1019;
+  public final static int TT_function = 1020;
+  public final static int TT_class = 1021;
+  public final static int TT_new = 1022;
+  public final static int TT_do = 1023;
+  public final static int TT_old_function = 1024;
+  public final static int TT_default = 1025;
+  public final static int TT_global = 1026;
+  public final static int TT_static = 1027;
+  public final static int TT_foreach = 1028;
+  public final static int TT_endforeach = 1029;
+  public final static int TT_extends = 1030;
+ // public final static int TT_empty = 1031;
+ // public final static int TT_array = 1032;
   public final static int TT_echo = 1033;
   public final static int TT_var = 1034;
   public final static int TT_as = 1035;
@@ -102,47 +98,46 @@ public class PHPKeywords {
   public final static int TT_unset = 1037;
   public final static int TT_exit = 1038;
   public final static int TT_die = 1039;
-  
+  public final static int TT_and = 1040;
+  public final static int TT_or = 1041;
+  public final static int TT_xor = 1042;
+  public final static int TT_list = 1043;
+
   public final static int[] PHP_KEYWORD_TOKEN =
     {
-    TT_if,
-    TT_elseif,
-    TT_else,
-    TT_endif,
-    TT_for,
-    TT_endfor,
-    TT_while,
-    TT_endwhile,
-    TT_switch,
-    TT_case,
-    TT_endswitch,
-    TT_break,
-    TT_continue,
-    TT_return,
-    TT_define,
-    TT_include,
-    TT_include_once,
-    TT_require,
-    TT_require_once,
-    TT_function,
-    TT_class,
-    TT_new,
-    TT_do,
-    TT_old_function,
-    TT_default,
-    TT_global,
-    TT_static,
-    TT_foreach,
-    TT_endforeach,
-    TT_extends,
-    TT_empty,
-    TT_array,
- //   TT_isset,
-    TT_echo,
-    TT_var,
-    TT_as,
-    TT_print,
-    TT_unset,
-    TT_exit,
-    TT_die };
+      TT_if,
+      TT_elseif,
+      TT_else,
+      TT_endif,
+      TT_for,
+      TT_endfor,
+      TT_while,
+      TT_endwhile,
+      TT_switch,
+      TT_case,
+      TT_endswitch,
+      TT_break,
+      TT_continue,
+      TT_return,
+      TT_define,
+      TT_include,
+      TT_include_once,
+      TT_require,
+      TT_require_once,
+      TT_function,
+      TT_class,
+      TT_new,
+      TT_do,
+      TT_old_function,
+      TT_default,
+      TT_global,
+      TT_static,
+      TT_foreach,
+      TT_endforeach,
+      TT_extends,
+     // TT_empty,
+    //  TT_array,
+    //   TT_isset,
+    TT_echo, TT_var, TT_as, TT_print, TT_unset, TT_exit, 
+    TT_die, TT_and, TT_or, TT_xor, TT_list };
 }
index ad72992..40e2fce 100644 (file)
@@ -44,70 +44,78 @@ import sun.security.krb5.internal.crypto.e;
  */
 public class PHPConsole extends ViewPart {
 
-       public static final String CONSOLE_ID = "net.sourceforge.phpeclipse.views.phpconsoleview";
-       
-       private TextViewer viewer = null;
-       private Document document = null;
-
-       /**
-        * The constructor.
-        */
-       public PHPConsole() {
-       }
-
-       /**
-        * Insert the method's description here.
-        * @see ViewPart#createPartControl
-        */
-       public void createPartControl(Composite parent)  {
-               viewer = new TextViewer(parent, SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL);
-               GridData viewerData = new GridData(GridData.FILL_BOTH);
-               viewer.getControl().setLayoutData(viewerData);
-               viewer.setEditable(false);
-       }
-
-       /**
-        * Insert the method's description here.
-        * @see ViewPart#setFocus
-        */
-       public void setFocus()  {
-       }
-       
-       /**
-        * Set the text for the viewer
-        */
-       public void setOutputText(String text) {
-               document = new Document(text);
-               viewer.setDocument(document);
-       }
+  public static final String CONSOLE_ID = "net.sourceforge.phpeclipse.views.phpconsoleview";
+
+  private TextViewer viewer = null;
+  private Document document = null;
+
+  /**
+   * The constructor.
+   */
+  public PHPConsole() {
+  }
+
+  /**
+   * Insert the method's description here.
+   * @see ViewPart#createPartControl
+   */
+  public void createPartControl(Composite parent) {
+    viewer = new TextViewer(parent, SWT.WRAP | SWT.V_SCROLL | SWT.H_SCROLL);
+    GridData viewerData = new GridData(GridData.FILL_BOTH);
+    viewer.getControl().setLayoutData(viewerData);
+    viewer.setEditable(false);
+  }
+
+  /**
+   * Insert the method's description here.
+   * @see ViewPart#setFocus
+   */
+  public void setFocus() {
+  }
+
+  /**
+   * Set the text for the viewer
+   */
+  public void setOutputText(String text) {
+    document = new Document(text);
+    viewer.setDocument(document);
+  }
 
   public void appendOutputText(String text) {
     try {
+      if (document == null) {
+        document = new Document(text);
+        viewer.setDocument(document);
+      }
       document.replace(document.getLength(), 0, text);
     } catch (BadLocationException e) {
     }
-  //  viewer.setDocument(document);
+    //  viewer.setDocument(document);
   }
-  
+
   /**
    * Prints out the string represented by the string buffer
    */
-  static public void write(String output) {
+  public static void write(String output) {
     try {
       IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
       PHPConsole console = (PHPConsole) page.findView(PHPConsole.CONSOLE_ID);
 
       if (console != null) {
         console.appendOutputText(output);
-      } else if (
-        PHPeclipsePlugin.getDefault().getPreferenceStore().getBoolean(PHPeclipsePlugin.SHOW_OUTPUT_IN_CONSOLE) == true) {
+      } else if (PHPeclipsePlugin.getDefault().getPreferenceStore().getBoolean(PHPeclipsePlugin.SHOW_OUTPUT_IN_CONSOLE) == true) {
         page.showView(PHPConsole.CONSOLE_ID);
         console = (PHPConsole) page.findView(PHPConsole.CONSOLE_ID);
         console.setOutputText(output);
       }
     } catch (PartInitException e) {
       PHPeclipsePlugin.getDefault().getLog().log(
-        new Status(IStatus.ERROR, PHPeclipsePlugin.getPluginId(), 0, PHPActionMessages.getString("PHPStartApacheAction.consoleViewOpeningProblem"), e));
+        new Status(
+          IStatus.ERROR,
+          PHPeclipsePlugin.getPluginId(),
+          0,
+          PHPActionMessages.getString("PHPStartApacheAction.consoleViewOpeningProblem"),
+          e));
     }
 
   }
@@ -115,7 +123,7 @@ public class PHPConsole extends ViewPart {
   /**
    * Creates a string buffer from the given input stream
    */
-  static public String getStringFromStream(InputStream stream) throws IOException {
+  public static String getStringFromStream(InputStream stream) throws IOException {
     StringBuffer buffer = new StringBuffer();
     byte[] b = new byte[100];
     int finished = 0;
@@ -129,7 +137,4 @@ public class PHPConsole extends ViewPart {
     return buffer.toString();
   }
 
-
-
-
 }