X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/test/PHPParser.jj b/net.sourceforge.phpeclipse/src/test/PHPParser.jj index e69a928..35b3173 100644 --- a/net.sourceforge.phpeclipse/src/test/PHPParser.jj +++ b/net.sourceforge.phpeclipse/src/test/PHPParser.jj @@ -29,7 +29,6 @@ import org.eclipse.ui.texteditor.MarkerUtilities; import org.eclipse.jface.preference.IPreferenceStore; import java.util.Hashtable; -import java.util.ArrayList; import java.util.Enumeration; import java.io.StringReader; import java.io.*; @@ -38,6 +37,7 @@ import java.text.MessageFormat; import net.sourceforge.phpeclipse.actions.PHPStartApacheAction; import net.sourceforge.phpeclipse.PHPeclipsePlugin; import net.sourceforge.phpdt.internal.compiler.parser.*; +import net.sourceforge.phpdt.internal.compiler.ast.*; /** * A new php parser. @@ -51,14 +51,15 @@ public final class PHPParser extends PHPParserSuperclass { /** The file that is parsed. */ private static IFile fileToParse; - /** The current segment */ + /** The current segment. */ private static PHPSegmentWithChildren currentSegment; private static final String PARSE_ERROR_STRING = "Parse error"; //$NON-NLS-1$ private static final String PARSE_WARNING_STRING = "Warning"; //$NON-NLS-1$ - PHPOutlineInfo outlineInfo; + static PHPOutlineInfo outlineInfo; private static PHPFunctionDeclaration currentFunction; + private static boolean assigning; /** The error level of the current ParseException. */ private static int errorLevel = ERROR; @@ -68,13 +69,20 @@ public final class PHPParser extends PHPParserSuperclass { private static int errorStart = -1; private static int errorEnd = -1; - public PHPParser() { - } + //ast stack + private final static int AstStackIncrement = 100; + /** The stack of node. */ + private static AstNode[] astStack; + /** The cursor in expression stack. */ + private static int expressionPtr; public final void setFileToParse(final IFile fileToParse) { this.fileToParse = fileToParse; } + public PHPParser() { + } + public PHPParser(final IFile fileToParse) { this(new StringReader("")); this.fileToParse = fileToParse; @@ -87,6 +95,7 @@ public final class PHPParser extends PHPParserSuperclass { jj_input_stream = new SimpleCharStream(stream, 1, 1); } ReInit(new StringReader(strEval)); + astStack = new AstNode[AstStackIncrement]; phpTest(); } @@ -97,6 +106,7 @@ public final class PHPParser extends PHPParserSuperclass { jj_input_stream = new SimpleCharStream(stream, 1, 1); } ReInit(stream); + astStack = new AstNode[AstStackIncrement]; phpFile(); } catch (FileNotFoundException e) { e.printStackTrace(); //To change body of catch statement use Options | File Templates. @@ -109,6 +119,7 @@ public final class PHPParser extends PHPParserSuperclass { jj_input_stream = new SimpleCharStream(stream, 1, 1); } ReInit(stream); + astStack = new AstNode[AstStackIncrement]; phpFile(); } @@ -120,6 +131,7 @@ public final class PHPParser extends PHPParserSuperclass { jj_input_stream = new SimpleCharStream(stream, 1, 1); } ReInit(stream); + astStack = new AstNode[AstStackIncrement]; try { parse(); } catch (ParseException e) { @@ -244,6 +256,7 @@ public final class PHPParser extends PHPParserSuperclass { jj_input_stream = new SimpleCharStream(stream, 1, 1); } ReInit(stream); + astStack = new AstNode[AstStackIncrement]; try { parse(); } catch (ParseException e) { @@ -273,7 +286,7 @@ public final class PHPParser extends PHPParserSuperclass { } } - public static final void parse() throws ParseException { + private static final void parse() throws ParseException { phpFile(); } } @@ -456,9 +469,9 @@ MORE : | < STRING_1: "\"" ( - ~["\""] | ~["{"] - | - "\\\"" + ~["\"","{","}"] + | "\\\"" + | "\\" | "{" ~["\""] "}" )* "\"" @@ -466,9 +479,8 @@ MORE : | < STRING_2: "'" ( - ~["'"] - | - "\\'" + ~["'"] + | "\\'" )* "'" @@ -477,8 +489,7 @@ MORE : "`" ( ~["`"] - | - "\\`" + | "\\`" )* "`" > @@ -730,8 +741,7 @@ void ClassBodyDeclaration() : {} { MethodDeclaration() -| - FieldDeclaration() +| FieldDeclaration() } /** @@ -744,6 +754,7 @@ void FieldDeclaration() : { variableDeclaration = VariableDeclarator() { + outlineInfo.addVariable(variableDeclaration.getVariable().getName()); if (currentSegment != null) { currentSegment.add(variableDeclaration); } @@ -778,7 +789,7 @@ PHPVarDeclaration VariableDeclarator() : try { varValue = VariableInitializer() - {return new PHPVarDeclaration(currentSegment,varName.substring(1),pos,varValue);} + {return new PHPVarDeclaration(currentSegment,varName,pos,varValue);} } catch (ParseException e) { errorMessage = "Literal expression expected in variable initializer"; errorLevel = ERROR; @@ -797,10 +808,9 @@ String VariableDeclaratorId() : } { try { - expr = Variable() - {buff.append(expr);} - ( LOOKAHEAD(2) expr = VariableSuffix() - {buff.append(expr);} + expr = Variable() {buff.append(expr);} + ( LOOKAHEAD(2) + expr = VariableSuffix() {buff.append(expr);} )* {return buff.toString();} } catch (ParseException e) { @@ -820,20 +830,20 @@ String Variable(): { token = [ expr = Expression() ] { - if (expr == null) { + if (expr == null && !assigning) { if (currentFunction != null) { PHPVarDeclaration var = currentFunction.getParameter(token.image.substring(1)); if (var != null) { var.getVariable().setUsed(true); } } - return token.image; + return token.image.substring(1); } return token + "{" + expr + "}"; } | expr = VariableName() - {return "$" + expr;} + {return expr;} } String VariableName(): @@ -958,6 +968,7 @@ void MethodDeclaration() : functionToken = try { functionDeclaration = MethodDeclarator() + {outlineInfo.addVariable(functionDeclaration.getName());} } catch (ParseException e) { if (errorMessage != null) { throw e; @@ -1075,7 +1086,7 @@ PHPVarDeclaration FormalParameter() : [token = ] variableDeclaration = VariableDeclarator() { if (token != null) { - variableDeclaration.getVariable().setPrefix("@"); + variableDeclaration.getVariable().setReference(true); } return variableDeclaration; } @@ -1084,32 +1095,15 @@ PHPVarDeclaration FormalParameter() : String Type() : {} { - - {return "string";} -| - - {return "bool";} -| - - {return "boolean";} -| - - {return "real";} -| - - {return "double";} -| - - {return "float";} -| - - {return "int";} -| - - {return "integer";} -| - - {return "object";} + {return "string";} +| {return "bool";} +| {return "boolean";} +| {return "real";} +| {return "double";} +| {return "float";} +| {return "int";} +| {return "integer";} +| {return "object";} } String Expression() : @@ -1119,18 +1113,28 @@ String Expression() : final String expr2; } { - expr = PrintExpression() - {return expr;} -| - expr = ListExpression() - {return expr;} -| - expr = ConditionalExpression() - [ - assignOperator = AssignmentOperator() + expr = PrintExpression() {return expr;} +| expr = ListExpression() {return expr;} +| LOOKAHEAD(varAssignation()) + expr = varAssignation() {return expr;} +| expr = ConditionalExpression() {return expr;} +} + +/** + * A Variable assignation. + * varName (an assign operator) any expression + */ +String varAssignation() : +{ + String varName,assignOperator,expr2; + PHPVarDeclaration variable; + final int pos = SimpleCharStream.getPosition(); +} +{ + varName = VariableDeclaratorId() + assignOperator = AssignmentOperator() try { expr2 = Expression() - {return expr + assignOperator + expr2;} } catch (ParseException e) { if (errorMessage != null) { throw e; @@ -1141,39 +1145,25 @@ String Expression() : errorEnd = jj_input_stream.getPosition() + 1; throw e; } - ] - {return expr;} + {return varName + assignOperator + expr2;} } String AssignmentOperator() : {} { - -{return "=";} -| -{return "*=";} -| -{return "/=";} -| -{return "%=";} -| -{return "+=";} -| -{return "-=";} -| -{return "<<=";} -| -{return ">>=";} -| -{return "&=";} -| -{return "|=";} -| -{return "|=";} -| -{return ".=";} -| -{return "~=";} + {return "=";} +| {return "*=";} +| {return "/=";} +| {return "%=";} +| {return "+=";} +| {return "-=";} +| {return "<<=";} +| {return ">>=";} +| {return "&=";} +| {return "|=";} +| {return "|=";} +| {return ".=";} +| {return "~=";} } String ConditionalExpression() : @@ -1434,8 +1424,8 @@ String UnaryExpression() : } return token.image + expr; } -| - ( {buff.append("@");})* expr = UnaryExpressionNoPrefix() +| ( {buff.append("@");})* + expr = UnaryExpressionNoPrefix() {return buff.append(expr).toString();} } @@ -1473,27 +1463,19 @@ String UnaryExpressionNotPlusMinus() : final String expr; } { - expr = UnaryExpression() - {return "!" + expr;} -| - LOOKAHEAD( (Type() | ) ) - expr = CastExpression() - {return expr;} -| - expr = PostfixExpression() - {return expr;} -| - expr = Literal() - {return expr;} -| - expr = Expression() + expr = UnaryExpression() {return "!" + expr;} +| LOOKAHEAD( (Type() | ) ) + expr = CastExpression() {return expr;} +| expr = PostfixExpression() {return expr;} +| expr = Literal() {return expr;} +| expr = Expression() try { } catch (ParseException e) { errorMessage = "')' expected"; errorLevel = ERROR; - errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; - errorEnd = jj_input_stream.getPosition() + 1; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } {return "("+expr+")";} @@ -1562,16 +1544,9 @@ String PrimaryPrefix() : final Token token; } { - token = - {return token.image;} -| - expr = ClassIdentifier() - { - return "new " + expr; - } -| - expr = VariableDeclaratorId() - {return expr;} + token = {return token.image;} +| expr = ClassIdentifier() {return "new " + expr;} +| expr = VariableDeclaratorId() {return expr;} } String classInstantiation() : @@ -1595,11 +1570,8 @@ String ClassIdentifier(): final Token token; } { - token = - {return token.image;} -| - expr = VariableDeclaratorId() - {return expr;} + token = {return token.image;} +| expr = VariableDeclaratorId() {return expr;} } String PrimarySuffix() : @@ -1607,11 +1579,8 @@ String PrimarySuffix() : final String expr; } { - expr = Arguments() - {return expr;} -| - expr = VariableSuffix() - {return expr;} + expr = Arguments() {return expr;} +| expr = VariableSuffix() {return expr;} } String VariableSuffix() : @@ -1655,30 +1624,18 @@ String Literal() : final Token token; } { - token = - {return token.image;} -| - token = - {return token.image;} -| - token = - {return token.image;} -| - expr = BooleanLiteral() - {return expr;} -| - - {return "null";} + token = {return token.image;} +| token = {return token.image;} +| token = {return token.image;} +| expr = BooleanLiteral() {return expr;} +| {return "null";} } String BooleanLiteral() : {} { - - {return "true";} -| - - {return "false";} + {return "true";} +| {return "false";} } String Arguments() : @@ -1716,21 +1673,19 @@ final StringBuffer buff = new StringBuffer(); try { expr = Expression() } catch (ParseException e) { - errorMessage = "expression expected after a comma in argument list"; + errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. An expression expected after a comma in argument list"; errorLevel = ERROR; - errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; - errorEnd = jj_input_stream.getPosition() + 1; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } - { - buff.append(",").append(expr); - } + {buff.append(",").append(expr);} )* {return buff.toString();} } /** - * A Statement without break + * A Statement without break. */ void StatementNoBreak() : {} @@ -1748,65 +1703,60 @@ void StatementNoBreak() : throw e; } } -| - LOOKAHEAD(2) +| LOOKAHEAD(2) LabeledStatement() -| - Block() -| - EmptyStatement() -| - StatementExpression() +| Block() +| EmptyStatement() +| StatementExpression() try { } catch (ParseException e) { errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. A ';' was expected"; errorLevel = ERROR; - errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; - errorEnd = jj_input_stream.getPosition() + 1; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } -| - SwitchStatement() -| - IfStatement() -| - WhileStatement() -| - DoStatement() -| - ForStatement() -| - ForeachStatement() -| - ContinueStatement() -| - ReturnStatement() -| - EchoStatement() -| - [] IncludeStatement() -| - StaticStatement() -| - GlobalStatement() +| SwitchStatement() +| IfStatement() +| WhileStatement() +| DoStatement() +| ForStatement() +| ForeachStatement() +| ContinueStatement() +| ReturnStatement() +| EchoStatement() +| [] IncludeStatement() +| StaticStatement() +| GlobalStatement() } /** - * A Normal statement + * A Normal statement. */ void Statement() : {} { StatementNoBreak() -| - BreakStatement() +| BreakStatement() } +/** + * An html block inside a php syntax. + */ void htmlBlock() : {} { - (phpEchoBlock())* ( | ) + (phpEchoBlock())* + try { + ( | ) + } catch (ParseException e) { + errorMessage = "End of file unexpected, ' | token = | token = ) - expr = Expression() + try { + expr = Expression() + } catch (ParseException e) { + if (errorMessage != null) { + throw e; + } + errorMessage = "unexpected token '"+ e.currentToken.next.image+"', expression expected"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; + } { if (currentSegment != null) { currentSegment.add(new PHPReqIncDeclaration(currentSegment, token.image,pos,expr)); @@ -1834,23 +1795,18 @@ void IncludeStatement() : } catch (ParseException e) { errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. A ';' was expected"; errorLevel = ERROR; - errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; - errorEnd = jj_input_stream.getPosition() + 1; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } } String PrintExpression() : { - final StringBuffer buff = new StringBuffer("print "); final String expr; } { - expr = Expression() - { - buff.append(expr); - return buff.toString(); - } + expr = Expression() {return "print " + expr;} } String ListExpression() : @@ -1865,8 +1821,8 @@ String ListExpression() : } catch (ParseException e) { errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', '(' expected"; errorLevel = ERROR; - errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; - errorEnd = jj_input_stream.getPosition() + 1; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } [ @@ -1879,8 +1835,8 @@ String ListExpression() : } catch (ParseException e) { errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', ',' expected"; errorLevel = ERROR; - errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; - errorEnd = jj_input_stream.getPosition() + 1; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } expr = VariableDeclaratorId() @@ -1901,7 +1857,8 @@ String ListExpression() : } /** - * An echo statement is like this : echo anyexpression (, otherexpression)* + * An echo statement. + * echo anyexpression (, otherexpression)* */ void EchoStatement() : {} @@ -1913,8 +1870,8 @@ void EchoStatement() : if (e.currentToken.next.kind != 4) { errorMessage = "';' expected after 'echo' statement"; errorLevel = ERROR; - errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; - errorEnd = jj_input_stream.getPosition() + 1; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; throw e; } } @@ -1940,7 +1897,7 @@ void GlobalStatement() : try { } catch (ParseException e) { - errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. A ';' was expected"; + errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. a ';' was expected"; errorLevel = ERROR; errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; errorEnd = jj_input_stream.getPosition() + 1; @@ -1955,7 +1912,7 @@ void StaticStatement() : try { } catch (ParseException e) { - errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. A ';' was expected"; + errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. a ';' was expected"; errorLevel = ERROR; errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; errorEnd = jj_input_stream.getPosition() + 1; @@ -1997,10 +1954,8 @@ void BlockStatement() : {} { Statement() -| - ClassDeclaration() -| - MethodDeclaration() +| ClassDeclaration() +| MethodDeclaration() } /** @@ -2010,10 +1965,8 @@ void BlockStatementNoBreak() : {} { StatementNoBreak() -| - ClassDeclaration() -| - MethodDeclaration() +| ClassDeclaration() +| MethodDeclaration() } void LocalVariableDeclaration() : @@ -2040,13 +1993,9 @@ void StatementExpression() : PreIncDecExpression() | PrimaryExpression() - [ - - | - - | - AssignmentOperator() Expression() - ] + [ + | + | AssignmentOperator() Expression() ] } void SwitchStatement() : @@ -2064,7 +2013,18 @@ void SwitchStatement() : errorEnd = jj_input_stream.getPosition() + 1; throw e; } - Expression() + try { + Expression() + } catch (ParseException e) { + if (errorMessage != null) { + throw e; + } + errorMessage = "expression expected"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; + } try { } catch (ParseException e) {