*** empty log message ***
[phpeclipse.git] / net.sourceforge.phpeclipse / src / test / PHPParser.jj
index 2b4a1e9..c348a5e 100644 (file)
@@ -29,7 +29,6 @@ import org.eclipse.ui.texteditor.MarkerUtilities;
 import org.eclipse.jface.preference.IPreferenceStore;
 
 import java.util.Hashtable;
-import java.util.Enumeration;
 import java.util.ArrayList;
 import java.io.StringReader;
 import java.io.*;
@@ -188,31 +187,6 @@ public final class PHPParser extends PHPParserSuperclass {
     }
   }
 
-  /**
-   * Create markers according to the external parser output
-   */
-  private static void createMarkers(final String output, final IFile file) throws CoreException {
-    // delete all markers
-    file.deleteMarkers(IMarker.PROBLEM, false, 0);
-
-    int indx = 0;
-    int brIndx;
-    boolean flag = true;
-    while ((brIndx = output.indexOf("<br />", indx)) != -1) {
-      // newer php error output (tested with 4.2.3)
-      scanLine(output, file, indx, brIndx);
-      indx = brIndx + 6;
-      flag = false;
-    }
-    if (flag) {
-      while ((brIndx = output.indexOf("<br>", indx)) != -1) {
-        // older php error output (tested with 4.2.3)
-        scanLine(output, file, indx, brIndx);
-        indx = brIndx + 4;
-      }
-    }
-  }
-
   private static void scanLine(final String output,
                                final IFile file,
                                final int indx,
@@ -302,6 +276,25 @@ public final class PHPParser extends PHPParserSuperclass {
     pushOnAstNodes(new HTMLCode(chars, htmlStart,currentPosition));
   }
 
+  /**
+   * Create a new task.
+   */
+  public static final void createNewTask() {
+    final int currentPosition = SimpleCharStream.getPosition();
+    final String  todo = SimpleCharStream.currentBuffer.substring(currentPosition+1,
+                                                                  SimpleCharStream.currentBuffer.indexOf("\n",
+                                                                                                         currentPosition)-1);
+    try {
+      setMarker(fileToParse,
+                "todo : " + todo,
+                SimpleCharStream.getBeginLine(),
+                TASK,
+                "Line "+SimpleCharStream.getBeginLine());
+    } catch (CoreException e) {
+      PHPeclipsePlugin.log(e);
+    }
+  }
+
   private static final void parse() throws ParseException {
          phpFile();
   }
@@ -342,34 +335,30 @@ PARSER_END(PHPParser)
 <PHPPARSING> SPECIAL_TOKEN :
 {
   "//" : IN_SINGLE_LINE_COMMENT
-|
-  "#"  : IN_SINGLE_LINE_COMMENT
-|
-  <"/**" ~["/"]> { input_stream.backup(1); } : IN_FORMAL_COMMENT
-|
-  "/*" : IN_MULTI_LINE_COMMENT
+| "#"  : IN_SINGLE_LINE_COMMENT
+| <"/**" ~["/"]> { input_stream.backup(1); } : IN_FORMAL_COMMENT
+| "/*" : IN_MULTI_LINE_COMMENT
 }
 
 <IN_SINGLE_LINE_COMMENT> SPECIAL_TOKEN :
 {
   <SINGLE_LINE_COMMENT: "\n" | "\r" | "\r\n" > : PHPPARSING
+| "?>" : DEFAULT
 }
 
-<IN_SINGLE_LINE_COMMENT> SPECIAL_TOKEN :
+<IN_SINGLE_LINE_COMMENT,IN_FORMAL_COMMENT,IN_MULTI_LINE_COMMENT> SPECIAL_TOKEN :
 {
-  <SINGLE_LINE_COMMENT_PHPEND : "?>" > : DEFAULT
+ "todo" {PHPParser.createNewTask();}
 }
 
-<IN_FORMAL_COMMENT>
-SPECIAL_TOKEN :
+<IN_FORMAL_COMMENT> SPECIAL_TOKEN :
 {
-  <FORMAL_COMMENT: "*/" > : PHPPARSING
+  "*/" : PHPPARSING
 }
 
-<IN_MULTI_LINE_COMMENT>
-SPECIAL_TOKEN :
+<IN_MULTI_LINE_COMMENT> SPECIAL_TOKEN :
 {
-  <MULTI_LINE_COMMENT: "*/" > : PHPPARSING
+  "*/" : PHPPARSING
 }
 
 <IN_SINGLE_LINE_COMMENT,IN_FORMAL_COMMENT,IN_MULTI_LINE_COMMENT>
@@ -606,7 +595,7 @@ MORE :
 
 <PHPPARSING> TOKEN :
 {
-  < DOLLAR_ID: <DOLLAR> <IDENTIFIER>  >
+  <DOLLAR_ID: <DOLLAR> <IDENTIFIER>>
 }
 
 void phpFile() :
@@ -614,7 +603,7 @@ void phpFile() :
 {
   try {
     (PhpBlock())*
-    <EOF>
+    {PHPParser.createNewHTMLCode();}
   } catch (TokenMgrError e) {
     PHPeclipsePlugin.log(e);
     errorStart   = SimpleCharStream.getPosition();
@@ -776,8 +765,8 @@ void ClassBodyDeclaration(ClassDeclaration classDeclaration) :
   FieldDeclaration field;
 }
 {
-  method = MethodDeclaration() {method.setParent(classDeclaration);}
-| field = FieldDeclaration()
+  method = MethodDeclaration() {classDeclaration.addMethod(method);}
+| field = FieldDeclaration()   {classDeclaration.addField(field);}
 }
 
 /**
@@ -793,12 +782,10 @@ FieldDeclaration FieldDeclaration() :
 {
   <VAR> variableDeclaration = VariableDeclarator()
   {arrayList.add(variableDeclaration);
-   outlineInfo.addVariable(new String(variableDeclaration.name));
-   currentSegment.add(variableDeclaration);}
+   outlineInfo.addVariable(new String(variableDeclaration.name));}
   ( <COMMA> variableDeclaration = VariableDeclarator()
       {arrayList.add(variableDeclaration);
-       outlineInfo.addVariable(new String(variableDeclaration.name));
-       currentSegment.add(variableDeclaration);}
+       outlineInfo.addVariable(new String(variableDeclaration.name));}
   )*
   try {
     <SEMICOLON>
@@ -859,22 +846,26 @@ VariableDeclaration VariableDeclarator() :
 String VariableDeclaratorId() :
 {
   String expr;
-  Expression expression;
+  Expression expression = null;
   final StringBuffer buff = new StringBuffer();
   final int pos = SimpleCharStream.getPosition();
   ConstantIdentifier ex;
 }
 {
   try {
-    expr = Variable()   {buff.append(expr);}
+    expr = Variable()
     ( LOOKAHEAD(2)
       {ex = new ConstantIdentifier(expr.toCharArray(),
                                    pos,
                                    SimpleCharStream.getPosition());}
       expression = VariableSuffix(ex)
-      {buff.append(expression.toStringExpression());}
     )*
-    {return buff.toString();}
+    {
+     if (expression == null) {
+       return expr;
+     }
+     return expression.toStringExpression();
+    }
   } catch (ParseException e) {
     errorMessage = "'$' expected for variable identifier";
     errorLevel   = ERROR;
@@ -884,6 +875,10 @@ String VariableDeclaratorId() :
   }
 }
 
+/**
+ * Return a variablename without the $.
+ * @return a variable name
+ */
 String Variable():
 {
   final StringBuffer buff;
@@ -905,7 +900,7 @@ String Variable():
   }
 |
   <DOLLAR> expr = VariableName()
-  {return "$" + expr;}
+  {return expr;}
 }
 
 /**
@@ -1019,6 +1014,7 @@ MethodDeclaration MethodDeclaration() :
 {
   final MethodDeclaration functionDeclaration;
   final Block block;
+  final OutlineableWithChildren seg = currentSegment;
 }
 {
   <FUNCTION>
@@ -1033,20 +1029,11 @@ MethodDeclaration MethodDeclaration() :
     errorEnd   = SimpleCharStream.getPosition() + 1;
     throw e;
   }
-  {
-    if (currentSegment != null) {
-      currentSegment.add(functionDeclaration);
-      currentSegment = functionDeclaration;
-    }
-  }
+  {currentSegment = functionDeclaration;}
   block = Block()
-  {
-    functionDeclaration.statements = block.statements;
-    if (currentSegment != null) {
-      currentSegment = (OutlineableWithChildren) currentSegment.getParent();
-    }
-    return functionDeclaration;
-  }
+  {functionDeclaration.statements = block.statements;
+   currentSegment = seg;
+   return functionDeclaration;}
 }
 
 /**
@@ -1076,11 +1063,11 @@ MethodDeclaration MethodDeclarator() :
   }
   formalParameters = FormalParameters()
   {return new MethodDeclaration(currentSegment,
-                                 identifierChar,
-                                 formalParameters,
-                                 reference != null,
-                                 pos,
-                                 SimpleCharStream.getPosition());}
+                                identifierChar,
+                                formalParameters,
+                                reference != null,
+                                pos,
+                                SimpleCharStream.getPosition());}
 }
 
 /**
@@ -1100,7 +1087,7 @@ Hashtable FormalParameters() :
     errorLevel   = ERROR;
     errorStart = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1;
     errorEnd   = SimpleCharStream.getPosition() + 1;
-    throw e;
+    processParseException(e);
   }
             [ var = FormalParameter()
               {parameters.put(new String(var.name),var);}
@@ -1116,7 +1103,7 @@ Hashtable FormalParameters() :
     errorLevel   = ERROR;
     errorStart = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1;
     errorEnd   = SimpleCharStream.getPosition() + 1;
-    throw e;
+    processParseException(e);
   }
  {return parameters;}
 }
@@ -1181,7 +1168,7 @@ Expression Expression() :
 VarAssignation varAssignation() :
 {
   String varName;
-  final Expression expression;
+  final Expression initializer;
   final int assignOperator;
   final int pos = SimpleCharStream.getPosition();
 }
@@ -1189,7 +1176,7 @@ VarAssignation varAssignation() :
   varName = VariableDeclaratorId()
   assignOperator = AssignmentOperator()
     try {
-      expression = Expression()
+      initializer = Expression()
     } catch (ParseException e) {
       if (errorMessage != null) {
         throw e;
@@ -1201,7 +1188,7 @@ VarAssignation varAssignation() :
       throw e;
     }
     {return new VarAssignation(varName.toCharArray(),
-                               expression,
+                               initializer,
                                assignOperator,
                                pos,
                                SimpleCharStream.getPosition());}
@@ -1839,7 +1826,7 @@ HTMLBlock htmlBlock() :
   try {
     (<PHPSTARTLONG> | <PHPSTARTSHORT>)
   } catch (ParseException e) {
-    errorMessage = "End of file unexpected, '<?php' expected";
+    errorMessage = "unexpected end of file , '<?php' expected";
     errorLevel   = ERROR;
     errorStart   = SimpleCharStream.getPosition();
     errorEnd     = SimpleCharStream.getPosition();
@@ -2121,6 +2108,7 @@ Statement BlockStatement() :
   statement = Statement()         {if (phpDocument == currentSegment) pushOnAstNodes(statement);
                                    return statement;}
   } catch (ParseException e) {
+    if (errorMessage != null) throw e;
     errorMessage = "statement expected";
     errorLevel   = ERROR;
     errorStart = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1;
@@ -2129,6 +2117,7 @@ Statement BlockStatement() :
   }
 | statement = ClassDeclaration()  {return statement;}
 | statement = MethodDeclaration() {if (phpDocument == currentSegment) pushOnAstNodes(statement);
+                                   currentSegment.add((MethodDeclaration) statement);
                                    return statement;}
 }
 
@@ -2142,7 +2131,8 @@ Statement BlockStatementNoBreak() :
 {
   statement = StatementNoBreak()  {return statement;}
 | statement = ClassDeclaration()  {return statement;}
-| statement = MethodDeclaration() {return statement;}
+| statement = MethodDeclaration() {currentSegment.add((MethodDeclaration) statement);
+                                   return statement;}
 }
 
 VariableDeclaration[] LocalVariableDeclaration() :