added a builder to parse files with eclipse's build mechanisms
[phpeclipse.git] / net.sourceforge.phpeclipse / src / test / PHPParser.jj
index daf63e2..530693d 100644 (file)
@@ -40,6 +40,7 @@ import net.sourceforge.phpdt.internal.compiler.ast.*;
 import net.sourceforge.phpdt.internal.compiler.parser.OutlineableWithChildren;
 import net.sourceforge.phpdt.internal.compiler.parser.Outlineable;
 import net.sourceforge.phpdt.internal.compiler.parser.PHPOutlineInfo;
+import junit.framework.Assert;
 
 /**
  * A new php parser.
@@ -151,7 +152,7 @@ public final class PHPParser extends PHPParserSuperclass {
   private static void processParseException(final ParseException e) {
     if (PARSER_DEBUG) {
       e.printStackTrace();
-      return;
+      Assert.assertTrue(false);
     }
     if (errorMessage == null) {
       PHPeclipsePlugin.log(e);
@@ -233,7 +234,7 @@ public final class PHPParser extends PHPParserSuperclass {
     }
   }
 
-  public final void parse(final String s) throws CoreException {
+  public final void parse(final String s) {
     final StringReader stream = new StringReader(s);
     if (jj_input_stream == null) {
       jj_input_stream = new SimpleCharStream(stream, 1, 1);
@@ -765,11 +766,11 @@ FieldDeclaration FieldDeclaration() :
 {
   <VAR> variableDeclaration = VariableDeclaratorNoSuffix()
   {arrayList.add(variableDeclaration);
-   outlineInfo.addVariable(new String(variableDeclaration.name));}
+   outlineInfo.addVariable(new String(variableDeclaration.name()));}
   (
     <COMMA> variableDeclaration = VariableDeclaratorNoSuffix()
       {arrayList.add(variableDeclaration);
-       outlineInfo.addVariable(new String(variableDeclaration.name));}
+       outlineInfo.addVariable(new String(variableDeclaration.name()));}
   )*
   try {
     <SEMICOLON>
@@ -791,6 +792,7 @@ FieldDeclaration FieldDeclaration() :
 
 /**
  * a strict variable declarator : there cannot be a suffix here.
+ * It will be used by fields and formal parameters
  */
 VariableDeclaration VariableDeclaratorNoSuffix() :
 {
@@ -815,18 +817,21 @@ VariableDeclaration VariableDeclaratorNoSuffix() :
   {
   if (initializer == null) {
     return new VariableDeclaration(currentSegment,
-                                   varName.image.substring(1).toCharArray(),
+                                   new Variable(varName.image.substring(1).toCharArray(),SimpleCharStream.getPosition()-varName.image.length()-1,SimpleCharStream.getPosition()),
                                    pos,
                                    SimpleCharStream.getPosition());
   }
   return new VariableDeclaration(currentSegment,
-                                 varName.image.substring(1).toCharArray(),
+                                   new Variable(varName.image.substring(1).toCharArray(),SimpleCharStream.getPosition()-varName.image.length()-1,SimpleCharStream.getPosition()),
                                  initializer,
                                  VariableDeclaration.EQUAL,
                                  pos);
   }
 }
 
+/**
+ * this will be used by static statement
+ */
 VariableDeclaration VariableDeclarator() :
 {
   final String varName;
@@ -850,15 +855,15 @@ VariableDeclaration VariableDeclarator() :
   {
   if (initializer == null) {
     return new VariableDeclaration(currentSegment,
-                                  varName.toCharArray(),
+                                   new Variable(varName.substring(1).toCharArray(),SimpleCharStream.getPosition()-varName.length()-1,SimpleCharStream.getPosition()),
                                   pos,
                                   SimpleCharStream.getPosition());
   }
     return new VariableDeclaration(currentSegment,
-                                    varName.toCharArray(),
-                                    initializer,
-                                    VariableDeclaration.EQUAL,
-                                    pos);
+                                   new Variable(varName.substring(1).toCharArray(),SimpleCharStream.getPosition()-varName.length()-1,SimpleCharStream.getPosition()),
+                                   initializer,
+                                   VariableDeclaration.EQUAL,
+                                   pos);
   }
 }
 
