X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Parser.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Parser.java index 7369a24..f389faa 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Parser.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Parser.java @@ -165,6 +165,12 @@ public class Parser //extends PHPParserSuperclass problemEndPosition, referenceContext, compilationUnit.compilationResult); } + private void reportSyntaxWarning(String error, int problemStartPosition, + int problemEndPosition) { + problemReporter.phpParsingWarning(new String[]{error}, + problemStartPosition, problemEndPosition, referenceContext, + compilationUnit.compilationResult); + } /** * Method Declaration. * @@ -1222,38 +1228,38 @@ public class Parser //extends PHPParserSuperclass // getNextToken(); // } // return; -// } else if (token == TokenNamedefine) { -// getNextToken(); -// if (token == TokenNameLPAREN) { -// getNextToken(); -// } else { -// throwSyntaxError("'(' expected after 'define' keyword."); -// } -// expr(); -// if (token == TokenNameCOMMA) { -// getNextToken(); -// } else { -// throwSyntaxError("',' expected after first 'define' constant."); -// } -// expr(); -// if (token == TokenNameCOMMA) { -// getNextToken(); -// expr(); -// } -// if (token == TokenNameRPAREN) { -// getNextToken(); -// } else { -// throwSyntaxError("')' expected after 'define' statement."); -// } -// if (token == TokenNameSEMICOLON) { -// getNextToken(); -// } else { -// if (token != TokenNameStopPHP) { -// throwSyntaxError("';' expected after 'define' statement."); -// } -// getNextToken(); -// } -// return; + // } else if (token == TokenNamedefine) { + // getNextToken(); + // if (token == TokenNameLPAREN) { + // getNextToken(); + // } else { + // throwSyntaxError("'(' expected after 'define' keyword."); + // } + // expr(); + // if (token == TokenNameCOMMA) { + // getNextToken(); + // } else { + // throwSyntaxError("',' expected after first 'define' constant."); + // } + // expr(); + // if (token == TokenNameCOMMA) { + // getNextToken(); + // expr(); + // } + // if (token == TokenNameRPAREN) { + // getNextToken(); + // } else { + // throwSyntaxError("')' expected after 'define' statement."); + // } + // if (token == TokenNameSEMICOLON) { + // getNextToken(); + // } else { + // if (token != TokenNameStopPHP) { + // throwSyntaxError("';' expected after 'define' statement."); + // } + // getNextToken(); + // } + // return; } else if (token == TokenNamefunction) { MethodDeclaration methodDecl = new MethodDeclaration( this.compilationUnit.compilationResult); @@ -1437,7 +1443,7 @@ public class Parser //extends PHPParserSuperclass } getNextToken(); } else { - throwSyntaxError("Keyword 'class' 'final' or 'abstract' expected"); + throwSyntaxError("Keyword 'class' 'final' or 'abstract' expected"); } } private void interface_extends_list() { @@ -1492,14 +1498,10 @@ public class Parser //extends PHPParserSuperclass private void class_statement_list() { do { class_statement(); - } while (token == TokenNamepublic || - token == TokenNameprotected || - token == TokenNameprivate || - token == TokenNamestatic || - token == TokenNameabstract || - token == TokenNamefinal || - token == TokenNamefunction || - token == TokenNamevar); + } while (token == TokenNamepublic || token == TokenNameprotected + || token == TokenNameprivate || token == TokenNamestatic + || token == TokenNameabstract || token == TokenNamefinal + || token == TokenNamefunction || token == TokenNamevar); } private void class_statement() { // class_statement: @@ -1510,12 +1512,12 @@ public class Parser //extends PHPParserSuperclass initializeModifiers(); if (token == TokenNamevar) { checkAndSetModifiers(AccPublic); - reportSyntaxError( - "Keyword 'var' is deprecated. Please use 'public' 'private' or 'protected' modifier for field declarations.", - scanner.getCurrentTokenStartPosition(), scanner - .getCurrentTokenEndPosition()); + problemReporter.phpVarDeprecatedWarning(scanner + .getCurrentTokenStartPosition(), + scanner.getCurrentTokenEndPosition(), referenceContext, + compilationUnit.compilationResult); getNextToken(); - classProperty(); + class_variable_declaration(); } else { boolean hasModifiers = member_modifiers(); if (token == TokenNamefunction) { @@ -1533,7 +1535,7 @@ public class Parser //extends PHPParserSuperclass if (!hasModifiers) { throwSyntaxError("'public' 'private' or 'protected' modifier expected for field declarations."); } - classProperty(); + class_variable_declaration(); } } // if (token == TokenNamefunction) { @@ -1618,32 +1620,34 @@ public class Parser //extends PHPParserSuperclass } return foundToken; } - private void classProperty() { - //'var' variable ';' - //'var' variable '=' constant ';' + private void class_variable_declaration() { + // class_variable_declaration: + // class_variable_declaration ',' T_VARIABLE + // | class_variable_declaration ',' T_VARIABLE '=' static_scalar + // | T_VARIABLE + // | T_VARIABLE '=' static_scalar do { if (token == TokenNameVariable) { getNextToken(); if (token == TokenNameEQUAL) { getNextToken(); - constant(); + static_scalar(); } } else { if (token == TokenNamethis) { - throwSyntaxError("Reserved word '$this' not allowed after keyword 'var'."); + throwSyntaxError("'$this' not allowed after keyword 'public' 'protected' 'private' 'var'."); } - throwSyntaxError("Variable expected after keyword 'var'."); + throwSyntaxError("Variable expected keyword 'public' 'protected' 'private' 'var'."); } if (token != TokenNameCOMMA) { break; } getNextToken(); } while (true); - if (token == TokenNameSEMICOLON) { - getNextToken(); - } else { - throwSyntaxError("';' expected after variable declaration."); + if (token != TokenNameSEMICOLON) { + throwSyntaxError("';' expected after field declaration."); } + getNextToken(); } private void functionDefinition(MethodDeclaration methodDecl) { if (astPtr == 0) { @@ -1730,7 +1734,7 @@ public class Parser //extends PHPParserSuperclass getNextToken(); if (token == TokenNameEQUAL) { getNextToken(); - constant(); + static_scalar(); } return; } @@ -2077,15 +2081,16 @@ public class Parser //extends PHPParserSuperclass getNextToken(); expr(); break; - case TokenNamenull : - getNextToken(); - break; - case TokenNamefalse : - getNextToken(); - break; - case TokenNametrue : - getNextToken(); - break; + // + // case TokenNamenull : + // getNextToken(); + // break; + // case TokenNamefalse : + // getNextToken(); + // break; + // case TokenNametrue : + // getNextToken(); + // break; case TokenNameStringConstant : getNextToken(); break; @@ -2193,7 +2198,7 @@ public class Parser //extends PHPParserSuperclass } break; case TokenNamearray : - // T_ARRAY '(' array_pair_list ')' + // T_ARRAY '(' array_pair_list ')' getNextToken(); if (token == TokenNameLPAREN) { getNextToken(); @@ -2299,7 +2304,7 @@ public class Parser //extends PHPParserSuperclass } getNextToken(); break; - case TokenNameCOLON_COLON : + case TokenNamePAAMAYIM_NEKUDOTAYIM : // :: case TokenNameMINUS_GREATER : // -> @@ -2386,28 +2391,48 @@ public class Parser //extends PHPParserSuperclass } while (while_flag); } private void array_pair_list() { -// array_pair_list: -// /* empty */ -//| non_empty_array_pair_list possible_comma + // array_pair_list: + // /* empty */ + //| non_empty_array_pair_list possible_comma non_empty_array_pair_list(); if (token == TokenNameCOMMA) { getNextToken(); } } - - private void non_empty_array_pair_list() { -//non_empty_array_pair_list: -// non_empty_array_pair_list ',' expr T_DOUBLE_ARROW expr -//| non_empty_array_pair_list ',' expr -//| expr T_DOUBLE_ARROW expr -//| expr -//| non_empty_array_pair_list ',' expr T_DOUBLE_ARROW '&' w_variable -//| non_empty_array_pair_list ',' '&' w_variable -//| expr T_DOUBLE_ARROW '&' w_variable -//| '&' w_variable - } - + //non_empty_array_pair_list: + // non_empty_array_pair_list ',' expr T_DOUBLE_ARROW expr + //| non_empty_array_pair_list ',' expr + //| expr T_DOUBLE_ARROW expr + //| expr + //| non_empty_array_pair_list ',' expr T_DOUBLE_ARROW '&' w_variable + //| non_empty_array_pair_list ',' '&' w_variable + //| expr T_DOUBLE_ARROW '&' w_variable + //| '&' w_variable + while (true) { + expr(); + if (token == TokenNameAND) { + getNextToken(); + variable(); + return; + } else if (token == TokenNameEQUAL_GREATER) { + getNextToken(); + if (token == TokenNameAND) { + getNextToken(); + variable(); + } else { + expr(); + } + } + if (token != TokenNameCOMMA) { + return; + } + getNextToken(); + if (token == TokenNameRPAREN) { + return; + } + } + } private void unaryExpression() { switch (token) { case TokenNamePLUS_PLUS : @@ -2706,7 +2731,7 @@ public class Parser //extends PHPParserSuperclass getNextToken(); } else if (token == TokenNameEQUAL) { getNextToken(); - constant(); + static_scalar(); } } else { throwSyntaxError("$-variable expected in variable-list."); @@ -2809,80 +2834,132 @@ public class Parser //extends PHPParserSuperclass } } } - /** - * It will look for a value (after a '=' for example) @ - */ - private void constant() { - // String ident; + private boolean common_scalar() { + // common_scalar: + // T_LNUMBER + // | T_DNUMBER + // | T_CONSTANT_ENCAPSED_STRING + // | T_LINE + // | T_FILE + // | T_CLASS_C + // | T_METHOD_C + // | T_FUNC_C switch (token) { - case TokenNamePLUS : + case TokenNameIntegerLiteral : getNextToken(); - switch (token) { - case TokenNameDoubleLiteral : - getNextToken(); - break; - case TokenNameIntegerLiteral : - getNextToken(); - break; - default : - throwSyntaxError("Constant expected after '+' presign."); - } - break; - case TokenNameMINUS : + return true; + case TokenNameDoubleLiteral : getNextToken(); - switch (token) { - case TokenNameDoubleLiteral : - getNextToken(); - break; - case TokenNameIntegerLiteral : - getNextToken(); - break; - default : - throwSyntaxError("Constant expected after '-' presign."); - } - break; - case TokenNamenull : + return true; + case TokenNameStringLiteral : getNextToken(); - break; - case TokenNamefalse : + return true; + case TokenNameStringConstant : getNextToken(); - break; - case TokenNametrue : + return true; + case TokenNameStringInterpolated : getNextToken(); - break; + return true; + case TokenNameFILE : + getNextToken(); + return true; + case TokenNameLINE : + getNextToken(); + return true; + case TokenNameCLASS_C : + getNextToken(); + return true; + case TokenNameMETHOD_C : + getNextToken(); + return true; + case TokenNameFUNC_C : + getNextToken(); + return true; + } + return false; + } + private void static_scalar() { + // static_scalar: /* compile-time evaluated scalars */ + // common_scalar + // | T_STRING + // | '+' static_scalar + // | '-' static_scalar + // | T_ARRAY '(' static_array_pair_list ')' + // | static_class_constant + if (common_scalar()) { + return; + } + switch (token) { case TokenNameIdentifier : - // ident = identifier; - char[] ident = scanner.getCurrentIdentifierSource(); getNextToken(); - if (token == TokenNameLPAREN) { + // static_class_constant: + // T_STRING T_PAAMAYIM_NEKUDOTAYIM T_STRING + if (token == TokenNamePAAMAYIM_NEKUDOTAYIM) { getNextToken(); - if (token != TokenNameRPAREN) { - expressionList(); - if (token != TokenNameRPAREN) { - throwSyntaxError("')' expected after identifier '" - + new String(ident) + "' in postfix-expression."); - } + if (token == TokenNameIdentifier) { + getNextToken(); + } else { + throwSyntaxError("Identifier expected after '::' operator."); } - getNextToken(); } break; - case TokenNameStringLiteral : + case TokenNamePLUS : getNextToken(); + static_scalar(); break; - case TokenNameStringConstant : + case TokenNameMINUS : getNextToken(); + static_scalar(); break; - case TokenNameStringInterpolated : + case TokenNamearray : getNextToken(); - break; - case TokenNameDoubleLiteral : + if (token != TokenNameLPAREN) { + throwSyntaxError("'(' expected after keyword 'array'"); + } getNextToken(); - break; - case TokenNameIntegerLiteral : + if (token == TokenNameRPAREN) { + getNextToken(); + break; + } + non_empty_static_array_pair_list(); + if (token != TokenNameRPAREN) { + throwSyntaxError("')' expected after keyword 'array'"); + } getNextToken(); break; + // case TokenNamenull : + // getNextToken(); + // break; + // case TokenNamefalse : + // getNextToken(); + // break; + // case TokenNametrue : + // getNextToken(); + // break; default : - throwSyntaxError("Constant expected."); + throwSyntaxError("Static scalar/constant expected."); + } + } + private void non_empty_static_array_pair_list() { + // non_empty_static_array_pair_list: + // non_empty_static_array_pair_list ',' static_scalar T_DOUBLE_ARROW + // static_scalar + //| non_empty_static_array_pair_list ',' static_scalar + //| static_scalar T_DOUBLE_ARROW static_scalar + //| static_scalar + while (true) { + static_scalar(); + if (token == TokenNameEQUAL_GREATER) { + getNextToken(); + static_scalar(); + } + if (token != TokenNameCOMMA) { + break; + } + getNextToken(); + if (token != TokenNameRPAREN) { + break; + } } } public void reportSyntaxError() { //int act, int currentKind, int