mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-01 05:15:43 +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:
parent
75b3224c1c
commit
a149a4fbe0
2 changed files with 78 additions and 27 deletions
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -17,6 +17,7 @@ import java.util.List;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTASMDeclaration;
|
import org.eclipse.cdt.core.dom.ast.IASTASMDeclaration;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator;
|
import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTArrayModifier;
|
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.IASTBinaryExpression;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTBreakStatement;
|
import org.eclipse.cdt.core.dom.ast.IASTBreakStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTCaseStatement;
|
import org.eclipse.cdt.core.dom.ast.IASTCaseStatement;
|
||||||
|
@ -1306,10 +1307,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
*/
|
*/
|
||||||
protected IASTExpression postfixExpression() throws EndOfFileException,
|
protected IASTExpression postfixExpression() throws EndOfFileException,
|
||||||
BacktrackException {
|
BacktrackException {
|
||||||
IToken la = LA(1);
|
|
||||||
int startingOffset = la.getOffset();
|
|
||||||
int line = la.getLineNumber();
|
|
||||||
char[] fn = la.getFilename();
|
|
||||||
IASTExpression firstExpression = null;
|
IASTExpression firstExpression = null;
|
||||||
boolean isTemplate = false;
|
boolean isTemplate = false;
|
||||||
|
|
||||||
|
@ -1419,31 +1416,27 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
IASTExpression secondExpression = null;
|
IASTExpression secondExpression = null;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
switch (LT(1)) {
|
switch (LT(1)) {
|
||||||
case IToken.tLBRACKET:
|
case IToken.tLBRACKET:
|
||||||
// array access
|
// array access
|
||||||
consume(IToken.tLBRACKET);
|
consume(IToken.tLBRACKET);
|
||||||
if (templateIdScopes.size() > 0) {
|
if (templateIdScopes.size() > 0) {
|
||||||
templateIdScopes.push(IToken.tLBRACKET);
|
templateIdScopes.push(IToken.tLBRACKET);
|
||||||
}
|
}
|
||||||
secondExpression = expression();
|
secondExpression = expression();
|
||||||
int endOffset = consume(IToken.tRBRACKET).getEndOffset();
|
consume(IToken.tRBRACKET);
|
||||||
if (templateIdScopes.size() > 0) {
|
if (templateIdScopes.size() > 0) {
|
||||||
templateIdScopes.pop();
|
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
break;
|
||||||
case IToken.tLPAREN:
|
case IToken.tLPAREN:
|
||||||
// function call
|
// function call
|
||||||
|
@ -1456,7 +1449,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
secondExpression = expression();
|
secondExpression = expression();
|
||||||
else
|
else
|
||||||
secondExpression = null;
|
secondExpression = null;
|
||||||
endOffset = consume(IToken.tRPAREN).getEndOffset();
|
consume(IToken.tRPAREN);
|
||||||
|
|
||||||
if (templateIdScopes.size() > 0) {
|
if (templateIdScopes.size() > 0) {
|
||||||
templateIdScopes.pop();
|
templateIdScopes.pop();
|
||||||
|
@ -1492,7 +1485,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
}
|
}
|
||||||
|
|
||||||
IASTName name = createName( idExpression() );
|
IASTName name = createName( idExpression() );
|
||||||
endOffset = (lastToken != null) ? lastToken.getEndOffset() : 0;
|
|
||||||
|
|
||||||
ICPPASTFieldReference fieldReference = createFieldReference();
|
ICPPASTFieldReference fieldReference = createFieldReference();
|
||||||
((ASTNode)fieldReference).setOffset( ((ASTNode)firstExpression).getOffset());
|
((ASTNode)fieldReference).setOffset( ((ASTNode)firstExpression).getOffset());
|
||||||
|
@ -1517,7 +1509,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
}
|
}
|
||||||
|
|
||||||
name = createName( idExpression() );
|
name = createName( idExpression() );
|
||||||
endOffset = (lastToken != null) ? lastToken.getEndOffset() : 0;
|
|
||||||
|
|
||||||
fieldReference = createFieldReference();
|
fieldReference = createFieldReference();
|
||||||
((ASTNode)fieldReference).setOffset( ((ASTNode)firstExpression).getOffset());
|
((ASTNode)fieldReference).setOffset( ((ASTNode)firstExpression).getOffset());
|
||||||
|
@ -1538,6 +1529,13 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected IASTArraySubscriptExpression createArraySubscriptExpression() {
|
||||||
|
return new CPPASTArraySubscriptExpression();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Add table
Reference in a new issue