1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-23 17:05:26 +02:00

Fixed NPE in parsing the Trilogy for C++ w/the new parser due to a malformed array subscript postfix expression.

This commit is contained in:
John Camelon 2004-11-25 03:27:00 +00:00
parent 75b3224c1c
commit a149a4fbe0
2 changed files with 78 additions and 27 deletions

View file

@ -0,0 +1,53 @@
/**********************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.internal.core.parser2.cpp;
import org.eclipse.cdt.core.dom.ast.IASTArraySubscriptExpression;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
/**
* @author jcamelon
*/
public class CPPASTArraySubscriptExpression extends CPPASTNode implements
IASTArraySubscriptExpression {
private IASTExpression subscriptExp;
private IASTExpression arrayExpression;
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IASTArraySubscriptExpression#getArrayExpression()
*/
public IASTExpression getArrayExpression() {
return arrayExpression;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IASTArraySubscriptExpression#setArrayExpression(org.eclipse.cdt.core.dom.ast.IASTExpression)
*/
public void setArrayExpression(IASTExpression expression) {
arrayExpression = expression;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IASTArraySubscriptExpression#getSubscriptExpression()
*/
public IASTExpression getSubscriptExpression() {
return subscriptExp;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.dom.ast.IASTArraySubscriptExpression#setSubscriptExpression(org.eclipse.cdt.core.dom.ast.IASTExpression)
*/
public void setSubscriptExpression(IASTExpression expression) {
subscriptExp = expression;
}
}

View file

@ -17,6 +17,7 @@ import java.util.List;
import org.eclipse.cdt.core.dom.ast.IASTASMDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTArrayModifier;
import org.eclipse.cdt.core.dom.ast.IASTArraySubscriptExpression;
import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
import org.eclipse.cdt.core.dom.ast.IASTBreakStatement;
import org.eclipse.cdt.core.dom.ast.IASTCaseStatement;
@ -1306,10 +1307,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
*/
protected IASTExpression postfixExpression() throws EndOfFileException,
BacktrackException {
IToken la = LA(1);
int startingOffset = la.getOffset();
int line = la.getLineNumber();
char[] fn = la.getFilename();
IASTExpression firstExpression = null;
boolean isTemplate = false;
@ -1419,31 +1416,27 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
IASTExpression secondExpression = null;
for (;;) {
switch (LT(1)) {
case IToken.tLBRACKET:
case IToken.tLBRACKET:
// array access
consume(IToken.tLBRACKET);
if (templateIdScopes.size() > 0) {
templateIdScopes.push(IToken.tLBRACKET);
}
if (templateIdScopes.size() > 0) {
templateIdScopes.push(IToken.tLBRACKET);
}
secondExpression = expression();
int endOffset = consume(IToken.tRBRACKET).getEndOffset();
consume(IToken.tRBRACKET);
if (templateIdScopes.size() > 0) {
templateIdScopes.pop();
}
try {
firstExpression = null; /*
* astFactory.createExpression(scope,
* IASTExpression.Kind.POSTFIX_SUBSCRIPT,
* firstExpression,
* secondExpression, null, null,
* null, EMPTY_STRING, null); }
* catch (ASTSemanticException e2) {
* throwBacktrack(e2.getProblem());
*/
} catch (Exception e) {
logException("postfixExpression_3::createExpression()", e); //$NON-NLS-1$
throwBacktrack(startingOffset, endOffset, line, fn);
templateIdScopes.pop();
}
IASTArraySubscriptExpression s = createArraySubscriptExpression();
((ASTNode)s).setOffset( ((ASTNode)firstExpression).getOffset() );
s.setArrayExpression( firstExpression );
firstExpression.setParent( s );
firstExpression.setPropertyInParent( IASTArraySubscriptExpression.ARRAY );
s.setSubscriptExpression( secondExpression );
secondExpression.setParent( s );
secondExpression.setPropertyInParent( IASTArraySubscriptExpression.SUBSCRIPT );
firstExpression = s;
break;
case IToken.tLPAREN:
// function call
@ -1456,7 +1449,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
secondExpression = expression();
else
secondExpression = null;
endOffset = consume(IToken.tRPAREN).getEndOffset();
consume(IToken.tRPAREN);
if (templateIdScopes.size() > 0) {
templateIdScopes.pop();
@ -1492,7 +1485,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
}
IASTName name = createName( idExpression() );
endOffset = (lastToken != null) ? lastToken.getEndOffset() : 0;
ICPPASTFieldReference fieldReference = createFieldReference();
((ASTNode)fieldReference).setOffset( ((ASTNode)firstExpression).getOffset());
@ -1517,7 +1509,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
}
name = createName( idExpression() );
endOffset = (lastToken != null) ? lastToken.getEndOffset() : 0;
fieldReference = createFieldReference();
((ASTNode)fieldReference).setOffset( ((ASTNode)firstExpression).getOffset());
@ -1538,6 +1529,13 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
}
}
/**
* @return
*/
protected IASTArraySubscriptExpression createArraySubscriptExpression() {
return new CPPASTArraySubscriptExpression();
}
/**
* @return
*/