*** empty log message ***
[phpeclipse.git] / net.sourceforge.phpeclipse / src / test / PHPParser.jj
index 861d2c6..46fb115 100644 (file)
@@ -127,7 +127,12 @@ public class PHPParser extends PHPParserSuperclass {
    */
   private static void setMarker(ParseException e) {
     try {
-      setMarker(fileToParse, errorMessage, jj_input_stream.tokenBegin,jj_input_stream.tokenBegin+e.currentToken.image.length(), errorLevel);
+      setMarker(fileToParse,
+                errorMessage,
+                jj_input_stream.tokenBegin,
+                jj_input_stream.tokenBegin + e.currentToken.image.length(),
+                errorLevel,
+                "Line " + e.currentToken.beginLine);
     } catch (CoreException e2) {
       PHPeclipsePlugin.log(e2);
     }
@@ -272,10 +277,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>
@@ -347,6 +356,8 @@ MORE :
 | < TRUE: "true" >
 | < WHILE: "while" >
 | < ENDWHILE : "endwhile" >
+| <FOREACH : "foreach" >
+| <AS : "as" >
 }
 
 /* TYPES */
@@ -441,7 +452,7 @@ MORE :
   >
 |
   < #SPECIAL:
-    "_"
+    "_" | ["\u007f"-"\u00ff"]
   >
 }
 
@@ -502,7 +513,9 @@ MORE :
 | <REMASSIGN: "%=" >
 | <LSHIFTASSIGN: "<<=" >
 | <RSIGNEDSHIFTASSIGN: ">>=" >
-| <RUNSIGNEDSHIFTASSIGN: ">>>=" >
+| <BANGDOUBLEEQUAL: "!==" >
+| <TRIPLEEQUAL: "===" >
+| <TILDEEQUAL: "~=" >
 }
 
 <PHPPARSING> TOKEN :
@@ -528,8 +541,14 @@ void phpTest() :
 void phpFile() :
 {}
 {
+  try {
   (<PHPSTART> Php() <PHPEND>)*
   <EOF>
+  } catch (TokenMgrError e) {
+    errorMessage = e.getMessage();
+    errorLevel   = ERROR;
+    throw generateParseException();
+  }
 }
 
 void Php() :
@@ -701,13 +720,23 @@ Token token;
 String VariableInitializer() :
 {
   String expr;
+  Token token;
 }
 {
   expr = Literal()
   {return expr;}
 |
+  <MINUS> (token = <INTEGER_LITERAL> | token = <FLOATING_POINT_LITERAL>)
+  {return "-" + token.image;}
+|
+  <PLUS> (token = <INTEGER_LITERAL> | token = <FLOATING_POINT_LITERAL>)
+  {return "+" + token.image;}
+|
   expr = ArrayDeclarator()
   {return expr;}
+|
+  token = <IDENTIFIER>
+  {return token.image;}
 }
 
 String ArrayVariable() :
@@ -847,6 +876,9 @@ String Type() :
 |
   <INTEGER>
   {return "integer";}
+|
+  <OBJECT>
+  {return "object";}
 }
 
 String Expression() :
@@ -867,7 +899,7 @@ String Expression() :
     } catch (ParseException e) {
       errorMessage = "expression expected";
       errorLevel   = ERROR;
-      throw generateParseException();
+      throw e;
     }
   ]
   {
@@ -898,8 +930,6 @@ String AssignmentOperator() :
 {return "<<=";}
 | <RSIGNEDSHIFTASSIGN>
 {return ">>=";}
-| <RUNSIGNEDSHIFTASSIGN>
-{return ">>>=";}
 | <ANDASSIGN>
 {return "&=";}
 | <XORASSIGN>
@@ -908,6 +938,8 @@ String AssignmentOperator() :
 {return "|=";}
 | <DOTASSIGN>
 {return ".=";}
+| <TILDEEQUAL>
+{return "~=";}
 }
 
 String ConditionalExpression() :
@@ -1078,7 +1110,12 @@ String EqualityExpression() :
   expr = RelationalExpression()
   {buff.append(expr);}
   (
-  ( operator = <EQ> | operator = <NE> ) expr2 = RelationalExpression()
+  (   operator = <EQ>
+    | operator = <NE>
+    | operator = <BANGDOUBLEEQUAL>
+    | operator = <TRIPLEEQUAL>
+  )
+  expr2 = RelationalExpression()
   {
     buff.append(operator.image);
     buff.append(expr2);
@@ -1165,15 +1202,34 @@ String MultiplicativeExpression() :
   {return buff.toString();}
 }
 
+/**
+ * An unary expression starting with @, & or nothing
+ */
 String UnaryExpression() :
 {
   String expr;
   Token token;
+  final StringBuffer buff = new StringBuffer();
 }
 {
-  <AT> expr = UnaryExpression()
-  {return "@" + expr;}
+  token = <BIT_AND> expr = UnaryExpressionNoPrefix()
+  {
+    if (token == null) {
+      return expr;
+    }
+    return token.image + expr;
+  }
 |
+  (<AT> {buff.append("@");})* expr = UnaryExpressionNoPrefix()
+  {return buff.append(expr).toString();}
+}
+
+String UnaryExpressionNoPrefix() :
+{
+  String expr;
+  Token token;
+}
+{
   ( token = <PLUS> | token = <MINUS> ) expr = UnaryExpression()
   {
     return token.image + expr;
@@ -1189,6 +1245,7 @@ String UnaryExpression() :
   {return expr;}
 }
 
+
 String PreIncrementExpression() :
 {
 String expr;
@@ -1296,12 +1353,9 @@ String PrimaryPrefix() :
   token = <IDENTIFIER>
   {return token.image;}
 |
-  [token = <BIT_AND>] <NEW> expr = ClassIdentifier()
+  <NEW> expr = ClassIdentifier()
   {
-    if (token == null) {
-      return "new " + expr;
-    }
-    return "new &" + expr;
+    return "new " + expr;
   }
 |  
   expr = VariableDeclaratorId()
@@ -1347,7 +1401,7 @@ String VariableSuffix() :
   } catch (ParseException e) {
     errorMessage = "']' expected";
     errorLevel   = ERROR;
-    throw generateParseException();
+    throw e;
   }
   {
     if(expr == null) {
@@ -1369,14 +1423,8 @@ String Literal() :
   token = <FLOATING_POINT_LITERAL>
   {return token.image;}
 |
-  try {
-    token = <STRING_LITERAL>
+  token = <STRING_LITERAL>
   {return token.image;}
-  } catch (TokenMgrError e) {
-    errorMessage = "unterminated string";
-    errorLevel   = ERROR;
-    throw generateParseException();
-  }
 |
   expr = BooleanLiteral()
   {return expr;}
@@ -1489,6 +1537,8 @@ void Statement() :
 |
   ForStatement()
 |
+  ForeachStatement()
+|
   BreakStatement()
 |
   ContinueStatement()
@@ -1753,6 +1803,12 @@ void DoStatement() :
   }
 }
 
+void ForeachStatement() :
+{}
+{
+  <FOREACH> <LPAREN> Variable() <AS> Variable() [ <ARRAYASSIGN> Expression() ] <RPAREN> Statement()
+}
+
 void ForStatement() :
 {}
 {