X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Scanner.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Scanner.java index a483ee4..6b1e495 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Scanner.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Scanner.java @@ -39,7 +39,9 @@ public class Scanner implements IScanner, ITerminalSymbols { public boolean phpMode = false; - public Stack encapsedStringStack = null; + public boolean phpExpressionTag = false; + +// public Stack encapsedStringStack = null; public char currentCharacter; @@ -1101,36 +1103,12 @@ public class Scanner implements IScanner, ITerminalSymbols { public void consumeStringLiteral() throws InvalidInputException { try { + boolean openDollarBrace = false; // consume next character unicodeAsBackSlash = false; currentCharacter = source[currentPosition++]; - // if (((currentCharacter = source[currentPosition++]) == '\\') - // && (source[currentPosition] == 'u')) { - // getNextUnicodeChar(); - // } else { - // if (withoutUnicodePtr != 0) { - // withoutUnicodeBuffer[++withoutUnicodePtr] = - // currentCharacter; - // } - // } - while (currentCharacter != '"') { + while (currentCharacter != '"' || openDollarBrace) { /** ** in PHP \r and \n are valid in string literals *** */ - // if ((currentCharacter == '\n') - // || (currentCharacter == '\r')) { - // // relocate if finding another quote fairly close: thus unicode - // '/u000D' will be fully consumed - // for (int lookAhead = 0; lookAhead < 50; lookAhead++) { - // if (currentPosition + lookAhead == source.length) - // break; - // if (source[currentPosition + lookAhead] == '\n') - // break; - // if (source[currentPosition + lookAhead] == '\"') { - // currentPosition += lookAhead + 1; - // break; - // } - // } - // throw new InvalidInputException(INVALID_CHAR_IN_STRING); - // } if (currentCharacter == '\\') { int escapeSize = currentPosition; boolean backSlashAsUnicodeInString = unicodeAsBackSlash; @@ -1150,6 +1128,12 @@ public class Scanner implements IScanner, ITerminalSymbols { withoutUnicodePtr--; } } + } else if (currentCharacter == '$' && source[currentPosition] == '{') { + openDollarBrace = true; + } else if (currentCharacter == '{' && source[currentPosition] == '$') { + openDollarBrace = true; + } else if (currentCharacter == '}') { + openDollarBrace = false; } else if ((currentCharacter == '\r') || (currentCharacter == '\n')) { if (recordLineSeparator) { pushLineSeparator(); @@ -1158,14 +1142,9 @@ public class Scanner implements IScanner, ITerminalSymbols { // consume next character unicodeAsBackSlash = false; currentCharacter = source[currentPosition++]; - // if (((currentCharacter = source[currentPosition++]) == '\\') - // && (source[currentPosition] == 'u')) { - // getNextUnicodeChar(); - // } else { if (withoutUnicodePtr != 0) { withoutUnicodeBuffer[++withoutUnicodePtr] = currentCharacter; } - // } } } catch (IndexOutOfBoundsException e) { // reset end position for error reporting @@ -1200,8 +1179,9 @@ public class Scanner implements IScanner, ITerminalSymbols { } public int getNextToken() throws InvalidInputException { + phpExpressionTag = false; if (!phpMode) { - return getInlinedHTML(currentPosition); + return getInlinedHTMLToken(currentPosition); } if (phpMode) { this.wasAcr = false; @@ -1215,139 +1195,139 @@ public class Scanner implements IScanner, ITerminalSymbols { withoutUnicodePtr = 0; //start with a new token char encapsedChar = ' '; - if (!encapsedStringStack.isEmpty()) { - encapsedChar = ((Character) encapsedStringStack.peek()).charValue(); - } - if (encapsedChar != '$' && encapsedChar != ' ') { - currentCharacter = source[currentPosition++]; - if (currentCharacter == encapsedChar) { - switch (currentCharacter) { - case '`': - return TokenNameEncapsedString0; - case '\'': - return TokenNameEncapsedString1; - case '"': - return TokenNameEncapsedString2; - } - } - while (currentCharacter != encapsedChar) { - /** ** in PHP \r and \n are valid in string literals *** */ - switch (currentCharacter) { - case '\\': - int escapeSize = currentPosition; - boolean backSlashAsUnicodeInString = unicodeAsBackSlash; - //scanEscapeCharacter make a side effect on this value and - // we need the previous value few lines down this one - scanDoubleQuotedEscapeCharacter(); - escapeSize = currentPosition - escapeSize; - if (withoutUnicodePtr == 0) { - //buffer all the entries that have been left aside.... - withoutUnicodePtr = currentPosition - escapeSize - 1 - startPosition; - System.arraycopy(source, startPosition, withoutUnicodeBuffer, 1, withoutUnicodePtr); - withoutUnicodeBuffer[++withoutUnicodePtr] = currentCharacter; - } else { //overwrite the / in the buffer - withoutUnicodeBuffer[withoutUnicodePtr] = currentCharacter; - if (backSlashAsUnicodeInString) { //there are TWO \ in - withoutUnicodePtr--; - } - } - break; - case '\r': - case '\n': - if (recordLineSeparator) { - pushLineSeparator(); - } - break; - case '$': - if (isPHPIdentifierStart(source[currentPosition]) || source[currentPosition] == '{') { - currentPosition--; - encapsedStringStack.push(new Character('$')); - return TokenNameSTRING; - } - break; - case '{': - if (source[currentPosition] == '$') { // CURLY_OPEN - currentPosition--; - encapsedStringStack.push(new Character('$')); - return TokenNameSTRING; - } - } - // consume next character - unicodeAsBackSlash = false; - currentCharacter = source[currentPosition++]; - if (withoutUnicodePtr != 0) { - withoutUnicodeBuffer[++withoutUnicodePtr] = currentCharacter; - } - // } - } // end while - currentPosition--; - return TokenNameSTRING; - } + // if (!encapsedStringStack.isEmpty()) { + // encapsedChar = ((Character) encapsedStringStack.peek()).charValue(); + // } + // if (encapsedChar != '$' && encapsedChar != ' ') { + // currentCharacter = source[currentPosition++]; + // if (currentCharacter == encapsedChar) { + // switch (currentCharacter) { + // case '`': + // return TokenNameEncapsedString0; + // case '\'': + // return TokenNameEncapsedString1; + // case '"': + // return TokenNameEncapsedString2; + // } + // } + // while (currentCharacter != encapsedChar) { + // /** ** in PHP \r and \n are valid in string literals *** */ + // switch (currentCharacter) { + // case '\\': + // int escapeSize = currentPosition; + // boolean backSlashAsUnicodeInString = unicodeAsBackSlash; + // //scanEscapeCharacter make a side effect on this value and + // // we need the previous value few lines down this one + // scanDoubleQuotedEscapeCharacter(); + // escapeSize = currentPosition - escapeSize; + // if (withoutUnicodePtr == 0) { + // //buffer all the entries that have been left aside.... + // withoutUnicodePtr = currentPosition - escapeSize - 1 - startPosition; + // System.arraycopy(source, startPosition, withoutUnicodeBuffer, 1, withoutUnicodePtr); + // withoutUnicodeBuffer[++withoutUnicodePtr] = currentCharacter; + // } else { //overwrite the / in the buffer + // withoutUnicodeBuffer[withoutUnicodePtr] = currentCharacter; + // if (backSlashAsUnicodeInString) { //there are TWO \ in + // withoutUnicodePtr--; + // } + // } + // break; + // case '\r': + // case '\n': + // if (recordLineSeparator) { + // pushLineSeparator(); + // } + // break; + // case '$': + // if (isPHPIdentifierStart(source[currentPosition]) || source[currentPosition] == '{') { + // currentPosition--; + // encapsedStringStack.push(new Character('$')); + // return TokenNameSTRING; + // } + // break; + // case '{': + // if (source[currentPosition] == '$') { // CURLY_OPEN + // currentPosition--; + // encapsedStringStack.push(new Character('$')); + // return TokenNameSTRING; + // } + // } + // // consume next character + // unicodeAsBackSlash = false; + // currentCharacter = source[currentPosition++]; + // if (withoutUnicodePtr != 0) { + // withoutUnicodeBuffer[++withoutUnicodePtr] = currentCharacter; + // } + // // } + // } // end while + // currentPosition--; + // return TokenNameSTRING; + // } // ---------Consume white space and handles startPosition--------- int whiteStart = currentPosition; startPosition = currentPosition; currentCharacter = source[currentPosition++]; - if (encapsedChar == '$') { - switch (currentCharacter) { - case '\\': - currentCharacter = source[currentPosition++]; - return TokenNameSTRING; - case '{': - if (encapsedChar == '$') { - if (getNextChar('$')) - return TokenNameLBRACE_DOLLAR; - } - return TokenNameLBRACE; - case '}': - return TokenNameRBRACE; - case '[': - return TokenNameLBRACKET; - case ']': - return TokenNameRBRACKET; - case '\'': - if (tokenizeStrings) { - consumeStringConstant(); - return TokenNameStringSingleQuote; - } - return TokenNameEncapsedString1; - case '"': - return TokenNameEncapsedString2; - case '`': - if (tokenizeStrings) { - consumeStringInterpolated(); - return TokenNameStringInterpolated; - } - return TokenNameEncapsedString0; - case '-': - if (getNextChar('>')) - return TokenNameMINUS_GREATER; - return TokenNameSTRING; - default: - if (currentCharacter == '$') { - int oldPosition = currentPosition; - try { - currentCharacter = source[currentPosition++]; - if (currentCharacter == '{') { - return TokenNameDOLLAR_LBRACE; - } - if (isPHPIdentifierStart(currentCharacter)) { - return scanIdentifierOrKeyword(true); - } else { - currentPosition = oldPosition; - return TokenNameSTRING; - } - } catch (IndexOutOfBoundsException e) { - currentPosition = oldPosition; - return TokenNameSTRING; - } - } - if (isPHPIdentifierStart(currentCharacter)) - return scanIdentifierOrKeyword(false); - if (Character.isDigit(currentCharacter)) - return scanNumber(false); - return TokenNameERROR; - } - } + // if (encapsedChar == '$') { + // switch (currentCharacter) { + // case '\\': + // currentCharacter = source[currentPosition++]; + // return TokenNameSTRING; + // case '{': + // if (encapsedChar == '$') { + // if (getNextChar('$')) + // return TokenNameLBRACE_DOLLAR; + // } + // return TokenNameLBRACE; + // case '}': + // return TokenNameRBRACE; + // case '[': + // return TokenNameLBRACKET; + // case ']': + // return TokenNameRBRACKET; + // case '\'': + // if (tokenizeStrings) { + // consumeStringConstant(); + // return TokenNameStringSingleQuote; + // } + // return TokenNameEncapsedString1; + // case '"': + // return TokenNameEncapsedString2; + // case '`': + // if (tokenizeStrings) { + // consumeStringInterpolated(); + // return TokenNameStringInterpolated; + // } + // return TokenNameEncapsedString0; + // case '-': + // if (getNextChar('>')) + // return TokenNameMINUS_GREATER; + // return TokenNameSTRING; + // default: + // if (currentCharacter == '$') { + // int oldPosition = currentPosition; + // try { + // currentCharacter = source[currentPosition++]; + // if (currentCharacter == '{') { + // return TokenNameDOLLAR_LBRACE; + // } + // if (isPHPIdentifierStart(currentCharacter)) { + // return scanIdentifierOrKeyword(true); + // } else { + // currentPosition = oldPosition; + // return TokenNameSTRING; + // } + // } catch (IndexOutOfBoundsException e) { + // currentPosition = oldPosition; + // return TokenNameSTRING; + // } + // } + // if (isPHPIdentifierStart(currentCharacter)) + // return scanIdentifierOrKeyword(false); + // if (Character.isDigit(currentCharacter)) + // return scanNumber(false); + // return TokenNameERROR; + // } + // } // boolean isWhiteSpace; while ((currentCharacter == ' ') || Character.isWhitespace(currentCharacter)) { @@ -1553,7 +1533,7 @@ public class Scanner implements IScanner, ITerminalSymbols { phpMode = true; return TokenNameINLINE_HTML; } - return getInlinedHTML(currentPosition - 2); + return getInlinedHTMLToken(currentPosition - 2); } return TokenNameQUESTION; case ':': @@ -1566,17 +1546,17 @@ public class Scanner implements IScanner, ITerminalSymbols { consumeStringConstant(); return TokenNameStringSingleQuote; case '"': - if (tokenizeStrings) { +// if (tokenizeStrings) { consumeStringLiteral(); return TokenNameStringDoubleQuote; - } - return TokenNameEncapsedString2; +// } +// return TokenNameEncapsedString2; case '`': - if (tokenizeStrings) { +// if (tokenizeStrings) { consumeStringInterpolated(); return TokenNameStringInterpolated; - } - return TokenNameEncapsedString0; +// } +// return TokenNameEncapsedString0; case '#': case '/': { char startChar = currentCharacter; @@ -1632,6 +1612,7 @@ public class Scanner implements IScanner, ITerminalSymbols { this.lastCommentLinePosition = this.currentPosition; if (currentCharacter == '?') { if (getNextChar('>')) { + // ?> breaks line comments startPosition = currentPosition - 2; phpMode = false; return TokenNameINLINE_HTML; @@ -1852,39 +1833,6 @@ public class Scanner implements IScanner, ITerminalSymbols { return TokenNameEOF; } - private int getInlinedHTML(int start) throws InvalidInputException { - int token = getInlinedHTMLToken(start); - if (token == TokenNameINLINE_HTML) { - // Stack stack = new Stack(); - // // scan html for errors - // Source inlinedHTMLSource = new Source(new String(source, startPosition, currentPosition - startPosition)); - // int lastPHPEndPos=0; - // for (Iterator i=inlinedHTMLSource.getNextTagIterator(0); i.hasNext();) { - // Tag tag=(Tag)i.next(); - // - // if (tag instanceof StartTag) { - // StartTag startTag=(StartTag)tag; - // // System.out.println("startTag: "+tag); - // if (startTag.isServerTag()) { - // // TODO : what to do with a server tag ? - // } else { - // // do whatever with HTML start tag - // // use startTag.getElement() to find the element corresponding - // // to this start tag which may be useful if you implement code - // // folding etc - // stack.push(startTag); - // } - // } else { - // EndTag endTag=(EndTag)tag; - // StartTag stag = (StartTag) stack.peek(); - //// System.out.println("endTag: "+tag); - // // do whatever with HTML end tag. - // } - // } - } - return token; - } - /** * @return * @throws InvalidInputException @@ -1904,9 +1852,11 @@ public class Scanner implements IScanner, ITerminalSymbols { if ((currentCharacter != 'P') && (currentCharacter != 'p')) { if (currentCharacter != '=') { //