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 57e9eb8..a6bce7c 100644 --- a/net.sourceforge.phpeclipse/src/test/PHPParser.jj +++ b/net.sourceforge.phpeclipse/src/test/PHPParser.jj @@ -28,7 +28,6 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.ui.texteditor.MarkerUtilities; import org.eclipse.jface.preference.IPreferenceStore; -import java.io.CharArrayReader; import java.util.Hashtable; import java.io.StringReader; import java.text.MessageFormat; @@ -36,6 +35,9 @@ import java.text.MessageFormat; import net.sourceforge.phpeclipse.actions.PHPStartApacheAction; import net.sourceforge.phpeclipse.PHPeclipsePlugin; import net.sourceforge.phpdt.internal.compiler.parser.PHPOutlineInfo; +import net.sourceforge.phpdt.internal.compiler.parser.PHPSegmentWithChildren; +import net.sourceforge.phpdt.internal.compiler.parser.PHPFunctionDeclaration; +import net.sourceforge.phpdt.internal.compiler.parser.PHPClassDeclaration; /** * A new php parser. @@ -46,10 +48,11 @@ import net.sourceforge.phpdt.internal.compiler.parser.PHPOutlineInfo; */ public class PHPParser extends PHPParserSuperclass { - private static PHPParser me; - private static IFile fileToParse; + /** 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$ public static final int ERROR = 2; @@ -62,28 +65,10 @@ public class PHPParser extends PHPParserSuperclass { public PHPParser() { } - public static PHPParser getInstance(IFile fileToParse) { - if (me == null) { - me = new PHPParser(fileToParse); - } else { - me.setFileToParse(fileToParse); - } - return me; - } - public void setFileToParse(IFile fileToParse) { this.fileToParse = fileToParse; } - public static PHPParser getInstance(java.io.Reader stream) { - if (me == null) { - me = new PHPParser(stream); - } else { - me.ReInit(stream); - } - return me; - } - public PHPParser(IFile fileToParse) { this(new StringReader("")); this.fileToParse = fileToParse; @@ -105,11 +90,12 @@ public class PHPParser extends PHPParserSuperclass { jj_input_stream = new SimpleCharStream(stream, 1, 1); } ReInit(stream); - phpTest(); + phpFile(); } public PHPOutlineInfo parseInfo(Object parent, String s) { outlineInfo = new PHPOutlineInfo(parent); + currentSegment = outlineInfo.getDeclarations(); StringReader stream = new StringReader(s); if (jj_input_stream == null) { jj_input_stream = new SimpleCharStream(stream, 1, 1); @@ -228,7 +214,12 @@ public class PHPParser extends PHPParserSuperclass { try { parse(); } catch (ParseException e) { - PHPeclipsePlugin.log(e); + if (errorMessage == null) { + PHPeclipsePlugin.log(e); + } else { + setMarker(errorMessage, e.currentToken.beginLine, errorLevel); + errorMessage = null; + } } } @@ -263,20 +254,20 @@ PARSER_END(PHPParser) TOKEN : { - " : PHPPARSING } - SKIP : + TOKEN : { - < ~[] > + "> : DEFAULT } - TOKEN : + SKIP : { - "?>" : DEFAULT + < ~[] > } + /* WHITE SPACE */ SKIP : @@ -545,7 +536,7 @@ void phpTest() : void phpFile() : {} { - ("")* + ( Php() )* } @@ -556,10 +547,22 @@ void Php() : } void ClassDeclaration() : -{} { - [ ] + PHPClassDeclaration classDeclaration; + Token className; + int pos = jj_input_stream.bufpos; +} +{ + className = [ ] + { + classDeclaration = new PHPClassDeclaration(currentSegment,className.image,pos); + currentSegment.add(classDeclaration); + currentSegment = classDeclaration; + } ClassBody() + { + currentSegment = (PHPSegmentWithChildren) currentSegment.getParent(); + } } void ClassBody() : @@ -582,337 +585,782 @@ void FieldDeclaration() : VariableDeclarator() ( VariableDeclarator() )* } -void VariableDeclarator() : -{} +String VariableDeclarator() : { - VariableDeclaratorId() [ VariableInitializer() ] + String expr; + StringBuffer buff = new StringBuffer(); +} +{ + expr = VariableDeclaratorId() + {buff.append(expr);} + [ expr = VariableInitializer() + {buff.append("=").append(expr);} + ] + {return buff.toString();} } -void VariableDeclaratorId() : -{} +String VariableDeclaratorId() : +{ + String expr; + StringBuffer buff = new StringBuffer(); +} { - Variable() ( LOOKAHEAD(2) VariableSuffix() )* + expr = Variable() + {buff.append(expr);} + ( LOOKAHEAD(2) expr = VariableSuffix() + {buff.append(expr);} + )* + {return buff.toString();} } -void Variable(): -{} +String Variable(): +{ + String expr = null; + Token token; +} { - ( Expression() ) * + token = [ expr = Expression() ] + { + if (expr == null) { + return token.image; + } + return token + "{" + expr + "}"; + } | - VariableName() + expr = VariableName() + {return "$" + expr;} } -void VariableName(): -{} +String VariableName(): { - Expression() -| - ( Expression() ) * +String expr = null; +Token token; +} +{ + expr = Expression() + {return "{"+expr+"}";} | - VariableName() + token = [ expr = Expression() ] + { + if (expr == null) { + return token.image; + } + return token + "{" + expr + "}"; + }| + expr = VariableName() + {return "$" + expr;} } -void VariableInitializer() : -{} +String VariableInitializer() : { - Expression() + String expr; +} +{ + expr = Expression() + {return expr;} } -void ArrayVariable() : -{} +String ArrayVariable() : +{ +String expr; +StringBuffer buff = new StringBuffer(); +} { - Expression() ( Expression())* + expr = Expression() + {buff.append(expr);} + [ expr = Expression() + {buff.append("=>").append(expr);}] + {return buff.toString();} } -void ArrayInitializer() : -{} +String ArrayInitializer() : { - [ ArrayVariable() ( LOOKAHEAD(2) ArrayVariable() )* ] +String expr = null; +StringBuffer buff = new StringBuffer("("); +} +{ + [ expr = ArrayVariable() + {buff.append(expr);} + ( LOOKAHEAD(2) expr = ArrayVariable() + {buff.append(",").append(expr);} + )* ] + + { + buff.append(")"); + return buff.toString(); + } } void MethodDeclaration() : -{} { - MethodDeclarator() + PHPFunctionDeclaration functionDeclaration; +} +{ + functionDeclaration = MethodDeclarator() + { + currentSegment.add(functionDeclaration); + currentSegment = functionDeclaration; + } ( Block() | ) + { + currentSegment = (PHPSegmentWithChildren) currentSegment.getParent(); + } } -void MethodDeclarator() : -{} +PHPFunctionDeclaration MethodDeclarator() : { - [] FormalParameters() + Token identifier; + StringBuffer methodDeclaration = new StringBuffer(); + String formalParameters; + int pos = jj_input_stream.bufpos; +} +{ + [ {methodDeclaration.append("&");}] + identifier = formalParameters = FormalParameters() + { + methodDeclaration.append(identifier).append(formalParameters); + return new PHPFunctionDeclaration(currentSegment,methodDeclaration.toString(),pos); + } } -void FormalParameters() : -{} +String FormalParameters() : +{ + String expr; + StringBuffer buff = new StringBuffer("("); +} { - [ FormalParameter() ( FormalParameter() )* ] + [ expr = FormalParameter() {buff.append(expr);} + ( expr = FormalParameter() + {buff.append(",").append(expr);} + )* ] + { + buff.append(")"); + return buff.toString(); + } } -void FormalParameter() : -{} +String FormalParameter() : { - [] VariableDeclarator() + String expr; + StringBuffer buff = new StringBuffer(); +} +{ + [ {buff.append("&");}] expr = VariableDeclarator() + { + buff.append(expr); + return buff.toString(); + } } -void Type() : +String Type() : {} { + {return "string";} | + {return "bool";} | + {return "boolean";} | + {return "real";} | + {return "double";} | + {return "float";} | + {return "int";} | + {return "integer";} } -/* - * Expression syntax follows. - */ - -void Expression() : -/* - * This expansion has been written this way instead of: - * Assignment() | ConditionalExpression() - * for performance reasons. - * However, it is a weakening of the grammar for it allows the LHS of - * assignments to be any conditional expression whereas it can only be - * a primary expression. Consider adding a semantic predicate to work - * around this. - */ -{} +String Expression() : { - PrintExpression() + String expr; + String assignOperator = null; + String expr2 = null; +} +{ + expr = PrintExpression() + {return expr;} | - ConditionalExpression() + expr = ConditionalExpression() [ - AssignmentOperator() Expression() + assignOperator = AssignmentOperator() + expr2 = Expression() ] + { + if (expr2 == null) { + return expr; + } else { + return expr + assignOperator + expr2; + } + } } -void AssignmentOperator() : -{} -{ - | | | | | | | | | | | | +String AssignmentOperator() : +{ + Token assignOperator; +} +{ + +{return "=";} +| +{return "*=";} +| +{return "/=";} +| +{return "%=";} +| +{return "+=";} +| +{return "-=";} +| +{return "<<=";} +| +{return ">>=";} +| +{return ">>>=";} +| +{return "&=";} +| +{return "|=";} +| +{return "|=";} +| +{return ".=";} +} + +String ConditionalExpression() : +{ + String expr; + String expr2 = null; + String expr3 = null; +} +{ + expr = ConditionalOrExpression() [ expr2 = Expression() expr3 = ConditionalExpression() ] +{ + if (expr3 == null) { + return expr; + } else { + return expr + "?" + expr2 + ":" + expr3; + } +} } -void ConditionalExpression() : -{} +String ConditionalOrExpression() : { - ConditionalOrExpression() [ Expression() ConditionalExpression() ] + String expr; + Token operator; + String expr2 = null; + StringBuffer buff = new StringBuffer(); } - -void ConditionalOrExpression() : -{} { - ConditionalAndExpression() ( ( | <_ORL>) ConditionalAndExpression() )* + expr = ConditionalAndExpression() + { + buff.append(expr); + } + ( + (operator = | operator = <_ORL>) expr2 = ConditionalAndExpression() + { + buff.append(operator.image); + buff.append(expr2); + } + )* + { + return buff.toString(); + } } -void ConditionalAndExpression() : -{} +String ConditionalAndExpression() : { - ConcatExpression() ( ( | <_ANDL>) ConcatExpression() )* + String expr; + Token operator; + String expr2 = null; + StringBuffer buff = new StringBuffer(); +} +{ + expr = ConcatExpression() + { + buff.append(expr); + } + ( + (operator = | operator = <_ANDL>) expr2 = ConcatExpression() + { + buff.append(operator.image); + buff.append(expr2); + } + )* + { + return buff.toString(); + } } -void ConcatExpression() : -{} +String ConcatExpression() : { - InclusiveOrExpression() ( InclusiveOrExpression() )* + String expr; + String expr2 = null; + StringBuffer buff = new StringBuffer(); +} +{ + expr = InclusiveOrExpression() + { + buff.append(expr); + } + ( + expr2 = InclusiveOrExpression() + { + buff.append("."); + buff.append(expr2); + } + )* + { + return buff.toString(); + } } -void InclusiveOrExpression() : -{} +String InclusiveOrExpression() : { - ExclusiveOrExpression() ( ExclusiveOrExpression() )* + String expr; + String expr2 = null; + StringBuffer buff = new StringBuffer(); +} +{ + expr = ExclusiveOrExpression() + { + buff.append(expr); + } + ( + expr2 = ExclusiveOrExpression() + { + buff.append("|"); + buff.append(expr2); + } + )* + { + return buff.toString(); + } } -void ExclusiveOrExpression() : -{} +String ExclusiveOrExpression() : +{ + String expr; + String expr2 = null; + StringBuffer buff = new StringBuffer(); +} { - AndExpression() ( AndExpression() )* + expr = AndExpression() + { + buff.append(expr); + } + ( + expr2 = AndExpression() + { + buff.append("^"); + buff.append(expr2); + } + )* + { + return buff.toString(); + } } -void AndExpression() : -{} +String AndExpression() : { - EqualityExpression() ( EqualityExpression() )* + String expr; + String expr2 = null; + StringBuffer buff = new StringBuffer(); +} +{ + expr = EqualityExpression() + { + buff.append(expr); + } + ( + expr2 = EqualityExpression() + { + buff.append("&"); + buff.append(expr2); + } + )* + { + return buff.toString(); + } } -void EqualityExpression() : -{} +String EqualityExpression() : { - RelationalExpression() ( ( | ) RelationalExpression() )* + String expr; + Token operator; + String expr2; + StringBuffer buff = new StringBuffer(); +} +{ + expr = RelationalExpression() + {buff.append(expr);} + ( + ( operator = | operator = ) expr2 = RelationalExpression() + { + buff.append(operator.image); + buff.append(expr2); + } + )* + {return buff.toString();} } -void RelationalExpression() : -{} +String RelationalExpression() : { - ShiftExpression() ( ( | | | ) ShiftExpression() )* + String expr; + Token operator; + String expr2; + StringBuffer buff = new StringBuffer(); +} +{ + expr = ShiftExpression() + {buff.append(expr);} + ( + ( operator = | operator = | operator = | operator = ) expr2 = ShiftExpression() + { + buff.append(operator.image); + buff.append(expr2); + } + )* + {return buff.toString();} } -void ShiftExpression() : -{} +String ShiftExpression() : { - AdditiveExpression() ( ( | | ) AdditiveExpression() )* + String expr; + Token operator; + String expr2; + StringBuffer buff = new StringBuffer(); +} +{ + expr = AdditiveExpression() + {buff.append(expr);} + ( + (operator = | operator = | operator = ) expr2 = AdditiveExpression() + { + buff.append(operator.image); + buff.append(expr2); + } + )* + {return buff.toString();} } -void AdditiveExpression() : -{} +String AdditiveExpression() : { - MultiplicativeExpression() ( ( | ) MultiplicativeExpression() )* + String expr; + Token operator; + String expr2; + StringBuffer buff = new StringBuffer(); +} +{ + expr = MultiplicativeExpression() + {buff.append(expr);} + ( + ( operator = | operator = ) expr2 = MultiplicativeExpression() + { + buff.append(operator.image); + buff.append(expr2); + } + )* + {return buff.toString();} } -void MultiplicativeExpression() : -{} +String MultiplicativeExpression() : { - UnaryExpression() ( ( | | ) UnaryExpression() )* + String expr; + Token operator; + String expr2; + StringBuffer buff = new StringBuffer();} +{ + expr = UnaryExpression() + {buff.append(expr);} + ( + ( operator = | operator = | operator = ) expr2 = UnaryExpression() + { + buff.append(operator.image); + buff.append(expr2); + } + )* + {return buff.toString();} } -void UnaryExpression() : -{} +String UnaryExpression() : { - UnaryExpression() + String expr; + StringBuffer buff = new StringBuffer(); +} +{ + expr = UnaryExpression() + {return "@" + expr;} | - ( | ) UnaryExpression() + ( {buff.append("+");}| {buff.append("-");}) expr = UnaryExpression() + { + buff.append(expr); + return buff.toString(); + } | - PreIncrementExpression() + expr = PreIncrementExpression() + {return expr;} | - PreDecrementExpression() + expr = PreDecrementExpression() + {return expr;} | - UnaryExpressionNotPlusMinus() + expr = UnaryExpressionNotPlusMinus() + {return buff.toString();} } -void PreIncrementExpression() : -{} +String PreIncrementExpression() : { - PrimaryExpression() +String expr; +} +{ + expr = PrimaryExpression() + {return "++"+expr;} } -void PreDecrementExpression() : -{} +String PreDecrementExpression() : +{ +String expr; +} { - PrimaryExpression() + expr = PrimaryExpression() + {return "--"+expr;} } -void UnaryExpressionNotPlusMinus() : -{} +String UnaryExpressionNotPlusMinus() : +{ + String expr; +} { - UnaryExpression() + expr = UnaryExpression() + {return "!" + expr;} | LOOKAHEAD( Type() ) - CastExpression() + expr = CastExpression() + {return expr;} | - PostfixExpression() + expr = PostfixExpression() + {return expr;} | - Literal() + expr = Literal() + {return expr;} | - Expression() + expr = Expression() + {return "("+expr+")";} } -void CastExpression() : -{} +String CastExpression() : +{ +String type; +String expr; +} { - Type() UnaryExpression() + type = Type() expr = UnaryExpression() + {return "(" + type + ")" + expr;} } -void PostfixExpression() : -{} +String PostfixExpression() : +{ + String expr; + Token operator = null; +} { - PrimaryExpression() [ | ] + expr = PrimaryExpression() [ operator = | operator = ] + { + if (operator == null) { + return expr; + } + return expr + operator.image; + } } -void PrimaryExpression() : -{} +String PrimaryExpression() : +{ + Token identifier; + String expr; + StringBuffer buff = new StringBuffer(); +} { LOOKAHEAD(2) - ClassIdentifier() (PrimarySuffix())* + identifier = expr = ClassIdentifier() + {buff.append(identifier.image).append("::").append(expr);} + ( + expr = PrimarySuffix() + {buff.append(expr);} + )* + {return buff.toString();} | - PrimaryPrefix() ( PrimarySuffix() )* + expr = PrimaryPrefix() + {buff.append(expr);} + ( + expr = PrimarySuffix() + {buff.append(expr);} + )* + {return buff.toString();} | - ArrayInitializer() + expr = ArrayInitializer() + {return "array" + expr;} } -void PrimaryPrefix() : -{} +String PrimaryPrefix() : { - + String expr; + Token token = null; +} +{ + token = + {return token.image;} | - ClassIdentifier() + [token = ] expr = ClassIdentifier() + { + if (token == null) { + return "new " + expr; + } + return "new " + expr; + } | - VariableDeclaratorId() + expr = VariableDeclaratorId() + {return expr;} } -void ClassIdentifier(): -{} +String ClassIdentifier(): { - + String expr; + Token token; +} +{ + token = + {return token.image;} | - VariableDeclaratorId() + expr = VariableDeclaratorId() + {return expr;} } -void PrimarySuffix() : -{} +String PrimarySuffix() : { - Arguments() + String expr; +} +{ + expr = Arguments() + {return expr;} | - VariableSuffix() + expr = VariableSuffix() + {return expr;} } -void VariableSuffix() : -{} +String VariableSuffix() : { - VariableName() + String expr = null; +} +{ + expr = VariableName() + {return "->" + expr;} | - [ Expression() ] + [ expr = Expression() ] + { + if(expr == null) { + return "[]"; + } + return "[" + expr + "]"; + } } -void Literal() : -{} +String Literal() : +{ + String expr; + Token token; +} { - + token = + {return token.image;} | - + token = + {return token.image;} | - + try { + token = + {return token.image;} + } catch (TokenMgrError e) { + errorMessage = "unterminated string"; + errorLevel = ERROR; + throw generateParseException(); + } | - BooleanLiteral() + expr = BooleanLiteral() + {return expr;} | - NullLiteral() + expr = NullLiteral() + {return expr;} } -void BooleanLiteral() : +String BooleanLiteral() : {} { + {return "true";} | + {return "false";} } -void NullLiteral() : +String NullLiteral() : {} { + {return "null";} } -void Arguments() : -{} +String Arguments() : +{ +String expr = null; +} { - [ ArgumentList() ] + [ expr = ArgumentList() ] + try { + + } catch (ParseException e) { + errorMessage = "')' expected to close the argument list"; + errorLevel = ERROR; + throw e; + } + { + if (expr == null) { + return "()"; + } + return "(" + expr + ")"; + } } -void ArgumentList() : -{} +String ArgumentList() : { - Expression() ( Expression() )* +String expr; +StringBuffer buff = new StringBuffer(); +} +{ + expr = Expression() + {buff.append(expr);} + ( + try { + expr = Expression() + } catch (ParseException e) { + errorMessage = "expression expected after a comma in argument list"; + errorLevel = ERROR; + throw e; + } + { + buff.append(",").append("expr"); + } + )* + {return buff.toString();} } /* @@ -978,10 +1426,17 @@ void IncludeStatement() : Expression() ( | "?>") } -void PrintExpression() : -{} +String PrintExpression() : { - Expression() + StringBuffer buff = new StringBuffer("print "); + String expr; +} +{ + expr = Expression() + { + buff.append(expr); + return buff.toString(); + } } void EchoStatement() : @@ -1089,7 +1544,7 @@ void IfStatement() : */ {} { - Condition("if") Statement() [ LOOKAHEAD(1) ElseIfStatement() ] [ LOOKAHEAD(1) Statement() ] + Condition("if") Statement() ( LOOKAHEAD(1) ElseIfStatement() )* [ LOOKAHEAD(1) Statement() ] } void Condition(String keyword) :