ugly syntax supported (endif, endwhile endfor)
[phpeclipse.git] / net.sourceforge.phpeclipse / src / test / PHPParser.jj
index 9e3fc1d..2a86a45 100644 (file)
@@ -202,7 +202,11 @@ public class PHPParser extends PHPParserSuperclass {
   }
 
   public void parse(String s) throws CoreException {
-    ReInit(new StringReader(s));
+    StringReader stream = new StringReader(s);
+    if (jj_input_stream == null) {
+      jj_input_stream = new SimpleCharStream(stream, 1, 1);
+    }
+    ReInit(stream);
     try {
       parse();
     } catch (ParseException e) {
@@ -277,10 +281,14 @@ PARSER_END(PHPParser)
   "/*" : IN_MULTI_LINE_COMMENT
 }
 
-<IN_SINGLE_LINE_COMMENT>
-SPECIAL_TOKEN :
+<IN_SINGLE_LINE_COMMENT> SPECIAL_TOKEN :
+{
+  <SINGLE_LINE_COMMENT: "\n" | "\r" | "\r\n" > : PHPPARSING
+}
+
+<IN_SINGLE_LINE_COMMENT> TOKEN :
 {
-  <SINGLE_LINE_COMMENT: "\n" | "\r" | "\r\n" | "?>" > : PHPPARSING
+  <SINGLE_LINE_COMMENT_PHPEND : "?>" > : DEFAULT
 }
 
 <IN_FORMAL_COMMENT>
@@ -352,6 +360,10 @@ MORE :
 | < TRUE: "true" >
 | < WHILE: "while" >
 | < ENDWHILE : "endwhile" >
+| <ENDIF : "endif" >
+| <ENDFOR : "endfor" >
+| <FOREACH : "foreach" >
+| <AS : "as" >
 }
 
 /* TYPES */
@@ -481,6 +493,7 @@ MORE :
 | <LE: "<=" >
 | <GE: ">=" >
 | <NE: "!=" >
+| <DIF: "<>" >
 | <SC_OR: "||" >
 | <SC_AND: "&&" >
 | <INCR: "++" >
@@ -560,13 +573,17 @@ void ClassDeclaration() :
 {
   <CLASS> className = <IDENTIFIER> [ <EXTENDS> <IDENTIFIER> ]
   {
-    classDeclaration = new PHPClassDeclaration(currentSegment,className.image,pos);
-    currentSegment.add(classDeclaration);
-    currentSegment = classDeclaration;
+    if (currentSegment != null) {
+      classDeclaration = new PHPClassDeclaration(currentSegment,className.image,pos);
+      currentSegment.add(classDeclaration);
+      currentSegment = classDeclaration;
+    }
   }
   ClassBody()
   {
-    currentSegment = (PHPSegmentWithChildren) currentSegment.getParent();
+    if (currentSegment != null) {
+      currentSegment = (PHPSegmentWithChildren) currentSegment.getParent();
+    }
   }
 }
 
