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.
*
// 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);
typeDecl.declarationSourceEnd = scanner.getCurrentTokenEndPosition();
getNextToken();
} else {
- throwSyntaxError("'}' expected at end of interface body.");
+ throwSyntaxError("'}' expected at end of class body.");
}
} else {
- throwSyntaxError("'{' expected at start of interface body.");
+ throwSyntaxError("'{' expected at start of class body.");
}
}
private void class_entry_type() {
}
getNextToken();
} else {
- throwSyntaxError("Keyword 'class' 'final' or 'abstract' expected");
+ throwSyntaxError("Keyword 'class' 'final' or 'abstract' expected");
}
}
private void interface_extends_list() {
private void class_statement_list() {
do {
class_statement();
- } while (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:
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) {
if (!hasModifiers) {
throwSyntaxError("'public' 'private' or 'protected' modifier expected for field declarations.");
}
- classProperty();
+ class_variable_declaration();
}
}
// if (token == TokenNamefunction) {
}
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) {
getNextToken();
if (token == TokenNameEQUAL) {
getNextToken();
- constant();
+ static_scalar();
}
return;
}
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;
getNextToken();
}
break;
+ case TokenNamearray :
+ // T_ARRAY '(' array_pair_list ')'
+ getNextToken();
+ if (token == TokenNameLPAREN) {
+ getNextToken();
+ if (token == TokenNameRPAREN) {
+ getNextToken();
+ break;
+ }
+ array_pair_list();
+ if (token != TokenNameRPAREN) {
+ throwSyntaxError("')' expected after keyword 'array'"
+ + "(Found token: " + scanner.toStringAction(token) + ")");
+ }
+ getNextToken();
+ } else {
+ throwSyntaxError("'(' expected after keyword 'array'"
+ + "(Found token: " + scanner.toStringAction(token) + ")");
+ }
+ break;
case TokenNameprint :
getNextToken();
expr();
}
getNextToken();
break;
- case TokenNameCOLON_COLON :
+ case TokenNamePAAMAYIM_NEKUDOTAYIM :
// ::
case TokenNameMINUS_GREATER :
// ->
}
} while (while_flag);
}
+ private void array_pair_list() {
+ // 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
+ 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 :
getNextToken();
} else if (token == TokenNameEQUAL) {
getNextToken();
- constant();
+ static_scalar();
}
} else {
throwSyntaxError("$-variable expected in variable-list.");
}
}
}
- /**
- * 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