@@ -1120,10 +1125,10 @@ Hashtable FormalParameters() :
   }
   [
     var = FormalParameter()
-    {parameters.put(new String(var.name),var);}
+    {parameters.put(new String(var.name()),var);}
     (
       <COMMA> var = FormalParameter()
-      {parameters.put(new String(var.name),var);}
+      {parameters.put(new String(var.name()),var);}
     )*
   ]
   try {
@@ -1184,38 +1189,15 @@ Expression Expression() :
   final Expression expr;
   Expression initializer = null;
   final int pos = SimpleCharStream.getPosition();
-}
-{
-  expr = ConditionalExpression() {return expr;}
-| expr = ExpressionWBang()       {return expr;}
-}
-
-Expression ExpressionWBang() :
-{
-  final Expression expr;
-  final int pos = SimpleCharStream.getPosition();
-}
-{
-  <BANG> expr = ExpressionWBang() {return new PrefixedUnaryExpression(expr,OperatorIds.NOT,pos);}
-| expr = ExpressionNoBang() {return expr;}
-}
-
-Expression ExpressionNoBang() :
-{
-  Expression expr = null;
   int assignOperator = -1;
-  String var;
-  final int pos = SimpleCharStream.getPosition();
 }
 {
-  expr = PrintExpression()   {return expr;}
-| expr = ListExpression()    {return expr;}
-|
-  var = VariableDeclaratorId()
+  LOOKAHEAD(1)
+  expr = ConditionalExpression()
   [
     assignOperator = AssignmentOperator()
     try {
-      expr = Expression()
+      initializer = Expression()
     } catch (ParseException e) {
       if (errorMessage != null) {
         throw e;
@@ -1227,19 +1209,41 @@ Expression ExpressionNoBang() :
     }
   ]
   {
+    char[] varName = expr.toStringExpression().substring(1).toCharArray();
     if (assignOperator == -1) {
-      return new VariableDeclaration(currentSegment,
-                                     var.toCharArray(),
-                                     pos,
-                                     SimpleCharStream.getPosition());
+        return new VariableDeclaration(currentSegment,
+                                       new Variable(varName,SimpleCharStream.getPosition()-varName.length-1,SimpleCharStream.getPosition()),
+                                       pos,
+                                       SimpleCharStream.getPosition());
+      return expr;
     }
     return new VariableDeclaration(currentSegment,
-                                   var.toCharArray(),
-                                   expr,
+                                   new Variable(varName,SimpleCharStream.getPosition()-varName.length-1,SimpleCharStream.getPosition()),
+                                   initializer,
                                    assignOperator,
                                    pos);
     }
   {return expr;}
+| expr = ExpressionWBang()       {return expr;}
+}
+
+Expression ExpressionWBang() :
+{
+  final Expression expr;
+  final int pos = SimpleCharStream.getPosition();
+}
+{
+  <BANG> expr = ExpressionWBang() {return new PrefixedUnaryExpression(expr,OperatorIds.NOT,pos);}
+| expr = ExpressionNoBang() {return expr;}
+}
+
+Expression ExpressionNoBang() :
+{
+  Expression expr;
+}
+{
+  expr = PrintExpression()   {return expr;}
+| expr = ListExpression()    {return expr;}
 }
 
 /**
@@ -1490,19 +1494,27 @@ Expression UnaryExpression() :
   <BIT_AND> expr = UnaryExpressionNoPrefix()
   {return new PrefixedUnaryExpression(expr,OperatorIds.AND,pos);}
 |
-  expr = AtUnaryExpression() {return expr;}
+  expr = AtNotUnaryExpression() {return expr;}
 }
 
-Expression AtUnaryExpression() :
+/**
+ * An expression prefixed (or not) by one or more @ and !.
+ * @return the expression
+ */
+Expression AtNotUnaryExpression() :
 {
   final Expression expr;
   final int pos = SimpleCharStream.getPosition();
 }
 {
   <AT>
-  expr = AtUnaryExpression()
+  expr = AtNotUnaryExpression()
   {return new PrefixedUnaryExpression(expr,OperatorIds.AT,pos);}
 |
+  <BANG>
+  expr = AtNotUnaryExpression()
+  {return new PrefixedUnaryExpression(expr,OperatorIds.NOT,pos);}
+|
   expr = UnaryExpressionNoPrefix()
   {return expr;}
 }
@@ -1528,6 +1540,9 @@ Expression UnaryExpressionNoPrefix() :
 |
   expr = UnaryExpressionNotPlusMinus()
   {return expr;}
+/*|
+  LOOKAHEAD(2)
+  expr = PrintExpression()   {return expr;}*/
 }
 
 
