[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-patch] Scanner/Parser robustness for Outline view
|
- added quickParse heuristic to Scanner for handling #if conditionals to
avoid throwing ScannerExceptions on undefined preprocessor symbols
- added minimal enum support to Parser (though not to DOM or CModel)
Index: parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java,v
retrieving revision 1.3
diff -u -r1.3 ScannerTestCase.java
--- parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java 6 Mar 2003 19:29:31 -0000 1.3
+++ parser/org/eclipse/cdt/core/parser/tests/ScannerTestCase.java 6 Mar 2003 22:26:11 -0000
@@ -811,6 +811,38 @@
}
}
+ public void testQuickScan()
+ {
+ try
+ {
+ initializeScanner( "#if X + 5 < 7\n int found = 1;\n#endif" );
+ scanner.setQuickScan( true );
+ validateToken( Token.t_int );
+ validateIdentifier( "found" );
+ validateToken( Token.tASSIGN );
+ validateInteger( "1");
+ validateToken( Token.tSEMI );
+ validateEOF();
+
+ }
+ catch( ScannerException se )
+ {
+ fail( EXCEPTION_THROWN + se.getMessage() );
+ }
+
+ try
+ {
+ initializeScanner( "#if 0\n int error = 666;\n#endif" );
+ scanner.setQuickScan( true );
+ validateEOF();
+ }
+ catch( ScannerException se )
+ {
+ fail( EXCEPTION_THROWN + se.getMessage() );
+ }
+
+ }
+
public void testInclusions()
{
try
Index: parser/org/eclipse/cdt/internal/core/parser/ExpressionEvaluator.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/ExpressionEvaluator.java,v
retrieving revision 1.2
diff -u -r1.2 ExpressionEvaluator.java
--- parser/org/eclipse/cdt/internal/core/parser/ExpressionEvaluator.java 4 Mar 2003 18:25:40 -0000 1.2
+++ parser/org/eclipse/cdt/internal/core/parser/ExpressionEvaluator.java 6 Mar 2003 22:26:38 -0000
@@ -10,6 +10,7 @@
******************************************************************************/
package org.eclipse.cdt.internal.core.parser;
+import java.util.EmptyStackException;
import java.util.Stack;
public class ExpressionEvaluator extends NullParserCallback {
@@ -104,7 +105,7 @@
}
}
- public Object getResult() {
+ public Object getResult() throws EmptyStackException {
return stack.peek();
}
Index: parser/org/eclipse/cdt/internal/core/parser/Parser.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Parser.java,v
retrieving revision 1.5
diff -u -r1.5 Parser.java
--- parser/org/eclipse/cdt/internal/core/parser/Parser.java 6 Mar 2003 19:46:28 -0000 1.5
+++ parser/org/eclipse/cdt/internal/core/parser/Parser.java 6 Mar 2003 22:26:38 -0000
@@ -341,7 +341,7 @@
classSpecifier(decl);
return;
case Token.t_enum:
- // enumSpecifier();
+ enumSpecifier(decl);
break;
default:
break declSpecifiers;
@@ -465,9 +465,6 @@
}
}
}
- else
- {
- }
}
callback.declaratorEnd( declarator );
@@ -590,6 +587,46 @@
throw backtrack;
}
+
+ /**
+ * enumSpecifier
+ * "enum" (name)? "{" (enumerator-list) "}"
+ */
+ public void enumSpecifier( Object owner ) throws Exception
+ {
+ if( LT(1) != Token.t_enum )
+ throw backtrack;
+ consume();
+
+ // insert beginEnum callback here
+
+ if( LT(1) == Token.tIDENTIFIER )
+ consume();
+
+
+ if( LT(1) == Token.tLBRACE )
+ {
+ consume();
+ // for the time being to get the CModel working ignore the enumerator list
+ int depth = 1;
+ while (depth > 0) {
+ switch (consume().getType()) {
+ case Token.tRBRACE:
+ --depth;
+ break;
+ case Token.tLBRACE:
+ ++depth;
+ break;
+ case Token.tEOF:
+ // Oops, no match
+ throw backtrack;
+ }
+ }
+ }
+
+ // insert endEnum callback here
+ }
+
/**
* classSpecifier
* : classKey name (baseClause)? "{" (memberSpecification)* "}"
@@ -1232,12 +1269,16 @@
}
public void primaryExpression() throws Exception {
- switch (LT(1)) {
+ int type = LT(1);
+ switch (type) {
// TO DO: we need more literals...
case Token.tINTEGER:
callback.expressionTerminal(consume());
return;
case Token.tSTRING:
+ callback.expressionTerminal(consume());
+ return;
+ case Token.tIDENTIFIER:
callback.expressionTerminal(consume());
return;
case Token.t_this:
Index: parser/org/eclipse/cdt/internal/core/parser/Scanner.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Scanner.java,v
retrieving revision 1.2
diff -u -r1.2 Scanner.java
--- parser/org/eclipse/cdt/internal/core/parser/Scanner.java 4 Mar 2003 18:25:40 -0000 1.2
+++ parser/org/eclipse/cdt/internal/core/parser/Scanner.java 6 Mar 2003 22:26:37 -0000
@@ -526,14 +526,14 @@
case PreprocessorDirectives.IF :
// get the rest of the line
String expression = getRestOfPreprocessorLine();
-
- boolean expressionEvalResult =
- evaluateExpression(expression);
+ boolean expressionEvalResult = evaluateExpression(expression);
passOnToClient = branches.poundif( expressionEvalResult );
c = getChar();
continue;
+
+
case PreprocessorDirectives.IFDEF :
skipOverWhitespace();
String definition = getNextIdentifier();
@@ -588,7 +588,7 @@
throw new ScannerException("Malformed #elsif clause");
boolean elsifResult =
- evaluateExpression(elsifExpression);
+ evaluateExpression(elsifExpression );
passOnToClient = branches.poundelif( elsifResult );
c = getChar();
@@ -1089,42 +1089,59 @@
return branches.getDepth();
}
- protected boolean evaluateExpression(String expression)
+ protected boolean evaluateExpression(String expression )
throws ScannerException {
- Object expressionEvalResult = null;
- try {
- ExpressionEvaluator evaluator = new ExpressionEvaluator();
- Scanner trial =
- new Scanner(
- new StringReader(expression),
- EXPRESSION,
- definitions);
- Parser parser = new Parser(trial, evaluator);
- parser.expression();
- expressionEvalResult = evaluator.getResult();
- } catch (Exception e) {
- System.out.println("Exception from Parser : " + e.toString());
+
+ if( quickScan )
+ {
+ if( expression.trim().equals( "0" ) )
+ return false;
+ return true;
}
-
- if (expressionEvalResult == null)
- throw new ScannerException(
- "Expression "
- + expression
- + " evaluates to an undefined value");
-
- if (expressionEvalResult.getClass() == java.lang.Integer.class) {
- int i = ((Integer) expressionEvalResult).intValue();
- if (i == 0) {
- return false;
+ else
+ {
+ Object expressionEvalResult = null;
+ try {
+ ExpressionEvaluator evaluator = new ExpressionEvaluator();
+ Scanner trial =
+ new Scanner(
+ new StringReader(expression),
+ EXPRESSION,
+ definitions);
+ Parser parser = new Parser(trial, evaluator);
+ parser.expression();
+
+ expressionEvalResult = evaluator.getResult();
+
+ } catch (Exception e ) {
+ throw new ScannerException(
+ "Expression "
+ + expression
+ + " evaluates to an undefined value");
+ } finally
+ {
+ if (expressionEvalResult == null)
+ throw new ScannerException(
+ "Expression "
+ + expression
+ + " evaluates to an undefined value");
+ }
+
+
+ if (expressionEvalResult.getClass() == java.lang.Integer.class) {
+ int i = ((Integer) expressionEvalResult).intValue();
+ if (i == 0) {
+ return false;
+ }
+ return true;
+ } else if (
+ expressionEvalResult.getClass() == java.lang.Boolean.class) {
+ return ((Boolean) expressionEvalResult).booleanValue();
+ } else {
+ throw new ScannerException(
+ "Unexpected expression type - we do not expect "
+ + expressionEvalResult.getClass().getName());
}
- return true;
- } else if (
- expressionEvalResult.getClass() == java.lang.Boolean.class) {
- return ((Boolean) expressionEvalResult).booleanValue();
- } else {
- throw new ScannerException(
- "Unexpected expression type - we do not expect "
- + expressionEvalResult.getClass().getName());
}
}