Skip to main content

[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());
 		}
 	}
 

Back to the top