@@ -1617,30 +1632,47 @@ Expression PrimaryExpression() :
   final int pos = SimpleCharStream.getPosition();
 }
 {
-  identifier = <IDENTIFIER>
-  {expr = new ConstantIdentifier(token.image.toCharArray(),
-                                 pos,
-                                 SimpleCharStream.getPosition());}
+  expr = PrimaryPrefix()
   (expr = PrimarySuffix(expr))*
+  [ expr = Arguments(expr) ]
   {return expr;}
 |
-  expr = ArrayDeclarator()
+  <NEW> expr = ClassIdentifier()
+  {expr = new PrefixedUnaryExpression(expr,
+                                      OperatorIds.NEW,
+                                      pos);
+  }
+  [ expr = Arguments(expr) ]
   {return expr;}
 |
-  <NEW> expr = ClassIdentifier()
-  {expr = new PrefixedUnaryExpression(expr,OperatorIds.NEW,pos);}
-  [expr = Arguments(expr)]
+  expr = ArrayDeclarator()
   {return expr;}
 }
 
+Expression PrimaryPrefix() :
+{
+  final Expression expr;
+  final Token token;
+  final String var;
+  final int pos = SimpleCharStream.getPosition();
+}
+{
+  token = <IDENTIFIER>           {return new ConstantIdentifier(token.image.toCharArray(),
+                                                                pos,
+                                                                SimpleCharStream.getPosition());}
+|
+  var = VariableDeclaratorId()   {return new Variable(var.toCharArray(),
+                                                      pos,
+                                                      SimpleCharStream.getPosition());}
+}
+
 AbstractSuffixExpression PrimarySuffix(final Expression prefix) :
 {
   final AbstractSuffixExpression suffix;
   final Expression expr;
 }
 {
-  suffix = Arguments(prefix)      {return suffix;}
-| suffix = VariableSuffix(prefix) {return suffix;}
+  suffix = VariableSuffix(prefix) {return suffix;}
 | <STATICCLASSACCESS> expr = ClassIdentifier()
   {suffix = new ClassAccess(prefix,
                             expr,
@@ -1806,6 +1838,7 @@ final ArrayList list = new ArrayList();
 
 /**
  * A Statement without break.
+ * @return a statement
  */
 Statement StatementNoBreak() :
 {
@@ -1814,34 +1847,11 @@ Statement StatementNoBreak() :
 }
 {
   LOOKAHEAD(2)
-  statement = Expression()
-  try {
-    <SEMICOLON>
-  } catch (ParseException e) {
-    if (e.currentToken.next.kind != PHPParserConstants.PHPEND) {
-      errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. A ';' was expected";
-      errorLevel   = ERROR;
-      errorStart = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1;
-      errorEnd   = SimpleCharStream.getPosition() + 1;
-      throw e;
-    }
-  }
-  {return statement;}
+  statement = expressionStatement()     {return statement;}
 | LOOKAHEAD(1)
-  statement = LabeledStatement() {return statement;}
-| statement = Block()            {return statement;}
-| statement = EmptyStatement()   {return statement;}
-/*| statement = StatementExpression()
-  try {
-    <SEMICOLON>
-  } catch (ParseException e) {
-    errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. A ';' was expected";
-    errorLevel   = ERROR;
-    errorStart   = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1;
-    errorEnd     = SimpleCharStream.getPosition() + 1;
-    throw e;
-  }
-  {return statement;}      */
+  statement = LabeledStatement()        {return statement;}
+| statement = Block()                   {return statement;}
+| statement = EmptyStatement()          {return statement;}
 | statement = SwitchStatement()         {return statement;}
 | statement = IfStatement()             {return statement;}
 | statement = WhileStatement()          {return statement;}
@@ -1861,6 +1871,31 @@ Statement StatementNoBreak() :
 | statement = defineStatement()         {currentSegment.add((Outlineable)statement);return statement;}
 }
 
+/**
+ * A statement expression.
+ * expression ;
+ * @return an expression
+ */
+Statement expressionStatement() :
+{
+  final Statement statement;
+}
+{
+  statement = Expression()
+  try {
+    <SEMICOLON>
+  } catch (ParseException e) {
+    if (e.currentToken.next.kind != PHPParserConstants.PHPEND) {
+      errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. A ';' was expected";
+      errorLevel   = ERROR;
+      errorStart = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1;
+      errorEnd   = SimpleCharStream.getPosition() + 1;
+      throw e;
+    }
+  }
+  {return statement;}
+}
+
 Define defineStatement() :
 {
   final int start = SimpleCharStream.getPosition();
@@ -2148,8 +2183,8 @@ StaticStatement StaticStatement() :
   VariableDeclaration expr;
 }
 {
-  <STATIC> expr = VariableDeclarator() {vars.add(new String(expr.name));}
-  (<COMMA> expr = VariableDeclarator() {vars.add(new String(expr.name));})*
+  <STATIC> expr = VariableDeclarator() {vars.add(new String(expr.name()));}
+  (<COMMA> expr = VariableDeclarator() {vars.add(new String(expr.name()));})*
   try {
     <SEMICOLON>
     {
@@ -2247,6 +2282,9 @@ Statement BlockStatementNoBreak() :
                                    return statement;}
 }
 
+/**
+ * used only by ForInit()
+ */
 VariableDeclaration[] LocalVariableDeclaration() :
 {
   final ArrayList list = new ArrayList();
@@ -2262,6 +2300,9 @@ VariableDeclaration[] LocalVariableDeclaration() :
   return vars;}
 }
 
+/**
+ * used only by LocalVariableDeclaration().
+ */
 VariableDeclaration LocalVariableDeclarator() :
 {
   final String varName;
@@ -2273,12 +2314,12 @@ VariableDeclaration LocalVariableDeclarator() :
   {
    if (initializer == null) {
     return new VariableDeclaration(currentSegment,
-                                  varName.toCharArray(),
+                                  new Variable(varName.toCharArray(),SimpleCharStream.getPosition()-varName.length(),SimpleCharStream.getPosition()),
                                   pos,
                                   SimpleCharStream.getPosition());
    }
     return new VariableDeclaration(currentSegment,
-                                    varName.toCharArray(),
+                                    new Variable(varName.toCharArray(),SimpleCharStream.getPosition()-varName.length(),SimpleCharStream.getPosition()),
                                     initializer,
                                     VariableDeclaration.EQUAL,
                                     pos);
@@ -2295,6 +2336,9 @@ EmptyStatement EmptyStatement() :
    return new EmptyStatement(pos-1,pos);}
 }
 
+/**
+ * used only by StatementExpressionList() which is used only by ForInit() and ForStatement()
+ */
 Expression StatementExpression() :
 {
   final Expression expr,expr2;