**********************************************************************/
package net.sourceforge.phpdt.internal.compiler.parser;
-import java.text.MessageFormat;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.Hashtable;
import net.sourceforge.phpdt.core.compiler.*;
-import net.sourceforge.phpdt.internal.compiler.parser.*;
import net.sourceforge.phpeclipse.PHPeclipsePlugin;
-import net.sourceforge.phpeclipse.actions.PHPStartApacheAction;
import net.sourceforge.phpeclipse.phpeditor.PHPString;
-import net.sourceforge.phpeclipse.phpeditor.php.PHPKeywords;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.ui.texteditor.MarkerUtilities;
+import test.PHPParserSuperclass;
-public class Parser extends PHPKeywords implements ITerminalSymbols {
- // strings for external parser call
- private static final String PARSE_ERROR_STRING = "Parse error"; //$NON-NLS-1$
- private static final String PARSE_WARNING_STRING = "Warning"; //$NON-NLS-1$
+public class Parser extends PHPParserSuperclass implements ITerminalSymbols {
- public static final int ERROR = 2;
- public static final int WARNING = 1;
- public static final int INFO = 0;
-
- public static final boolean DEBUG = false;
- //scanner token
+ //scanner token
public Scanner scanner;
private IFile fileToParse;
private int currentPHPString;
private boolean phpEnd;
- private static HashMap keywordMap = null;
+ // private static HashMap keywordMap = null;
private String str;
// current character
-// char ch;
+ // char ch;
// current token
int token;
private String stringValue;
/** Contains the current expression. */
- // private StringBuffer expression;
+ // private StringBuffer expression;
private boolean phpMode;
// final static int TokenNameNOT_EQUAL_EQUAL = 158;
// final static int TokenNameOR = 159;
// final static int TokenNameAT = 153; // @
+
+ public Parser() {
+ }
+
+ public void setFileToParse(IFile fileToParse) {
+ this.currentPHPString = 0;
+ this.fileToParse = fileToParse;
+ this.phpList = null;
+ this.str = "";
+ this.token = TokenNameEOF;
+ this.phpEnd = false;
+ this.initializeScanner();
+ }
/**
* Class Constructor.
*
*@see
*/
public Parser(IFile fileToParse) {
- if (keywordMap == null) {
- keywordMap = new HashMap();
- for (int i = 0; i < PHP_KEYWORS.length; i++) {
- keywordMap.put(PHP_KEYWORS[i], new Integer(PHP_KEYWORD_TOKEN[i]));
- }
- }
+ // if (keywordMap == null) {
+ // keywordMap = new HashMap();
+ // for (int i = 0; i < PHP_KEYWORS.length; i++) {
+ // keywordMap.put(PHP_KEYWORS[i], new Integer(PHP_KEYWORD_TOKEN[i]));
+ // }
+ // }
this.currentPHPString = 0;
this.fileToParse = fileToParse;
this.phpList = null;
this.str = "";
this.token = TokenNameEOF;
-// this.chIndx = 0;
-// this.rowCount = 1;
-// this.columnCount = 0;
+ // this.chIndx = 0;
+ // this.rowCount = 1;
+ // this.columnCount = 0;
this.phpEnd = false;
// getNextToken();
setMarker(fileToParse, message, charStart, charEnd, errorLevel);
}
- public static void setMarker(
- IFile file,
- String message,
- int charStart,
- int charEnd,
- int errorLevel)
- throws CoreException {
- if (file != null) {
- Hashtable attributes = new Hashtable();
- MarkerUtilities.setMessage(attributes, message);
- switch (errorLevel) {
- case ERROR :
- attributes.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_ERROR));
- break;
- case WARNING :
- attributes.put(
- IMarker.SEVERITY,
- new Integer(IMarker.SEVERITY_WARNING));
- break;
- case INFO :
- attributes.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_INFO));
- break;
- }
- MarkerUtilities.setCharStart(attributes, charStart);
- MarkerUtilities.setCharEnd(attributes, charEnd);
- // setLineNumber(attributes, lineNumber);
- MarkerUtilities.createMarker(file, attributes, IMarker.PROBLEM);
- }
- }
-
/**
* This method will throw the SyntaxError.
* It will add the good lines and columns to the Error
*/
private void throwSyntaxError(String error) {
-// if (str.length() < chIndx) {
-// chIndx--;
-// }
-// // read until end-of-line
-// int eol = chIndx;
-// while (str.length() > eol) {
-// ch = str.charAt(eol++);
-// if (ch == '\n') {
-// eol--;
-// break;
-// }
-// }
-// throw new SyntaxError(
-// rowCount,
-// chIndx - columnCount + 1,
-// str.substring(columnCount, eol),
-// error);
- throw new SyntaxError(
- 1,
- 1,
- "",
- error);
+ // if (str.length() < chIndx) {
+ // chIndx--;
+ // }
+ // // read until end-of-line
+ // int eol = chIndx;
+ // while (str.length() > eol) {
+ // ch = str.charAt(eol++);
+ // if (ch == '\n') {
+ // eol--;
+ // break;
+ // }
+ // }
+ // throw new SyntaxError(
+ // rowCount,
+ // chIndx - columnCount + 1,
+ // str.substring(columnCount, eol),
+ // error);
+ throw new SyntaxError(1, 1, "", error);
}
/**
*
*@see
*/
-// private void getChar() {
-// if (str.length() > chIndx) {
-// ch = str.charAt(chIndx++);
-//
-// return;
-// }
-//
-// chIndx = str.length() + 1;
-// ch = ' ';
-// // token = TokenNameEOF;
-// phpEnd = true;
-// }
+ // private void getChar() {
+ // if (str.length() > chIndx) {
+ // ch = str.charAt(chIndx++);
+ //
+ // return;
+ // }
+ //
+ // chIndx = str.length() + 1;
+ // ch = ' ';
+ // // token = TokenNameEOF;
+ // phpEnd = true;
+ // }
/**
* gets the next token from input
private void getNextToken() throws CoreException {
try {
token = scanner.getNextToken();
- if (DEBUG) {
+ if (Scanner.DEBUG) {
int currentEndPosition = scanner.getCurrentTokenEndPosition();
int currentStartPosition = scanner.getCurrentTokenStartPosition();
* if it's a <code>double</code> the number will be stored in <code>longNumber</code> and the token will have the
* value {@link Parser#TokenNameINT_NUMBER}
*/
-// private void getNumber() {
-// StringBuffer inum = new StringBuffer();
-// char dFlag = ' ';
-// int numFormat = 10;
-//
-// // save first digit
-// char firstCh = ch;
-// inum.append(ch);
-//
-// getChar();
-// // determine number conversions:
-// if (firstCh == '0') {
-// switch (ch) {
-// case 'b' :
-// numFormat = 2;
-// getChar();
-// break;
-// case 'B' :
-// numFormat = 2;
-// getChar();
-// break;
-// case 'o' :
-// numFormat = 8;
-// getChar();
-// break;
-// case 'O' :
-// numFormat = 8;
-// getChar();
-// break;
-// case 'x' :
-// numFormat = 16;
-// getChar();
-// break;
-// case 'X' :
-// numFormat = 16;
-// getChar();
-// break;
-// }
-// }
-//
-// if (numFormat == 16) {
-// while ((ch >= '0' && ch <= '9')
-// || (ch >= 'a' && ch <= 'f')
-// || (ch >= 'A' && ch <= 'F')) {
-// inum.append(ch);
-// getChar();
-// }
-// } else {
-// while ((ch >= '0' && ch <= '9')
-// || (ch == '.')
-// || (ch == 'E')
-// || (ch == 'e')) {
-// if ((ch == '.') || (ch == 'E') || (ch == 'e')) {
-// if (ch == '.' && dFlag != ' ') {
-// break;
-// }
-// if ((dFlag == 'E') || (dFlag == 'e')) {
-// break;
-// }
-// dFlag = ch;
-// inum.append(ch);
-// getChar();
-// if ((ch == '-') || (ch == '+')) {
-// inum.append(ch);
-// getChar();
-// }
-// } else {
-// inum.append(ch);
-// getChar();
-// }
-// }
-// }
-// chIndx--;
-//
-// try {
-// if (dFlag != ' ') {
-// doubleNumber = new Double(inum.toString());
-// token = TokenNameDoubleLiteral;
-// return;
-// } else {
-// longNumber = Long.valueOf(inum.toString(), numFormat);
-// token = TokenNameIntegerLiteral;
-// return;
-// }
-//
-// } catch (Throwable e) {
-// throwSyntaxError("Number format error: " + inum.toString());
-// }
-// }
-//
-// /**
-// * Get a String.
-// * @param openChar the opening char ('\'', '"', '`')
-// * @param typeString the type of string {@link #TokenNameSTRING_CONSTANT},{@link #TokenNameINTERPOLATED_STRING}
-// * @param errorMsg the error message in case of parse error in the string
-// */
-// private void getString(
-// final char openChar,
-// final int typeString,
-// final String errorMsg) {
-// StringBuffer sBuffer = new StringBuffer();
-// boolean openString = true;
-// int startRow = rowCount;
-// while (str.length() > chIndx) {
-// ch = str.charAt(chIndx++);
-// if (ch == '\\') {
-// sBuffer.append(ch);
-// if (str.length() > chIndx) {
-// ch = str.charAt(chIndx++);
-// sBuffer.append(ch);
-// }
-// } else if (ch == openChar) {
-// openString = false;
-// break;
-// } else if (ch == '\n') {
-// rowCount++;
-// columnCount = chIndx;
-// } else {
-// sBuffer.append(ch);
-// }
-// }
-// if (openString) {
-// if (typeString == TokenNameStringConstant) {
-// throwSyntaxError(errorMsg, startRow);
-// } else {
-// throwSyntaxError(errorMsg);
-// }
-// }
-// token = typeString;
-// stringValue = sBuffer.toString();
-// }
+ // private void getNumber() {
+ // StringBuffer inum = new StringBuffer();
+ // char dFlag = ' ';
+ // int numFormat = 10;
+ //
+ // // save first digit
+ // char firstCh = ch;
+ // inum.append(ch);
+ //
+ // getChar();
+ // // determine number conversions:
+ // if (firstCh == '0') {
+ // switch (ch) {
+ // case 'b' :
+ // numFormat = 2;
+ // getChar();
+ // break;
+ // case 'B' :
+ // numFormat = 2;
+ // getChar();
+ // break;
+ // case 'o' :
+ // numFormat = 8;
+ // getChar();
+ // break;
+ // case 'O' :
+ // numFormat = 8;
+ // getChar();
+ // break;
+ // case 'x' :
+ // numFormat = 16;
+ // getChar();
+ // break;
+ // case 'X' :
+ // numFormat = 16;
+ // getChar();
+ // break;
+ // }
+ // }
+ //
+ // if (numFormat == 16) {
+ // while ((ch >= '0' && ch <= '9')
+ // || (ch >= 'a' && ch <= 'f')
+ // || (ch >= 'A' && ch <= 'F')) {
+ // inum.append(ch);
+ // getChar();
+ // }
+ // } else {
+ // while ((ch >= '0' && ch <= '9')
+ // || (ch == '.')
+ // || (ch == 'E')
+ // || (ch == 'e')) {
+ // if ((ch == '.') || (ch == 'E') || (ch == 'e')) {
+ // if (ch == '.' && dFlag != ' ') {
+ // break;
+ // }
+ // if ((dFlag == 'E') || (dFlag == 'e')) {
+ // break;
+ // }
+ // dFlag = ch;
+ // inum.append(ch);
+ // getChar();
+ // if ((ch == '-') || (ch == '+')) {
+ // inum.append(ch);
+ // getChar();
+ // }
+ // } else {
+ // inum.append(ch);
+ // getChar();
+ // }
+ // }
+ // }
+ // chIndx--;
+ //
+ // try {
+ // if (dFlag != ' ') {
+ // doubleNumber = new Double(inum.toString());
+ // token = TokenNameDoubleLiteral;
+ // return;
+ // } else {
+ // longNumber = Long.valueOf(inum.toString(), numFormat);
+ // token = TokenNameIntegerLiteral;
+ // return;
+ // }
+ //
+ // } catch (Throwable e) {
+ // throwSyntaxError("Number format error: " + inum.toString());
+ // }
+ // }
+ //
+ // /**
+ // * Get a String.
+ // * @param openChar the opening char ('\'', '"', '`')
+ // * @param typeString the type of string {@link #TokenNameSTRING_CONSTANT},{@link #TokenNameINTERPOLATED_STRING}
+ // * @param errorMsg the error message in case of parse error in the string
+ // */
+ // private void getString(
+ // final char openChar,
+ // final int typeString,
+ // final String errorMsg) {
+ // StringBuffer sBuffer = new StringBuffer();
+ // boolean openString = true;
+ // int startRow = rowCount;
+ // while (str.length() > chIndx) {
+ // ch = str.charAt(chIndx++);
+ // if (ch == '\\') {
+ // sBuffer.append(ch);
+ // if (str.length() > chIndx) {
+ // ch = str.charAt(chIndx++);
+ // sBuffer.append(ch);
+ // }
+ // } else if (ch == openChar) {
+ // openString = false;
+ // break;
+ // } else if (ch == '\n') {
+ // rowCount++;
+ // columnCount = chIndx;
+ // } else {
+ // sBuffer.append(ch);
+ // }
+ // }
+ // if (openString) {
+ // if (typeString == TokenNameStringConstant) {
+ // throwSyntaxError(errorMsg, startRow);
+ // } else {
+ // throwSyntaxError(errorMsg);
+ // }
+ // }
+ // token = typeString;
+ // stringValue = sBuffer.toString();
+ // }
// public void htmlParserTester(String input) {
// int lineNumber = 1;
}
}
this.token = TokenNameEOF;
-// this.chIndx = 0;
-// this.rowCount = rowCount;
-// this.columnCount = 0;
+ // this.chIndx = 0;
+ // this.rowCount = rowCount;
+ // this.columnCount = 0;
this.phpEnd = false;
this.phpMode = true;
scanner.setSource(s.toCharArray());
if (token != TokenNameEOF && token != TokenNameERROR) {
statementList();
}
- if (token != TokenNameEOF && token != TokenNameERROR) {
+ if (token != TokenNameEOF) {
+ if (token == TokenNameERROR) {
+ throwSyntaxError(
+ "Scanner error (Found unknown token: "
+ + scanner.toStringAction(token)
+ + ")");
+ }
if (token == TokenNameRPAREN) {
throwSyntaxError("Too many closing ')'; end-of-file not reached.");
}
public void parse(String s) throws CoreException {
this.str = s;
this.token = TokenNameEOF;
-// this.chIndx = 0;
-// this.rowCount = 1;
-// this.columnCount = 0;
+ // this.chIndx = 0;
+ // this.rowCount = 1;
+ // this.columnCount = 0;
this.phpEnd = false;
this.phpMode = false;
/* scanner initialization */
if (token != TokenNameEOF && token != TokenNameERROR) {
statementList();
}
- if (token != TokenNameEOF && token != TokenNameERROR) {
+ if (token != TokenNameEOF) {
+ if (token == TokenNameERROR) {
+ throwSyntaxError(
+ "Scanner error (Found unknown token: "
+ + scanner.toStringAction(token)
+ + ")");
+ }
if (token == TokenNameRPAREN) {
throwSyntaxError("Too many closing ')'; end-of-file not reached.");
}
this.str = s;
this.token = TokenNameEOF;
-// this.chIndx = 0;
-// this.rowCount = 1;
-// this.columnCount = 0;
+ // this.chIndx = 0;
+ // this.rowCount = 1;
+ // this.columnCount = 0;
this.phpEnd = false;
this.phpMode = false;
scanner.setSource(s.toCharArray());
// PHPClassDeclaration current = (PHPClassDeclaration) stack.peek();
PHPSegmentWithChildren temp;
int counter = 0;
-
+
IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore();
try {
while (token != TokenNameEOF && token != TokenNameERROR) {
outlineInfo.addVariable(variableName);
getNextToken();
if (token != TokenNameSEMICOLON) {
-
+
getNextToken();
ident = scanner.getCurrentTokenSource();
if (token > TokenNameKEYWORD) {
|| token == TokenNamerequire_once
|| token == TokenNameinclude
|| token == TokenNameinclude_once) {
- ident = scanner.getCurrentTokenSource();
-
+ ident = scanner.getCurrentTokenSource();
+
getNextToken();
int startPosition = scanner.getCurrentTokenStartPosition();
expression();
- char[] expr = scanner.getCurrentTokenSource(startPosition);
+ char[] expr = scanner.getCurrentTokenSource(startPosition);
outlineInfo.addVariable(new String(ident));
current.add(new PHPReqIncDeclaration(current, new String(ident),
// chIndx - ident.length,
private void expression() throws CoreException {
//todo: find a better way to get the expression
-// expression = new StringBuffer();
-// for (int i = chIndx; i < str.length(); i++) {
-// if (str.charAt(i) == ';') {
-// break;
-// }
-// expression.append(str.charAt(i));
-// }
-
+ // expression = new StringBuffer();
+ // for (int i = chIndx; i < str.length(); i++) {
+ // if (str.charAt(i) == ';') {
+ // break;
+ // }
+ // expression.append(str.charAt(i));
+ // }
+
// if (token == TokenNameSTRING_CONSTANT || token == TokenNameINTERPOLATED_STRING) {
// getNextToken();
// } else {
unaryExpression();
}
- private void typeName() throws CoreException {
- //'string' 'unset' 'array' 'object'
- //'bool' 'boolean'
- //'real' 'double' 'float'
- //'int' 'integer'
- String identifier = "";
- if (token == TokenNameIdentifier) {
- char[] ident = scanner.getCurrentIdentifierSource();
- identifier = new String(ident);
- String str = identifier.toLowerCase();
- getNextToken();
- for (int i = 0; i < PHP_TYPES.length; i++) {
- if (PHP_TYPES[i].equals(str)) {
- return;
- }
- }
- }
- throwSyntaxError(
- "Expected type cast '( <type-name> )'; Got '" + identifier + "'.");
- }
+ // private void typeName() throws CoreException {
+ // //'string' 'unset' 'array' 'object'
+ // //'bool' 'boolean'
+ // //'real' 'double' 'float'
+ // //'int' 'integer'
+ // String identifier = "";
+ // if (token == TokenNameIdentifier) {
+ // char[] ident = scanner.getCurrentIdentifierSource();
+ // identifier = new String(ident);
+ // String str = identifier.toLowerCase();
+ // getNextToken();
+ // for (int i = 0; i < PHP_TYPES.length; i++) {
+ // if (PHP_TYPES[i].equals(str)) {
+ // return;
+ // }
+ // }
+ // }
+ // throwSyntaxError(
+ // "Expected type cast '( <type-name> )'; Got '" + identifier + "'.");
+ // }
private void assignExpression() throws CoreException {
castExpression();
}
}
- /**
- * Call the php parse command ( php -l -f <filename> )
- * and create markers according to the external parser output
- */
- public static void phpExternalParse(IFile file) {
- //IFile file = (IFile) resource;
- IPath path = file.getFullPath();
- IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore();
- String filename = file.getLocation().toString();
-
- String[] arguments = { filename };
- MessageFormat form =
- new MessageFormat(store.getString(PHPeclipsePlugin.EXTERNAL_PARSER_PREF));
- String command = form.format(arguments);
-
- String parserResult =
- PHPStartApacheAction.getParserOutput(command, "External parser: ");
-
- try {
- // parse the buffer to find the errors and warnings
- createMarkers(parserResult, file);
- } catch (CoreException e) {
- }
- }
-
- /**
- * Create markers according to the external parser output
- */
- private static void createMarkers(String output, IFile file)
- throws CoreException {
- // delete all markers
- file.deleteMarkers(IMarker.PROBLEM, false, 0);
-
- int indx = 0;
- int brIndx = 0;
- boolean flag = true;
- while ((brIndx = output.indexOf("<br />", indx)) != -1) {
- // newer php error output (tested with 4.2.3)
- scanLine(output, file, indx, brIndx);
- indx = brIndx + 6;
- flag = false;
- }
- if (flag) {
- while ((brIndx = output.indexOf("<br>", indx)) != -1) {
- // older php error output (tested with 4.2.3)
- scanLine(output, file, indx, brIndx);
- indx = brIndx + 4;
- }
- }
- }
-
- private static void scanLine(String output, IFile file, int indx, int brIndx)
- throws CoreException {
- String current;
- String outLineNumberString;
- StringBuffer lineNumberBuffer = new StringBuffer(10);
- char ch;
- current = output.substring(indx, brIndx);
-
- if (current.indexOf(PARSE_WARNING_STRING) != -1
- || current.indexOf(PARSE_ERROR_STRING) != -1) {
- int onLine = current.indexOf("on line <b>");
- if (onLine != -1) {
- lineNumberBuffer.delete(0, lineNumberBuffer.length());
- for (int i = onLine; i < current.length(); i++) {
- ch = current.charAt(i);
- if ('0' <= ch && '9' >= ch) {
- lineNumberBuffer.append(ch);
- }
- }
-
- int lineNumber = Integer.parseInt(lineNumberBuffer.toString());
-
- Hashtable attributes = new Hashtable();
-
- current = current.replaceAll("\n", "");
- current = current.replaceAll("<b>", "");
- current = current.replaceAll("</b>", "");
- MarkerUtilities.setMessage(attributes, current);
-
- if (current.indexOf(PARSE_ERROR_STRING) != -1)
- attributes.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_ERROR));
- else if (current.indexOf(PARSE_WARNING_STRING) != -1)
- attributes.put(
- IMarker.SEVERITY,
- new Integer(IMarker.SEVERITY_WARNING));
- else
- attributes.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_INFO));
- MarkerUtilities.setLineNumber(attributes, lineNumber);
- MarkerUtilities.createMarker(file, attributes, IMarker.PROBLEM);
- }
- }
- }
}
\ No newline at end of file