@@ -604,10 +621,18 @@ void FieldDeclaration() :
 }
 {
   <VAR> variableDeclaration = VariableDeclarator()
-  {currentSegment.add(variableDeclaration);}
+  {
+    if (currentSegment != null) {
+      currentSegment.add(variableDeclaration);
+    }
+  }
   ( <COMMA>
-    variableDeclaration = VariableDeclarator()
-    {currentSegment.add(variableDeclaration);}
+      variableDeclaration = VariableDeclarator()
+      {
+      if (currentSegment != null) {
+        currentSegment.add(variableDeclaration);
+      }
+      }
   )*
   try {
     <SEMICOLON>
@@ -771,12 +796,16 @@ void MethodDeclaration() :
 {
   <FUNCTION> functionDeclaration = MethodDeclarator()
   {
-    currentSegment.add(functionDeclaration);
-    currentSegment = functionDeclaration;
+    if (currentSegment != null) {
+      currentSegment.add(functionDeclaration);
+      currentSegment = functionDeclaration;
+    }
   }
   Block()
   {
-    currentSegment = (PHPSegmentWithChildren) currentSegment.getParent();
+    if (currentSegment != null) {
+      currentSegment = (PHPSegmentWithChildren) currentSegment.getParent();
+    }
   }
 }
 
@@ -870,6 +899,9 @@ String Type() :
 |
   <INTEGER>
   {return "integer";}
+|
+  <OBJECT>
+  {return "object";}
 }
 
 String Expression() :
@@ -1102,6 +1134,7 @@ String EqualityExpression() :
   {buff.append(expr);}
   (
   (   operator = <EQ>
+    | operator = <DIF>
     | operator = <NE>
     | operator = <BANGDOUBLEEQUAL>
     | operator = <TRIPLEEQUAL>
@@ -1528,6 +1561,8 @@ void Statement() :
 |
   ForStatement()
 |
+  ForeachStatement()
+|
   BreakStatement()
 |
   ContinueStatement()
@@ -1551,7 +1586,11 @@ void IncludeStatement() :
 {
   <REQUIRE>
   expr = Expression()
-  {currentSegment.add(new PHPReqIncDeclaration(currentSegment, "require",pos,expr));}
+  {
+    if (currentSegment != null) {
+      currentSegment.add(new PHPReqIncDeclaration(currentSegment, "require",pos,expr));
+    }
+  }
   try {
     (<SEMICOLON> | "?>")
   } catch (ParseException e) {
@@ -1562,7 +1601,11 @@ void IncludeStatement() :
 |
   <REQUIRE_ONCE>
   expr = Expression()
-  {currentSegment.add(new PHPReqIncDeclaration(currentSegment, "require_once",pos,expr));}
+  {
+    if (currentSegment != null) {
+      currentSegment.add(new PHPReqIncDeclaration(currentSegment, "require_once",pos,expr));
+    }
+  }
   try {
     (<SEMICOLON> | "?>")
   } catch (ParseException e) {
@@ -1573,7 +1616,11 @@ void IncludeStatement() :
 |
   <INCLUDE>
   expr = Expression()
-  {currentSegment.add(new PHPReqIncDeclaration(currentSegment, "include",pos,expr));}
+  {
+    if (currentSegment != null) {
+      currentSegment.add(new PHPReqIncDeclaration(currentSegment, "include",pos,expr));
+    }
+  }
   try {
     (<SEMICOLON> | "?>")
   } catch (ParseException e) {
@@ -1584,7 +1631,11 @@ void IncludeStatement() :
 |
   <INCLUDE_ONCE>
   expr = Expression()
-  {currentSegment.add(new PHPReqIncDeclaration(currentSegment, "include_once",pos,expr));}
+  {
+    if (currentSegment != null) {
+      currentSegment.add(new PHPReqIncDeclaration(currentSegment, "include_once",pos,expr));
+    }
+  }
   try {
     (<SEMICOLON> | "?>")
   } catch (ParseException e) {
@@ -1729,7 +1780,7 @@ void IfStatement() :
  */
 {}
 {
-  <IF> Condition("if") Statement() ( LOOKAHEAD(1) ElseIfStatement() )* [ LOOKAHEAD(1) <ELSE> Statement() ]
+  <IF> Condition("if") IfStatement0()
 }
 
 void Condition(String keyword) :
@@ -1752,6 +1803,39 @@ void Condition(String keyword) :
   }
 }
 
+void IfStatement0() :
+{}
+{
+  <COLON> (Statement())* (ElseIfStatementColon())* [ElseStatementColon()] <ENDIF>
+  try {
+    <SEMICOLON>
+  } catch (ParseException e) {
+    errorMessage = "';' expected 'endif' keyword";
+    errorLevel   = ERROR;
+    throw e;
+  }
+|
+  Statement() ( LOOKAHEAD(1) ElseIfStatement() )* [ LOOKAHEAD(1) <ELSE> Statement() ]
+}
+
+void ElseIfStatementColon() :
+{}
+{
+  <ELSEIF> Condition("elseif") <COLON> (Statement())*
+}
+
+void ElseStatement() :
+{}
+{
+  <ELSE> Statement()
+}
+
+void ElseStatementColon() :
+{}
+{
+  <ELSE> <COLON> (Statement())*
+}
+
 void ElseIfStatement() :
 {}
 {
@@ -1771,7 +1855,7 @@ void WhileStatement0() :
   try {
     (<SEMICOLON> | "?>")
   } catch (ParseException e) {
-    errorMessage = "';' expected";
+    errorMessage = "';' expected after 'endwhile' keyword";
     errorLevel   = ERROR;
     throw e;
   }
@@ -1792,10 +1876,28 @@ void DoStatement() :
   }
 }
 
+void ForeachStatement() :
+{}
+{
+  <FOREACH> <LPAREN> Variable() <AS> Variable() [ <ARRAYASSIGN> Expression() ] <RPAREN> Statement()
+}
+
 void ForStatement() :
 {}
 {
-  <FOR> <LPAREN> [ ForInit() ] <SEMICOLON> [ Expression() ] <SEMICOLON> [ ForUpdate() ] <RPAREN> Statement()
+  <FOR> <LPAREN> [ ForInit() ] <SEMICOLON> [ Expression() ] <SEMICOLON> [ ForUpdate() ] <RPAREN>
+    (
+      Statement()
+    |
+      <COLON> (Statement())* <ENDFOR>
+      try {
+        <SEMICOLON>
+      } catch (ParseException e) {
+        errorMessage = "';' expected 'endfor' keyword";
+        errorLevel   = ERROR;
+        throw e;
+      }
+    )
 }
 
 void ForInit() :