X-Git-Url: http://git.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 61fd6d7..44568b9 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 @@ -10,36 +10,23 @@ Contributors: **********************************************************************/ 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; @@ -48,11 +35,11 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { 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; @@ -72,7 +59,7 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { private String stringValue; /** Contains the current expression. */ - // private StringBuffer expression; + // private StringBuffer expression; private boolean phpMode; @@ -151,6 +138,19 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { // 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. * @@ -159,20 +159,20 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { *@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(); @@ -194,36 +194,6 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { 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 @@ -232,28 +202,24 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { */ 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); } /** @@ -271,18 +237,18 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { * *@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 @@ -290,7 +256,7 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { private void getNextToken() throws CoreException { try { token = scanner.getNextToken(); - if (DEBUG) { + if (Scanner.DEBUG) { int currentEndPosition = scanner.getCurrentTokenEndPosition(); int currentStartPosition = scanner.getCurrentTokenStartPosition(); @@ -921,137 +887,137 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { * if it's a double the number will be stored in longNumber 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; @@ -1271,9 +1237,9 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { } } 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()); @@ -1284,7 +1250,13 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { 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."); } @@ -1343,9 +1315,9 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { 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 */ @@ -1357,7 +1329,13 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { 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."); } @@ -1422,9 +1400,9 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { 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()); @@ -1446,7 +1424,7 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { // PHPClassDeclaration current = (PHPClassDeclaration) stack.peek(); PHPSegmentWithChildren temp; int counter = 0; - + IPreferenceStore store = PHPeclipsePlugin.getDefault().getPreferenceStore(); try { while (token != TokenNameEOF && token != TokenNameERROR) { @@ -1463,7 +1441,7 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { outlineInfo.addVariable(variableName); getNextToken(); if (token != TokenNameSEMICOLON) { - + getNextToken(); ident = scanner.getCurrentTokenSource(); if (token > TokenNameKEYWORD) { @@ -1574,12 +1552,12 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { || 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, @@ -2446,14 +2424,14 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { 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 { @@ -2820,26 +2798,26 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { 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 '( )'; 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 '( )'; Got '" + identifier + "'."); + // } private void assignExpression() throws CoreException { castExpression(); @@ -3190,97 +3168,4 @@ public class Parser extends PHPKeywords implements ITerminalSymbols { } } - /** - * 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("
", 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("
", 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 "); - 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("", ""); - current = current.replaceAll("", ""); - 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