X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/test/PHPParser.java b/net.sourceforge.phpeclipse/src/test/PHPParser.java index 831f354..301d62c 100644 --- a/net.sourceforge.phpeclipse/src/test/PHPParser.java +++ b/net.sourceforge.phpeclipse/src/test/PHPParser.java @@ -64,7 +64,7 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon /** The cursor in expression stack. */ private static int nodePtr; - public static final boolean PARSER_DEBUG = true; + public static final boolean PARSER_DEBUG = false; public final void setFileToParse(final IFile fileToParse) { PHPParser.fileToParse = fileToParse; @@ -209,14 +209,14 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon e.currentToken.sourceStart, e.currentToken.sourceEnd, errorLevel, - "Line " + e.currentToken.beginLine+", "+e.currentToken.sourceStart+":"+e.currentToken.sourceEnd); + "Line " + e.currentToken.beginLine+", "+e.currentToken.sourceStart+':'+e.currentToken.sourceEnd); } else { setMarker(fileToParse, errorMessage, errorStart, errorEnd, errorLevel, - "Line " + e.currentToken.beginLine+", "+errorStart+":"+errorEnd); + "Line " + e.currentToken.beginLine+", "+errorStart+':'+errorEnd); errorStart = -1; errorEnd = -1; } @@ -312,9 +312,8 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon currentPosition > SimpleCharStream.currentBuffer.length()) { return; } - final char[] chars = SimpleCharStream.currentBuffer.substring(htmlStart, - currentPosition).toCharArray(); - pushOnAstNodes(new HTMLCode(chars, htmlStart,currentPosition)); + final String html = SimpleCharStream.currentBuffer.substring(htmlStart, currentPosition); + pushOnAstNodes(new HTMLCode(html, htmlStart,currentPosition)); } /** Create a new task. */ @@ -396,6 +395,7 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon case INTEGER_LITERAL: case FLOATING_POINT_LITERAL: case STRING_LITERAL: + case DOUBLEQUOTE: case DOLLAR: case IDENTIFIER: case LPAREN: @@ -473,6 +473,7 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon case INTEGER_LITERAL: case FLOATING_POINT_LITERAL: case STRING_LITERAL: + case DOUBLEQUOTE: case DOLLAR: case IDENTIFIER: case LPAREN: @@ -516,8 +517,8 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon } catch (ParseException e) { errorMessage = "'?>' expected"; errorLevel = ERROR; - errorStart = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1; - errorEnd = SimpleCharStream.getPosition() + 1; + errorStart = e.currentToken.sourceStart; + errorEnd = e.currentToken.sourceEnd; processParseExceptionDebug(e); } break; @@ -593,6 +594,7 @@ public final class PHPParser extends PHPParserSuperclass implements PHPParserCon case INTEGER_LITERAL: case FLOATING_POINT_LITERAL: case STRING_LITERAL: + case DOUBLEQUOTE: case DOLLAR: case IDENTIFIER: case LPAREN: @@ -683,8 +685,8 @@ Token token; } catch (ParseException e) { errorMessage = "unexpected token : '"+ e.currentToken.next.image + "'. '{' expected"; errorLevel = ERROR; - errorStart = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1; - errorEnd = SimpleCharStream.getPosition() + 1; + errorStart = e.currentToken.sourceStart; + errorEnd = e.currentToken.sourceEnd; processParseExceptionDebug(e); } label_3: @@ -706,8 +708,8 @@ Token token; } catch (ParseException e) { errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. 'var', 'function' or '}' expected"; errorLevel = ERROR; - errorStart = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1; - errorEnd = SimpleCharStream.getPosition() + 1; + errorStart = e.currentToken.sourceStart; + errorEnd = e.currentToken.sourceEnd; processParseExceptionDebug(e); {if (true) return PHPParser.token.sourceEnd;} } @@ -751,7 +753,6 @@ Token token; token = jj_consume_token(VAR); variableDeclaration = VariableDeclaratorNoSuffix(); arrayList.add(variableDeclaration); - outlineInfo.addVariable(variableDeclaration.name()); pos = variableDeclaration.sourceEnd; label_4: while (true) { @@ -914,8 +915,8 @@ Token token; } catch (ParseException e) { errorMessage = "'$' expected for variable identifier"; errorLevel = ERROR; - errorStart = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1; - errorEnd = SimpleCharStream.getPosition() + 1; + errorStart = e.currentToken.sourceStart; + errorEnd = e.currentToken.sourceEnd; {if (true) throw e;} } throw new Error("Missing return statement in function"); @@ -925,12 +926,12 @@ Token token; Variable variable = null; final Token token; token = jj_consume_token(DOLLAR); - variable = Var(token); - {if (true) return new Variable(variable,token.sourceEnd,variable.sourceEnd);} + variable = Var(); + {if (true) return variable;} throw new Error("Missing return statement in function"); } - static final public Variable Var(final Token dollar) throws ParseException { + static final public Variable Var() throws ParseException { Variable variable = null; final Token token,token2; ConstantIdentifier constant; @@ -938,20 +939,21 @@ Token token; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case DOLLAR: token = jj_consume_token(DOLLAR); - variable = Var(token); - {if (true) return new Variable(variable,dollar.sourceEnd,variable.sourceEnd);} + variable = Var(); + {if (true) return new Variable(variable,variable.sourceStart,variable.sourceEnd);} break; case LBRACE: token = jj_consume_token(LBRACE); expression = Expression(); token2 = jj_consume_token(RBRACE); {if (true) return new Variable(expression, - dollar.sourceStart, + token.sourceStart, token2.sourceEnd);} break; case IDENTIFIER: token = jj_consume_token(IDENTIFIER); - {if (true) return new Variable(token.image,dollar.sourceStart,token.sourceEnd);} + outlineInfo.addVariable('$' + token.image); + {if (true) return new Variable(token.image,token.sourceStart,token.sourceEnd);} break; default: jj_la1[13] = jj_gen; @@ -971,6 +973,7 @@ Token token; case INTEGER_LITERAL: case FLOATING_POINT_LITERAL: case STRING_LITERAL: + case DOUBLEQUOTE: expr = Literal(); {if (true) return expr;} break; @@ -1066,6 +1069,7 @@ final Expression expr,expr2; case INTEGER_LITERAL: case FLOATING_POINT_LITERAL: case STRING_LITERAL: + case DOUBLEQUOTE: case DOLLAR: case IDENTIFIER: case LPAREN: @@ -1120,8 +1124,8 @@ final Expression expr,expr2; if (errorMessage != null) {if (true) throw e;} errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', function identifier expected"; errorLevel = ERROR; - errorStart = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1; - errorEnd = SimpleCharStream.getPosition() + 1; + errorStart = e.currentToken.sourceStart; + errorEnd = e.currentToken.sourceEnd; {if (true) throw e;} } currentSegment = functionDeclaration; @@ -1140,7 +1144,7 @@ final Expression expr,expr2; static final public MethodDeclaration MethodDeclarator(final int start) throws ParseException { Token identifier = null; Token reference = null; - final Hashtable formalParameters = new Hashtable(); + final ArrayList formalParameters = new ArrayList(); String identifierChar = SYNTAX_ERROR_CHAR; int end = start; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -1192,7 +1196,7 @@ final Expression expr,expr2; * FormalParameters follows method identifier. * (FormalParameter()) */ - static final public int FormalParameters(final Hashtable parameters) throws ParseException { + static final public int FormalParameters(final ArrayList parameters) throws ParseException { VariableDeclaration var; final Token token; Token tok = PHPParser.token; @@ -1211,7 +1215,7 @@ final Expression expr,expr2; case BIT_AND: case DOLLAR: var = FormalParameter(); - parameters.put(var.name(),var);end = var.sourceEnd; + parameters.add(var);end = var.sourceEnd; label_7: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { @@ -1224,7 +1228,7 @@ final Expression expr,expr2; } jj_consume_token(COMMA); var = FormalParameter(); - parameters.put(var.name(),var);end = var.sourceEnd; + parameters.add(var);end = var.sourceEnd; } break; default: @@ -1261,6 +1265,7 @@ final Expression expr,expr2; ; } variableDeclaration = VariableDeclaratorNoSuffix(); + outlineInfo.addVariable('$'+variableDeclaration.name()); if (token != null) { variableDeclaration.setReference(true); } @@ -1336,6 +1341,7 @@ final Expression expr,expr2; case INTEGER_LITERAL: case FLOATING_POINT_LITERAL: case STRING_LITERAL: + case DOUBLEQUOTE: case DOLLAR: case IDENTIFIER: case LPAREN: @@ -1882,7 +1888,7 @@ final Expression expr,expr2; expr = UnaryExpression(); } catch (ParseException e) { if (errorMessage != null) {if (true) throw e;} - errorMessage = "unexpected token '"+e.currentToken.next.image+"'"; + errorMessage = "unexpected token '"+e.currentToken.next.image+'\''; errorLevel = ERROR; errorStart = PHPParser.token.sourceStart; errorEnd = PHPParser.token.sourceEnd; @@ -1970,6 +1976,7 @@ final Expression expr,expr2; case INTEGER_LITERAL: case FLOATING_POINT_LITERAL: case STRING_LITERAL: + case DOUBLEQUOTE: case DOLLAR: case IDENTIFIER: case LPAREN: @@ -2015,6 +2022,7 @@ final Expression expr,expr2; case INTEGER_LITERAL: case FLOATING_POINT_LITERAL: case STRING_LITERAL: + case DOUBLEQUOTE: case DOLLAR: case IDENTIFIER: case LPAREN: @@ -2061,6 +2069,7 @@ final Expression expr,expr2; case INTEGER_LITERAL: case FLOATING_POINT_LITERAL: case STRING_LITERAL: + case DOUBLEQUOTE: case DOLLAR: case IDENTIFIER: case LPAREN: @@ -2119,6 +2128,7 @@ final Token token; case INTEGER_LITERAL: case FLOATING_POINT_LITERAL: case STRING_LITERAL: + case DOUBLEQUOTE: expr = Literal(); {if (true) return expr;} break; @@ -2452,6 +2462,7 @@ final Token token,token1; case INTEGER_LITERAL: case FLOATING_POINT_LITERAL: case STRING_LITERAL: + case DOUBLEQUOTE: case DOLLAR: case IDENTIFIER: case LPAREN: @@ -2474,6 +2485,7 @@ final Token token,token1; case INTEGER_LITERAL: case FLOATING_POINT_LITERAL: case STRING_LITERAL: + case DOUBLEQUOTE: case DOLLAR: case IDENTIFIER: case LPAREN: @@ -2545,6 +2557,7 @@ final Token token,token1; case INTEGER_LITERAL: case FLOATING_POINT_LITERAL: case STRING_LITERAL: + case DOUBLEQUOTE: case DOLLAR: case IDENTIFIER: case LPAREN: @@ -2567,6 +2580,7 @@ final Token token,token1; case INTEGER_LITERAL: case FLOATING_POINT_LITERAL: case STRING_LITERAL: + case DOUBLEQUOTE: case DOLLAR: case IDENTIFIER: case LPAREN: @@ -2617,6 +2631,7 @@ final Token token,token1; static final public Literal Literal() throws ParseException { final Token token; + StringLiteral literal; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case INTEGER_LITERAL: token = jj_consume_token(INTEGER_LITERAL); @@ -2642,6 +2657,10 @@ final Token token,token1; token = jj_consume_token(NULL); {if (true) return new NullLiteral(token);} break; + case DOUBLEQUOTE: + literal = evaluableString(); + {if (true) return literal;} + break; default: jj_la1[71] = jj_gen; jj_consume_token(-1); @@ -2650,10 +2669,59 @@ final Token token,token1; throw new Error("Missing return statement in function"); } + static final public StringLiteral evaluableString() throws ParseException { + ArrayList list = new ArrayList(); + Token start,end; + Token token,lbrace,rbrace; + AbstractVariable var; + Expression expr; + start = jj_consume_token(DOUBLEQUOTE); + label_20: + while (true) { + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case DOLLARS: + ; + break; + default: + jj_la1[72] = jj_gen; + break label_20; + } + jj_consume_token(DOLLARS); + switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { + case IDENTIFIER: + token = jj_consume_token(IDENTIFIER); + list.add(new Variable(token.image, + token.sourceStart, + token.sourceEnd)); + break; + case LBRACE1: + lbrace = jj_consume_token(LBRACE1); + token = jj_consume_token(ID); + list.add(new Variable(token.image, + token.sourceStart, + token.sourceEnd)); + rbrace = jj_consume_token(RBRACE1); + break; + default: + jj_la1[73] = jj_gen; + jj_consume_token(-1); + throw new ParseException(); + } + } + end = jj_consume_token(DOUBLEQUOTE2); + AbstractVariable[] vars = new AbstractVariable[list.size()]; + list.toArray(vars); + {if (true) return new StringLiteral(SimpleCharStream.currentBuffer.substring(start.sourceEnd,end.sourceStart), + start.sourceStart, + end.sourceEnd, + vars);} + throw new Error("Missing return statement in function"); + } + static final public FunctionCall Arguments(final Expression func) throws ParseException { Expression[] args = null; -final Token token; - jj_consume_token(LPAREN); +final Token token,lparen; + lparen = jj_consume_token(LPAREN); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ARRAY: case LIST: @@ -2673,13 +2741,14 @@ final Token token; case INTEGER_LITERAL: case FLOATING_POINT_LITERAL: case STRING_LITERAL: + case DOUBLEQUOTE: case DOLLAR: case IDENTIFIER: case LPAREN: args = ArgumentList(); break; default: - jj_la1[72] = jj_gen; + jj_la1[74] = jj_gen; ; } try { @@ -2688,11 +2757,17 @@ final Token token; } catch (ParseException e) { errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', ')' expected to close the argument list"; errorLevel = ERROR; - errorStart = args[args.length-1].sourceEnd+1; - errorEnd = args[args.length-1].sourceEnd+1; + if (args == null) { + errorStart = lparen.sourceEnd+1; + errorEnd = lparen.sourceEnd+2; + } else { + errorStart = args[args.length-1].sourceEnd+1; + errorEnd = args[args.length-1].sourceEnd+2; + } processParseExceptionDebug(e); } - {if (true) return new FunctionCall(func,args,args[args.length-1].sourceEnd);} + int sourceEnd = (args == null && args.length != 0) ? lparen.sourceEnd+1 : args[args.length-1].sourceEnd; + {if (true) return new FunctionCall(func,args,sourceEnd);} throw new Error("Missing return statement in function"); } @@ -2708,15 +2783,15 @@ int pos; Token token; arg = Expression(); list.add(arg);pos = arg.sourceEnd; - label_20: + label_21: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case COMMA: ; break; default: - jj_la1[73] = jj_gen; - break label_20; + jj_la1[75] = jj_gen; + break label_21; } token = jj_consume_token(COMMA); pos = token.sourceEnd; @@ -2808,7 +2883,7 @@ Token token; token = jj_consume_token(AT); break; default: - jj_la1[74] = jj_gen; + jj_la1[76] = jj_gen; ; } statement = IncludeStatement(); @@ -2831,7 +2906,7 @@ Token token; currentSegment.add((Outlineable)statement);{if (true) return statement;} break; default: - jj_la1[75] = jj_gen; + jj_la1[77] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -2971,6 +3046,7 @@ Token token; case INTEGER_LITERAL: case FLOATING_POINT_LITERAL: case STRING_LITERAL: + case DOUBLEQUOTE: case DOLLAR: case IDENTIFIER: case LPAREN: @@ -2984,7 +3060,7 @@ Token token; {if (true) return statement;} break; default: - jj_la1[76] = jj_gen; + jj_la1[78] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -3001,15 +3077,15 @@ Token token; final Token phpEnd; phpEnd = jj_consume_token(PHPEND); htmlStart = phpEnd.sourceEnd; - label_21: + label_22: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case PHPECHOSTART: ; break; default: - jj_la1[77] = jj_gen; - break label_21; + jj_la1[79] = jj_gen; + break label_22; } phpEchoBlock(); } @@ -3022,7 +3098,7 @@ Token token; jj_consume_token(PHPSTARTSHORT); break; default: - jj_la1[78] = jj_gen; + jj_la1[80] = jj_gen; jj_consume_token(-1); throw new ParseException(); } @@ -3030,8 +3106,8 @@ Token token; } catch (ParseException e) { errorMessage = "unexpected end of file , '= 0) { la1tokens[jj_kind] = true; jj_kind = -1; } - for (int i = 0; i < 126; i++) { + for (int i = 0; i < 128; i++) { if (jj_la1[i] == jj_gen) { for (int j = 0; j < 32; j++) { if ((jj_la1_0[i] & (1<