Parser: parse a PHP expression after <?= ; statements aren't allowed
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / compiler / parser / Parser.java
index 50dc61f..8770f4a 100644 (file)
@@ -194,8 +194,14 @@ public class Parser implements ITerminalSymbols, CompilerModifiers, ParserBasicI
    */
   private void throwSyntaxError(String error) {
     int problemStartPosition = scanner.getCurrentTokenStartPosition();
-    int problemEndPosition = scanner.getCurrentTokenEndPosition();
-    throwSyntaxError(error, problemStartPosition, problemEndPosition + 1);
+    int problemEndPosition = scanner.getCurrentTokenEndPosition() + 1;
+    if (scanner.source.length <= problemEndPosition && problemEndPosition > 0) {
+      problemEndPosition = scanner.source.length - 1;
+      if (problemStartPosition > 0 && problemStartPosition >= problemEndPosition && problemEndPosition > 0) {
+        problemStartPosition = problemEndPosition - 1;
+      }
+    }
+    throwSyntaxError(error, problemStartPosition, problemEndPosition);
   }
 
   /**
@@ -356,30 +362,9 @@ public class Parser implements ITerminalSymbols, CompilerModifiers, ParserBasicI
           throwSyntaxError("End-of-file not reached.");
         }
         break;
-      } catch (SyntaxError sytaxErr1) {
+      } catch (SyntaxError syntaxError) {
+        //          syntaxError.printStackTrace();
         break;
-        //        // if an error occured,
-        //        // try to find keywords 'abstract' 'final' 'class' or 'function'
-        //        // to parse the rest of the string
-        //        boolean tokenize = scanner.tokenizeStrings;
-        //        if (!tokenize) {
-        //          scanner.tokenizeStrings = true;
-        //        }
-        //        try {
-        //          while (token != TokenNameEOF) {
-        //            if (token == TokenNameabstract || token == TokenNamefinal || token == TokenNameclass || token == TokenNamefunction) {
-        //              break;
-        //            }
-        //            getNextToken();
-        //          }
-        //          if (token == TokenNameEOF) {
-        //            break;
-        //          }
-        //        } catch (SyntaxError sytaxErr2) {
-        //          break;
-        //        } finally {
-        //          scanner.tokenizeStrings = tokenize;
-        //        }
       }
     } while (true);
 
@@ -798,7 +783,19 @@ public class Parser implements ITerminalSymbols, CompilerModifiers, ParserBasicI
       }
       return statement;
     } else if (token == TokenNameINLINE_HTML) {
-      getNextToken();
+      if (scanner.phpExpressionTag) {
+        // start of <?= ... ?> block
+        getNextToken();
+        expr();
+        if (token == TokenNameSEMICOLON) {
+          getNextToken();
+        } 
+        if (token != TokenNameINLINE_HTML) {
+          throwSyntaxError("Missing '?>' for open PHP expression block ('<?=').");
+        }
+      } else {
+        getNextToken();
+      }
       return statement;
       //    } else if (token == TokenNameprint) {
       //      getNextToken();
@@ -2520,7 +2517,7 @@ public class Parser implements ITerminalSymbols, CompilerModifiers, ParserBasicI
       case TokenNameIdentifier:
       case TokenNameVariable:
       case TokenNameDOLLAR:
-        boolean rememberedVar = false; 
+        boolean rememberedVar = false;
         Expression lhs = variable(true, true);
         if (lhs != null && lhs instanceof FieldReference && token != TokenNameEQUAL && token != TokenNamePLUS_EQUAL
             && token != TokenNameMINUS_EQUAL && token != TokenNameMULTIPLY_EQUAL && token != TokenNameDIVIDE_EQUAL
@@ -2654,6 +2651,9 @@ public class Parser implements ITerminalSymbols, CompilerModifiers, ParserBasicI
             getNextToken();
             break;
           } else {
+            //            System.out.println(scanner.getCurrentTokenStartPosition());
+            //            System.out.println(scanner.getCurrentTokenEndPosition());
+
             throwSyntaxError("Error in expression (found token '" + scanner.toStringAction(token) + "').");
           }
         }