Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] Parser update - Preliminary Operator Support

CORE
	Updated Scanner to convert ungodly control-characters to ' '.  
	Fixed logic error in model\SimpleDeclarationWrapper.
	Added operator support to grammar (conversion and overloading).  
	Fixed parser/util/Name.toString() to support non-qualified yet
multi-part names.

JohnC

Index: parser/ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/ChangeLog,v
retrieving revision 1.17
diff -u -r1.17 ChangeLog
--- parser/ChangeLog	2 Apr 2003 13:18:50 -0000	1.17
+++ parser/ChangeLog	2 Apr 2003 21:49:17 -0000
@@ -1,3 +1,9 @@
+2003-04-01 John Camelon
+	Updated Scanner to convert control-characters to ' '.  
+	Fixed logic error in SimpleDeclarationWrapper.
+	Added operator support to grammar.  
+	Fixed Name.toString() to support non-qualified yet multi-part names.
+
 2003-04-01 Andrew Niefer
 	Parser Symbol Table, modified lookup with respect to resolving ambiguous names,
 	reducing the number of temporary lists/sets.  Modified adding using declarations
Index: parser/org/eclipse/cdt/internal/core/model/NewModelBuilder.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/NewModelBuilder.java,v
retrieving revision 1.17
diff -u -r1.17 NewModelBuilder.java
--- parser/org/eclipse/cdt/internal/core/model/NewModelBuilder.java	2 Apr 2003 13:13:29 -0000	1.17
+++ parser/org/eclipse/cdt/internal/core/model/NewModelBuilder.java	2 Apr 2003 21:49:17 -0000
@@ -354,8 +354,8 @@
 		elem.setElementName( elementName );
 		if( wrapper.getName() != null )
 		{ 	
-			elem.setIdPos(wrapper.getName().getStartOffset(), elementName.length());
-			elem.setPos(wrapper.getName().getStartOffset(), elementName.length());
+			elem.setIdPos(wrapper.getName().getStartOffset(), wrapper.getName().length());
+			elem.setPos(wrapper.getName().getStartOffset(), wrapper.getName().length());
 		}
 		else
 		{
Index: parser/org/eclipse/cdt/internal/core/model/SimpleDeclarationWrapper.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/SimpleDeclarationWrapper.java,v
retrieving revision 1.14
diff -u -r1.14 SimpleDeclarationWrapper.java
--- parser/org/eclipse/cdt/internal/core/model/SimpleDeclarationWrapper.java	1 Apr 2003 18:52:37 -0000	1.14
+++ parser/org/eclipse/cdt/internal/core/model/SimpleDeclarationWrapper.java	2 Apr 2003 21:49:17 -0000
@@ -14,10 +14,6 @@
 /**
  * @author jcamelon
  *
- * To change this generated comment edit the template variable "typecomment":
- * Window>Preferences>Java>Templates.
- * To enable and disable the creation of type comments go to
- * Window>Preferences>Java>Code Generation.
  */
 public class SimpleDeclarationWrapper extends DeclSpecifier implements DeclSpecifier.Container, ICElementWrapper {
 
@@ -29,7 +25,7 @@
 
 	public SimpleDeclarationWrapper( IParent item )
 	{
-		this.element = item; 
+		this.parent = item; 
 	}
 	
 	public SimpleDeclarationWrapper()
@@ -139,8 +135,8 @@
 			if( currentDeclarator.getName() != null )
 			{
 				// hook up the offsets
-				declaration.setIdPos( currentDeclarator.getName().getStartOffset(), declaratorName.length());
-				declaration.setPos( currentDeclarator.getName().getStartOffset(), declaratorName.length() );
+				declaration.setIdPos( currentDeclarator.getName().getStartOffset(), currentDeclarator.getName().length() );
+				declaration.setPos( currentDeclarator.getName().getStartOffset(), currentDeclarator.getName().length());
 			}
 			else
 			{
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.19
diff -u -r1.19 Parser.java
--- parser/org/eclipse/cdt/internal/core/parser/Parser.java	2 Apr 2003 13:13:29 -0000	1.19
+++ parser/org/eclipse/cdt/internal/core/parser/Parser.java	2 Apr 2003 21:49:18 -0000
@@ -914,7 +914,7 @@
 	 */
 	protected Object initDeclarator( Object owner ) throws Backtrack {
 		Object declarator = declarator( owner );
-		
+			
 		// handle = initializerClause
 		if (LT(1) == Token.tASSIGN) {
 			consume(); 
@@ -1011,9 +1011,60 @@
 				return declarator;
 			}
 			
-			name();
-			try{ callback.declaratorId(declarator);} catch( Exception e ) {}
-			
+			if( LT(1) == Token.t_operator )
+			{
+				// we know this is an operator
+				Token operatorToken = consume( Token.t_operator );
+				Token toSend = null;
+				if( LA(1).isOperator() || LT(1) == Token.tLPAREN || LT(1) == Token.tLBRACKET )
+				{
+					if( (LT(1) == Token.t_new || LT(1) == Token.t_delete ) && 
+							LT(2) == Token.tLBRACKET && LT(3) == Token.tRBRACKET )
+					{
+						consume(); 
+						consume( Token.tLBRACKET );
+						toSend = consume( Token.tRBRACKET );
+						// vector new and delete operators
+					}
+					else if ( LT(1) == Token.tLPAREN && LT(2) == Token.tRPAREN )
+					{
+						// operator ()
+						consume( Token.tLPAREN );
+						toSend = toSend = consume( Token.tRPAREN );
+					}
+					else if ( LT(1) == Token.tLBRACKET && LT(2) == Token.tRBRACKET )
+					{
+						consume( Token.tLBRACKET );
+						toSend = consume( Token.tRBRACKET ); 
+					}
+					else if( LA(1).isOperator() )
+						toSend = consume();
+					else 
+						throw backtrack;
+													
+				}
+				else
+				{
+					// temporary 
+					while( LT(1) != Token.tLPAREN )
+					{
+						toSend = consume(); 
+					}
+				}
+					
+				try{ 
+					callback.nameBegin( operatorToken );
+					callback.nameEnd( toSend );
+				} catch( Exception e ) {}
+
+				
+			}
+			else
+			{
+				name();
+			}
+
+			try{ callback.declaratorId(declarator);} catch( Exception e ) {}			
 			for (;;) {
 				switch (LT(1)) {
 					case Token.tLPAREN:
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.12
diff -u -r1.12 Scanner.java
--- parser/org/eclipse/cdt/internal/core/parser/Scanner.java	2 Apr 2003 13:13:29 -0000	1.12
+++ parser/org/eclipse/cdt/internal/core/parser/Scanner.java	2 Apr 2003 21:49:18 -0000
@@ -1196,7 +1196,7 @@
 							throw new ScannerException( "Invalid character '" + (char)c + "' read @ offset " + currentContext.getOffset() + " of file " + currentContext.getFilename() );
 						else
 						{
-							c = getChar();
+							c = ' ';
 							continue;
 						}
 				}
Index: parser/org/eclipse/cdt/internal/core/parser/Token.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/Token.java,v
retrieving revision 1.6
diff -u -r1.6 Token.java
--- parser/org/eclipse/cdt/internal/core/parser/Token.java	1 Apr 2003 18:52:18 -0000	1.6
+++ parser/org/eclipse/cdt/internal/core/parser/Token.java	2 Apr 2003 21:49:18 -0000
@@ -43,6 +43,54 @@
 	private Token next;
 	public Token getNext() { return next; }
 	public void setNext(Token t) { next = t; }
+	
+	public boolean isOperator()
+	{
+		switch( getType() )
+		{
+			case Token.t_new:
+			case Token.t_delete:
+			case Token.tPLUS:
+			case Token.tMINUS:
+			case Token.tSTAR:
+			case Token.tDIV:
+			case Token.tXOR:
+			case Token.tMOD:
+			case Token.tAMPER:
+			case Token.tBITOR:
+			case Token.tCOMPL:
+			case Token.tNOT:
+			case Token.tASSIGN:
+			case Token.tLT:
+			case Token.tGT:
+			case Token.tPLUSASSIGN:
+			case Token.tMINUSASSIGN:
+			case Token.tSTARASSIGN:
+			case Token.tDIVASSIGN:
+			case Token.tMODASSIGN:
+			case Token.tBITORASSIGN:
+			case Token.tAMPERASSIGN:
+			case Token.tXORASSIGN:
+			case Token.tSHIFTL:
+			case Token.tSHIFTR:
+			case Token.tSHIFTLASSIGN:
+			case Token.tSHIFTRASSIGN:
+			case Token.tEQUAL:
+			case Token.tNOTEQUAL:
+			case Token.tLTEQUAL:
+			case Token.tGTEQUAL:
+			case Token.tAND:
+			case Token.tOR:
+			case Token.tINCR:
+			case Token.tDECR:
+			case Token.tCOMMA:
+			case Token.tARROW:
+			case Token.tARROWSTAR:
+				return true;
+			default:
+				return false;
+		}
+	}
 
 	// Token types
 	static public final int tIDENTIFIER = 1;
@@ -83,7 +131,6 @@
 	static public final int tNOT = 36;
 	static public final int tEQUAL = 37;
 	static public final int tASSIGN = 38;
-	static public final int tSHIFLASSIGN = 39;
 	static public final int tSHIFTL = 40;
 	static public final int tLTEQUAL = 41;
 	static public final int tLT = 42;
Index: parser/org/eclipse/cdt/internal/core/parser/util/Name.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/util/Name.java,v
retrieving revision 1.3
diff -u -r1.3 Name.java
--- parser/org/eclipse/cdt/internal/core/parser/util/Name.java	5 Mar 2003 22:21:29 -0000	1.3
+++ parser/org/eclipse/cdt/internal/core/parser/util/Name.java	2 Apr 2003 21:49:18 -0000
@@ -35,13 +35,22 @@
 
 	public String toString() {
 		Token t = nameStart;
-		String name = t.getImage();
-		
+		StringBuffer buffer = new StringBuffer(); 
+		buffer.append( t.getImage() ); 
+		if( t.getType() == Token.t_operator )
+			buffer.append( " " );
+
 		while (t != nameEnd) {
 			t = t.getNext();
-			name += t.getImage();
+				
+			buffer.append( t.getImage() );			
 		}
 		
-		return name;
+		return buffer.toString();
+	}
+	
+	public int length()
+	{
+		return getEndOffset() - getStartOffset() + nameEnd.getImage().length();
 	}
 }

Back to the top