mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-06-09 10:46:02 +02:00
Compound statement expression nested in binary expression, bug 226274.
This commit is contained in:
parent
fa65eafa16
commit
db17e565b9
4 changed files with 108 additions and 684 deletions
|
@ -4465,4 +4465,13 @@ public class AST2Tests extends AST2BaseTest {
|
|||
parseAndCheckBindings(code, ParserLanguage.C, true);
|
||||
parseAndCheckBindings(code, ParserLanguage.CPP, true);
|
||||
}
|
||||
|
||||
// void test() {
|
||||
// ({1;}) != 0;
|
||||
// }
|
||||
public void testCompoundStatementExpression_Bug226274() throws Exception {
|
||||
final String code = getAboveComment();
|
||||
parseAndCheckBindings(code, ParserLanguage.C, true);
|
||||
parseAndCheckBindings(code, ParserLanguage.CPP, true);
|
||||
}
|
||||
}
|
|
@ -290,11 +290,6 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
parsePassed = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* /* (non-Javadoc)
|
||||
*
|
||||
* @see org.eclipse.cdt.core.parser.IParser#cancel()
|
||||
*/
|
||||
public synchronized void cancel() {
|
||||
isCancelled = true;
|
||||
}
|
||||
|
@ -325,10 +320,10 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
}
|
||||
|
||||
/**
|
||||
* @param bt
|
||||
* @deprecated
|
||||
*/
|
||||
protected void throwBacktrack(BacktrackException bt)
|
||||
throws BacktrackException {
|
||||
@Deprecated
|
||||
protected void throwBacktrack(BacktrackException bt) throws BacktrackException {
|
||||
throw bt;
|
||||
}
|
||||
|
||||
|
@ -345,19 +340,8 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param syntax_error
|
||||
* @param offset
|
||||
* @param length
|
||||
* @return
|
||||
*/
|
||||
protected abstract IASTProblem createProblem(int signal, int offset,
|
||||
int length);
|
||||
protected abstract IASTProblem createProblem(int signal, int offset, int length);
|
||||
|
||||
/**
|
||||
* @param string
|
||||
* @param e
|
||||
*/
|
||||
protected void logThrowable(String methodName, Throwable e) {
|
||||
if (e != null) {
|
||||
if (log.isTracing()) {
|
||||
|
@ -547,21 +531,10 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected abstract IASTProblemStatement createProblemStatement();
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected abstract IASTCompoundStatement createCompoundStatement();
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @throws EndOfFileException
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTExpression compoundStatementExpression() throws EndOfFileException, BacktrackException {
|
||||
int startingOffset = consume().getOffset(); // tLPAREN always
|
||||
IASTCompoundStatement compoundStatement = null;
|
||||
|
@ -585,22 +558,11 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
return resultExpression;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected abstract IGNUASTCompoundStatementExpression createCompoundStatementExpression();
|
||||
|
||||
protected IASTExpression expression() throws BacktrackException, EndOfFileException {
|
||||
IToken la = LA(1);
|
||||
int startingOffset = la.getOffset();
|
||||
|
||||
if (la.getType() == IToken.tLPAREN && LT(2) == IToken.tLBRACE
|
||||
&& supportStatementsInExpressions) {
|
||||
IASTExpression resultExpression = compoundStatementExpression();
|
||||
if (resultExpression != null)
|
||||
return resultExpression;
|
||||
}
|
||||
|
||||
IASTExpression assignmentExpression = assignmentExpression();
|
||||
if (LT(1) != IToken.tCOMMA)
|
||||
return assignmentExpression;
|
||||
|
@ -620,9 +582,6 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
return expressionList;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected abstract IASTExpressionList createExpressionList();
|
||||
|
||||
protected abstract IASTExpression assignmentExpression()
|
||||
|
@ -657,19 +616,11 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
return buildBinaryExpression(kind, lhs, rhs, calculateEndOffset(rhs));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTExpression constantExpression() throws BacktrackException,
|
||||
EndOfFileException {
|
||||
return conditionalExpression();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTExpression logicalOrExpression() throws BacktrackException,
|
||||
EndOfFileException {
|
||||
IASTExpression firstExpression = logicalAndExpression();
|
||||
|
@ -683,10 +634,6 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
return firstExpression;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTExpression logicalAndExpression() throws BacktrackException,
|
||||
EndOfFileException {
|
||||
IASTExpression firstExpression = inclusiveOrExpression();
|
||||
|
@ -700,10 +647,6 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
return firstExpression;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTExpression inclusiveOrExpression() throws BacktrackException,
|
||||
EndOfFileException {
|
||||
IASTExpression firstExpression = exclusiveOrExpression();
|
||||
|
@ -717,10 +660,6 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
return firstExpression;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTExpression exclusiveOrExpression() throws BacktrackException,
|
||||
EndOfFileException {
|
||||
IASTExpression firstExpression = andExpression();
|
||||
|
@ -734,10 +673,6 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
return firstExpression;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTExpression andExpression() throws EndOfFileException, BacktrackException {
|
||||
IASTExpression firstExpression = equalityExpression();
|
||||
while (LT(1) == IToken.tAMPER) {
|
||||
|
@ -750,10 +685,6 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
return firstExpression;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTExpression equalityExpression() throws EndOfFileException,
|
||||
BacktrackException {
|
||||
IASTExpression firstExpression = relationalExpression();
|
||||
|
@ -787,15 +718,8 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected abstract IASTBinaryExpression createBinaryExpression();
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTExpression shiftExpression() throws BacktrackException,
|
||||
EndOfFileException {
|
||||
IASTExpression firstExpression = additiveExpression();
|
||||
|
@ -817,10 +741,6 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTExpression additiveExpression() throws BacktrackException,
|
||||
EndOfFileException {
|
||||
IASTExpression firstExpression = multiplicativeExpression();
|
||||
|
@ -842,11 +762,6 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @return
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTExpression conditionalExpression() throws BacktrackException,
|
||||
EndOfFileException {
|
||||
IASTExpression firstExpression = logicalOrExpression();
|
||||
|
@ -878,20 +793,8 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
return firstExpression;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected abstract IASTConditionalExpression createConditionalExpression();
|
||||
|
||||
/**
|
||||
* @param operator
|
||||
* @param operand
|
||||
* @param offset
|
||||
* TODO
|
||||
* @param lastOffset
|
||||
* TODO
|
||||
* @return
|
||||
*/
|
||||
protected IASTExpression buildUnaryExpression(int operator,
|
||||
IASTExpression operand, int offset, int lastOffset) {
|
||||
IASTUnaryExpression result = createUnaryExpression();
|
||||
|
@ -901,16 +804,8 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected abstract IASTUnaryExpression createUnaryExpression();
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @throws BacktrackException
|
||||
* @throws EndOfFileException
|
||||
*/
|
||||
protected IASTExpression unaryAlignofExpression()
|
||||
throws EndOfFileException, BacktrackException {
|
||||
int offset = consume().getOffset(); // t___alignof__
|
||||
|
@ -1031,12 +926,8 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
throws EndOfFileException, BacktrackException;
|
||||
|
||||
/**
|
||||
* @param flags
|
||||
* input flags that are used to make our decision
|
||||
* @throws FoundDeclaratorException
|
||||
* @throws
|
||||
* @throws EndOfFileException
|
||||
* we could encounter EOF while looking ahead
|
||||
* @param flags input flags that are used to make our decision
|
||||
* @throws FoundDeclaratorException encountered EOF while looking ahead
|
||||
*/
|
||||
protected void lookAheadForDeclarator(Flags flags) throws FoundDeclaratorException {
|
||||
if (flags.typeId)
|
||||
|
@ -1216,14 +1107,9 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
* enumerator-definition enumerator-definition: enumerator enumerator =
|
||||
* constant-expression enumerator: identifier
|
||||
*
|
||||
* @param owner
|
||||
* IParserCallback object that represents the declaration that
|
||||
* owns this type specifier.
|
||||
* @throws BacktrackException
|
||||
* request a backtrack
|
||||
* @throws BacktrackException request a backtrack
|
||||
*/
|
||||
protected IASTEnumerationSpecifier enumSpecifier()
|
||||
throws BacktrackException, EndOfFileException {
|
||||
protected IASTEnumerationSpecifier enumSpecifier() throws BacktrackException, EndOfFileException {
|
||||
IToken mark = mark();
|
||||
IASTName name = null;
|
||||
int startOffset = consume().getOffset(); // t_enum
|
||||
|
@ -1307,31 +1193,21 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
return null;
|
||||
}
|
||||
|
||||
protected abstract IASTStatement statement() throws EndOfFileException,
|
||||
BacktrackException;
|
||||
|
||||
protected abstract IASTStatement statement() throws EndOfFileException, BacktrackException;
|
||||
|
||||
protected abstract IASTEnumerator createEnumerator();
|
||||
|
||||
|
||||
protected abstract IASTEnumerationSpecifier createEnumerationSpecifier();
|
||||
|
||||
|
||||
protected abstract IASTName createName();
|
||||
|
||||
|
||||
protected abstract IASTName createName(IToken token);
|
||||
|
||||
/**
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTExpression condition() throws BacktrackException,
|
||||
EndOfFileException {
|
||||
protected IASTExpression condition() throws BacktrackException, EndOfFileException {
|
||||
IASTExpression cond = expression();
|
||||
return cond;
|
||||
}
|
||||
|
||||
|
||||
public boolean encounteredError() {
|
||||
return !parsePassed;
|
||||
}
|
||||
|
@ -1383,12 +1259,6 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
EndOfFileException;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @throws EndOfFileException
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTDeclaration asmDeclaration() throws EndOfFileException,
|
||||
BacktrackException {
|
||||
IToken first = consume(); // t_asm
|
||||
|
@ -1434,13 +1304,6 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
return t;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param offset
|
||||
* @param assembly
|
||||
* @param lastOffset
|
||||
* TODO
|
||||
* @return
|
||||
*/
|
||||
protected IASTASMDeclaration buildASMDirective(int offset, String assembly,
|
||||
int lastOffset) {
|
||||
IASTASMDeclaration result = createASMDirective();
|
||||
|
@ -1483,7 +1346,6 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
IToken mark = mark();
|
||||
IASTExpressionStatement expressionStatement = null;
|
||||
IToken lastTokenOfExpression = null;
|
||||
BacktrackException savedBt = null;
|
||||
try {
|
||||
IASTExpression expression = expression();
|
||||
if (LT(1) == IToken.tEOC)
|
||||
|
@ -1506,24 +1368,22 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
ds.setDeclaration(d);
|
||||
((ASTNode) ds).setOffsetAndLength(((ASTNode) d).getOffset(), ((ASTNode) d).getLength());
|
||||
} catch (BacktrackException b) {
|
||||
savedBt = b;
|
||||
backup(mark);
|
||||
if (expressionStatement == null) {
|
||||
throw b;
|
||||
}
|
||||
}
|
||||
|
||||
// if not ambiguous then return the appropriate node
|
||||
if (expressionStatement == null && ds != null) {
|
||||
if (expressionStatement == null) {
|
||||
return ds;
|
||||
}
|
||||
if (expressionStatement != null && ds == null) {
|
||||
if (ds == null) {
|
||||
while (true) {
|
||||
if (consume() == lastTokenOfExpression)
|
||||
break;
|
||||
}
|
||||
return expressionStatement;
|
||||
}
|
||||
if (expressionStatement == null && ds == null)
|
||||
throwBacktrack(savedBt);
|
||||
|
||||
|
||||
// At this point we know we have an ambiguity.
|
||||
// Attempt to resolve some ambiguities that are easy to detect.
|
||||
|
@ -1623,11 +1483,6 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
|
||||
protected abstract IASTAmbiguousStatement createAmbiguousStatement();
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @throws EndOfFileException
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTStatement parseLabelStatement() throws EndOfFileException,
|
||||
BacktrackException {
|
||||
IToken labelName = consume(); // tIDENTIFIER
|
||||
|
@ -1644,11 +1499,6 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
return label_statement;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @throws EndOfFileException
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTStatement parseNullStatement() throws EndOfFileException,
|
||||
BacktrackException {
|
||||
IToken t = consume(); // tSEMI
|
||||
|
@ -1658,11 +1508,6 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
return null_statement;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @throws EndOfFileException
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTStatement parseGotoStatement() throws EndOfFileException,
|
||||
BacktrackException {
|
||||
int startOffset = consume().getOffset(); // t_goto
|
||||
|
@ -1676,11 +1521,6 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
return goto_statement;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @throws EndOfFileException
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTStatement parseBreakStatement() throws EndOfFileException,
|
||||
BacktrackException {
|
||||
int startOffset = consume().getOffset(); // t_break
|
||||
|
@ -1691,11 +1531,6 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
return break_statement;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @throws EndOfFileException
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTStatement parseContinueStatement() throws EndOfFileException,
|
||||
BacktrackException {
|
||||
int startOffset = consume().getOffset(); // t_continue
|
||||
|
@ -1706,11 +1541,6 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
return continue_statement;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @throws EndOfFileException
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTStatement parseReturnStatement() throws EndOfFileException,
|
||||
BacktrackException {
|
||||
int startOffset;
|
||||
|
@ -1754,13 +1584,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
return return_statement;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @throws EndOfFileException
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTStatement parseDoStatement() throws EndOfFileException,
|
||||
BacktrackException {
|
||||
protected IASTStatement parseDoStatement() throws EndOfFileException, BacktrackException {
|
||||
int startOffset;
|
||||
startOffset = consume().getOffset(); // t_do
|
||||
IASTStatement do_body = statement();
|
||||
|
@ -1803,11 +1627,6 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
return do_statement;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @throws EndOfFileException
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTStatement parseWhileStatement() throws EndOfFileException, BacktrackException {
|
||||
int startOffset = consume().getOffset();
|
||||
consume(IToken.tLPAREN);
|
||||
|
@ -1861,26 +1680,13 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected abstract IASTProblemExpression createProblemExpression();
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @throws EndOfFileException
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTStatement parseCompoundStatement() throws EndOfFileException, BacktrackException {
|
||||
IASTCompoundStatement compound = compoundStatement();
|
||||
return compound;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @throws EndOfFileException
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTStatement parseDefaultStatement() throws EndOfFileException, BacktrackException {
|
||||
int startOffset = consume().getOffset(); // t_default
|
||||
int lastOffset = consume(IToken.tCOLON).getEndOffset();
|
||||
|
@ -1890,11 +1696,6 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
return df;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @throws EndOfFileException
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTStatement parseCaseStatement() throws EndOfFileException, BacktrackException {
|
||||
int startOffset = consume().getOffset(); // t_case
|
||||
IASTExpression case_exp = constantExpression();
|
||||
|
@ -2105,7 +1906,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
|
|||
consume();
|
||||
break whileLoop2;
|
||||
default:
|
||||
throwBacktrack(be);
|
||||
throw be;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -166,10 +166,6 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param scope
|
||||
* @return
|
||||
*/
|
||||
protected IASTInitializer cInitializerClause(List<IASTNode> designators)
|
||||
throws EndOfFileException, BacktrackException {
|
||||
IToken la = LA(1);
|
||||
|
@ -237,7 +233,6 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
// if we get this far, it means that we have not yet succeeded
|
||||
// try this now instead
|
||||
// assignmentExpression
|
||||
try {
|
||||
IASTExpression assignmentExpression = assignmentExpression();
|
||||
IASTInitializerExpression result = createInitializerExpression();
|
||||
result.setExpression(assignmentExpression);
|
||||
|
@ -245,29 +240,16 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
((ASTNode) assignmentExpression).getOffset(),
|
||||
((ASTNode) assignmentExpression).getLength());
|
||||
return result;
|
||||
} catch (BacktrackException b) {
|
||||
throwBacktrack(b);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected ICASTDesignatedInitializer createDesignatorInitializer() {
|
||||
return new CASTDesignatedInitializer();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected IASTInitializerList createInitializerList() {
|
||||
return new CASTInitializerList();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected IASTInitializerExpression createInitializerExpression() {
|
||||
return new CASTInitializerExpression();
|
||||
}
|
||||
|
@ -370,23 +352,14 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return designatorList;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected IGCCASTArrayRangeDesignator createArrayRangeDesignator() {
|
||||
return new CASTArrayRangeDesignator();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected ICASTArrayDesignator createArrayDesignator() {
|
||||
return new CASTArrayDesignator();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected ICASTFieldDesignator createFieldDesignator() {
|
||||
return new CASTFieldDesignator();
|
||||
}
|
||||
|
@ -504,16 +477,10 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return simpleDeclaration;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected IASTFunctionDefinition createFunctionDefinition() {
|
||||
return new CASTFunctionDefinition();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
protected IASTSimpleDeclaration createSimpleDeclaration() {
|
||||
return new CASTSimpleDeclaration();
|
||||
|
@ -614,30 +581,15 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected IASTProblemDeclaration createProblemDeclaration() {
|
||||
return new CASTProblemDeclaration();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
@Override
|
||||
protected IASTExpression assignmentExpression() throws EndOfFileException,
|
||||
BacktrackException {
|
||||
if (LT(1) == IToken.tLPAREN && LT(2) == IToken.tLBRACE && supportStatementsInExpressions) {
|
||||
IASTExpression resultExpression = compoundStatementExpression();
|
||||
if (resultExpression != null)
|
||||
return resultExpression;
|
||||
}
|
||||
|
||||
protected IASTExpression assignmentExpression() throws EndOfFileException, BacktrackException {
|
||||
IASTExpression conditionalExpression = conditionalExpression();
|
||||
// if the condition not taken, try assignment operators
|
||||
if (conditionalExpression != null
|
||||
&& conditionalExpression instanceof IASTConditionalExpression) // &&
|
||||
if (conditionalExpression instanceof IASTConditionalExpression)
|
||||
return conditionalExpression;
|
||||
switch (LT(1)) {
|
||||
case IToken.tASSIGN:
|
||||
|
@ -666,10 +618,6 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return conditionalExpression;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
@Override
|
||||
protected IASTExpression relationalExpression() throws BacktrackException,
|
||||
EndOfFileException {
|
||||
|
@ -708,10 +656,6 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
@Override
|
||||
protected IASTExpression multiplicativeExpression()
|
||||
throws BacktrackException, EndOfFileException {
|
||||
|
@ -749,73 +693,30 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
* castExpression : unaryExpression | "(" typeId ")" castExpression
|
||||
*/
|
||||
@Override
|
||||
protected IASTExpression castExpression() throws EndOfFileException,
|
||||
BacktrackException {
|
||||
// TO DO: we need proper symbol checkint to ensure type name
|
||||
protected IASTExpression castExpression() throws EndOfFileException, BacktrackException {
|
||||
if (LT(1) == IToken.tLPAREN) {
|
||||
IToken mark = mark();
|
||||
int startingOffset = mark.getOffset();
|
||||
final IToken mark = mark();
|
||||
final int startingOffset = mark.getOffset();
|
||||
consume();
|
||||
IASTTypeId typeId = null;
|
||||
IASTExpression castExpression = null;
|
||||
boolean proper=false;
|
||||
IToken startCastExpression=null;
|
||||
// If this isn't a type name, then we shouldn't be here
|
||||
boolean needBack = false;
|
||||
try {
|
||||
try {
|
||||
|
||||
if (!avoidCastExpressionByHeuristics()) {
|
||||
typeId = typeId(false);
|
||||
}
|
||||
if (typeId != null) {
|
||||
switch (LT(1)) {
|
||||
case IToken.tRPAREN:
|
||||
IASTTypeId typeId = typeId(false);
|
||||
if (typeId != null && LT(1) == IToken.tRPAREN) {
|
||||
consume();
|
||||
proper=true;
|
||||
startCastExpression=mark();
|
||||
castExpression = castExpression();
|
||||
break;
|
||||
// case IToken.tEOC: // support for completion removed
|
||||
// break; // in favour of another parse tree
|
||||
default:
|
||||
needBack = true;
|
||||
// throw backtrack;
|
||||
}
|
||||
} else {needBack = true;}
|
||||
} catch (BacktrackException bte) {
|
||||
needBack = true;
|
||||
}
|
||||
if (needBack) {
|
||||
try {
|
||||
// try a compoundStatementExpression
|
||||
backup(startCastExpression);
|
||||
if (typeId != null && proper && LT(1) == IToken.tLPAREN) {
|
||||
castExpression = compoundStatementExpression();
|
||||
mark = null; // clean up mark so that we can garbage collect
|
||||
return buildTypeIdUnaryExpression(IASTCastExpression.op_cast,
|
||||
typeId, castExpression, startingOffset,
|
||||
LT(1) == IToken.tEOC ? LA(1).getEndOffset() : calculateEndOffset(castExpression));
|
||||
}
|
||||
} catch (BacktrackException bte2) {}
|
||||
|
||||
backup(mark);
|
||||
return unaryExpression();
|
||||
// throwBacktrack(bte);
|
||||
}
|
||||
|
||||
IASTExpression castExpression = castExpression();
|
||||
return buildTypeIdUnaryExpression(IASTCastExpression.op_cast,
|
||||
typeId, castExpression, startingOffset,
|
||||
LT(1) == IToken.tEOC ? LA(1).getEndOffset() : calculateEndOffset(castExpression));
|
||||
} catch (BacktrackException b) {
|
||||
}
|
||||
}
|
||||
}
|
||||
backup(mark);
|
||||
}
|
||||
return unaryExpression();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
@Override
|
||||
protected IASTExpression unaryExpression() throws EndOfFileException,
|
||||
BacktrackException {
|
||||
|
@ -854,12 +755,6 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param typeId
|
||||
* @param startingOffset
|
||||
* @param op
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
protected IASTExpression buildTypeIdExpression(int op, IASTTypeId typeId,
|
||||
int startingOffset, int endingOffset) {
|
||||
|
@ -871,17 +766,10 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected IASTTypeIdExpression createTypeIdExpression() {
|
||||
return new CASTTypeIdExpression();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTExpression postfixExpression() throws EndOfFileException,
|
||||
BacktrackException {
|
||||
|
||||
|
@ -1011,28 +899,14 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected IASTFunctionCallExpression createFunctionCallExpression() {
|
||||
return new CASTFunctionCallExpression();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected IASTArraySubscriptExpression createArraySubscriptExpression() {
|
||||
return new CASTArraySubscriptExpression();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param t
|
||||
* @param i
|
||||
* @param offset
|
||||
* @param lastOffset
|
||||
* TODO
|
||||
* @return
|
||||
*/
|
||||
protected ICASTTypeIdInitializerExpression buildTypeIdInitializerExpression(
|
||||
IASTTypeId t, IASTInitializer i, int offset, int lastOffset) {
|
||||
ICASTTypeIdInitializerExpression result = createTypeIdInitializerExpression();
|
||||
|
@ -1042,24 +916,14 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected ICASTTypeIdInitializerExpression createTypeIdInitializerExpression() {
|
||||
return new CASTTypeIdInitializerExpression();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected IASTFieldReference createFieldReference() {
|
||||
return new CASTFieldReference();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTExpression primaryExpression() throws EndOfFileException,
|
||||
BacktrackException {
|
||||
IToken t = null;
|
||||
|
@ -1097,6 +961,10 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
((ASTNode) literalExpression).setOffsetAndLength(t.getOffset(), t.getLength());
|
||||
return literalExpression;
|
||||
case IToken.tLPAREN:
|
||||
if (supportStatementsInExpressions && LT(2) == IToken.tLBRACE) {
|
||||
return compoundStatementExpression();
|
||||
}
|
||||
|
||||
t = consume();
|
||||
// TODO - do we need to return a wrapper?
|
||||
IASTExpression lhs = expression();
|
||||
|
@ -1131,16 +999,10 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected IASTLiteralExpression createLiteralExpression() {
|
||||
return new CASTLiteralExpression();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
protected IASTIdExpression createIdExpression() {
|
||||
return new CASTIdExpression();
|
||||
|
@ -1190,9 +1052,6 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected IASTTypeId createTypeId() {
|
||||
return new CASTTypeId();
|
||||
}
|
||||
|
@ -1203,10 +1062,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
* ptrOperator : "*" (cvQualifier)* | "&" | ::? nestedNameSpecifier "*"
|
||||
* (cvQualifier)*
|
||||
*
|
||||
* @param owner
|
||||
* Declarator that this pointer operator corresponds to.
|
||||
* @throws BacktrackException
|
||||
* request a backtrack
|
||||
* @throws BacktrackException to request a backtrack
|
||||
*/
|
||||
protected void consumePointerOperators(List<IASTPointerOperator> pointerOps)
|
||||
throws EndOfFileException, BacktrackException {
|
||||
|
@ -1256,9 +1112,6 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected ICASTPointer createPointer() {
|
||||
return new CASTPointer();
|
||||
}
|
||||
|
@ -1569,9 +1422,6 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return declSpec;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected ICASTSimpleDeclSpecifier createSimpleTypeSpecifier() {
|
||||
return new CASTSimpleDeclSpecifier();
|
||||
}
|
||||
|
@ -1580,9 +1430,6 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return new GCCASTSimpleDeclSpecifier();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
protected IASTNamedTypeSpecifier createNamedTypeSpecifier() {
|
||||
return new CASTTypedefNameSpecifier();
|
||||
|
@ -1594,13 +1441,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
* classSpecifier : classKey name (baseClause)? "{" (memberSpecification)*
|
||||
* "}"
|
||||
*
|
||||
* @param owner
|
||||
* IParserCallback object that represents the declaration that
|
||||
* owns this classSpecifier
|
||||
*
|
||||
* @return TODO
|
||||
* @throws BacktrackException
|
||||
* request a backtrack
|
||||
* @throws BacktrackException to request a backtrack
|
||||
*/
|
||||
protected ICASTCompositeTypeSpecifier structOrUnionSpecifier()
|
||||
throws BacktrackException, EndOfFileException {
|
||||
|
@ -1675,17 +1516,11 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
protected IASTName createName() {
|
||||
return new CASTName();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected ICASTCompositeTypeSpecifier createCompositeTypeSpecifier() {
|
||||
return new CASTCompositeTypeSpecifier();
|
||||
}
|
||||
|
@ -1720,9 +1555,6 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected ICASTElaboratedTypeSpecifier createElaboratedTypeSpecifier() {
|
||||
return new CASTElaboratedTypeSpecifier();
|
||||
}
|
||||
|
@ -2000,31 +1832,18 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return new CASTArrayDeclarator();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected IASTFieldDeclarator createFieldDeclarator() {
|
||||
return new CASTFieldDeclarator();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected IASTStandardFunctionDeclarator createFunctionDeclarator() {
|
||||
return new CASTFunctionDeclarator();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected ICASTKnRFunctionDeclarator createKnRFunctionDeclarator() {
|
||||
return new CASTKnRFunctionDeclarator();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param t
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
protected IASTName createName(IToken t) {
|
||||
IASTName n = new CASTName(t.getCharImage());
|
||||
|
@ -2038,13 +1857,11 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return n;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected IASTDeclarator createDeclarator() {
|
||||
return new CASTDeclarator();
|
||||
}
|
||||
|
||||
@SuppressWarnings("fallthrough")
|
||||
protected void consumeArrayModifiers(List<IASTNode> arrayMods)
|
||||
throws EndOfFileException, BacktrackException {
|
||||
|
||||
|
@ -2126,16 +1943,10 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected ICASTArrayModifier createCArrayModifier() {
|
||||
return new CASTModifiedArrayModifier();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected IASTArrayModifier createArrayModifier() {
|
||||
return new CASTArrayModifier();
|
||||
}
|
||||
|
@ -2492,11 +2303,6 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return new CASTAmbiguousExpression();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @throws EndOfFileException
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTStatement parseIfStatement() throws EndOfFileException, BacktrackException {
|
||||
IASTIfStatement result = null;
|
||||
IASTIfStatement if_statement = null;
|
||||
|
@ -2575,8 +2381,6 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
.setLength(calculateEndOffset(new_if_statement)
|
||||
- ((ASTNode) if_statement).getOffset());
|
||||
} else {
|
||||
if (result == null && if_statement != null)
|
||||
result = if_statement;
|
||||
if (result == null)
|
||||
result = new_if_statement;
|
||||
if_statement = new_if_statement;
|
||||
|
@ -2621,11 +2425,6 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
calculateEndOffset(castExpression));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @throws EndOfFileException
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTStatement parseSwitchStatement() throws EndOfFileException, BacktrackException {
|
||||
int startOffset;
|
||||
startOffset = consume().getOffset();
|
||||
|
@ -2656,11 +2455,6 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return switch_statement;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @throws EndOfFileException
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTStatement parseForStatement() throws EndOfFileException, BacktrackException {
|
||||
int startOffset;
|
||||
startOffset = consume().getOffset();
|
||||
|
|
|
@ -391,6 +391,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
IToken l = LA(1);
|
||||
backup(mark);
|
||||
throwBacktrack(first.getOffset(), l.getEndOffset() - first.getOffset());
|
||||
break;
|
||||
case IToken.tIDENTIFIER:
|
||||
case IToken.tCOMPLETION:
|
||||
case IToken.tEOC:
|
||||
|
@ -541,8 +542,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
* Parse a Pointer Operator. ptrOperator : "*" (cvQualifier)* | "&" | ::?
|
||||
* nestedNameSpecifier "*" (cvQualifier)*
|
||||
*
|
||||
* @param owner
|
||||
* Declarator that this pointer operator corresponds to.
|
||||
* @throws BacktrackException
|
||||
* request a backtrack
|
||||
*/
|
||||
|
@ -640,9 +639,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
po = newPo;
|
||||
}
|
||||
}
|
||||
if (po != null)
|
||||
collection.add(po);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -651,37 +648,22 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param isRestrict
|
||||
* @return
|
||||
*/
|
||||
protected ICPPASTPointerToMember createPointerToMember(boolean gnu) {
|
||||
if (gnu)
|
||||
return new GPPASTPointerToMember();
|
||||
return new CPPASTPointerToMember();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param isRestrict
|
||||
* @return
|
||||
*/
|
||||
protected IASTPointerOperator createPointer(boolean gnu) {
|
||||
if (gnu)
|
||||
return new GPPASTPointer();
|
||||
return new CPPASTPointer();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected ICPPASTReferenceOperator createReferenceOperator() {
|
||||
return new CPPASTReferenceOperator();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
@Override
|
||||
protected IASTExpression assignmentExpression() throws EndOfFileException,
|
||||
BacktrackException {
|
||||
|
@ -689,12 +671,12 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return throwExpression();
|
||||
}
|
||||
|
||||
if (LT(1) == IToken.tLPAREN && LT(2) == IToken.tLBRACE
|
||||
&& supportStatementsInExpressions) {
|
||||
IASTExpression resultExpression = compoundStatementExpression();
|
||||
if (resultExpression != null)
|
||||
return resultExpression;
|
||||
}
|
||||
// if (LT(1) == IToken.tLPAREN && LT(2) == IToken.tLBRACE
|
||||
// && supportStatementsInExpressions) {
|
||||
// IASTExpression resultExpression = compoundStatementExpression();
|
||||
// if (resultExpression != null)
|
||||
// return resultExpression;
|
||||
// }
|
||||
|
||||
IASTExpression conditionalExpression = conditionalExpression();
|
||||
// if the condition not taken, try assignment operators
|
||||
|
@ -746,10 +728,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return conditionalExpression;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTExpression throwExpression() throws EndOfFileException,
|
||||
BacktrackException {
|
||||
IToken throwToken = consume();
|
||||
|
@ -764,10 +742,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
throwExpression, throwToken.getOffset(), o); // fix for 95225
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
@SuppressWarnings("fallthrough")
|
||||
@Override
|
||||
protected IASTExpression relationalExpression() throws BacktrackException, EndOfFileException {
|
||||
|
||||
|
@ -779,6 +754,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
&& templateIdScopes.peek() == IToken.tLT) {
|
||||
return firstExpression;
|
||||
}
|
||||
// fall through
|
||||
case IToken.tLT:
|
||||
case IToken.tLTEQUAL:
|
||||
case IToken.tGTEQUAL:
|
||||
|
@ -837,10 +813,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
@Override
|
||||
protected IASTExpression multiplicativeExpression() throws BacktrackException, EndOfFileException {
|
||||
IASTExpression firstExpression = pmExpression();
|
||||
|
@ -873,10 +845,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTExpression pmExpression() throws EndOfFileException, BacktrackException {
|
||||
|
||||
IASTExpression firstExpression = castExpression();
|
||||
|
@ -910,11 +878,9 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
*/
|
||||
@Override
|
||||
protected IASTExpression castExpression() throws EndOfFileException, BacktrackException {
|
||||
// TO DO: we need proper symbol checkint to ensure type name
|
||||
if (LT(1) == IToken.tLPAREN) {
|
||||
IToken la = LA(1);
|
||||
int startingOffset = la.getOffset();
|
||||
IToken mark = mark();
|
||||
final IToken mark = mark();
|
||||
final int startingOffset = mark.getOffset();
|
||||
consume();
|
||||
|
||||
final int initialSize= templateIdScopes.size();
|
||||
|
@ -922,38 +888,20 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
templateIdScopes.push(IToken.tLPAREN);
|
||||
|
||||
try {
|
||||
IASTTypeId typeId = null;
|
||||
IToken startCastExpression=null;
|
||||
|
||||
// If this isn't a type name, then we shouldn't be here
|
||||
if (!avoidCastExpressionByHeuristics()) {
|
||||
typeId = typeId(false);
|
||||
}
|
||||
IASTTypeId typeId = typeId(false);
|
||||
if (typeId != null && LT(1) == IToken.tRPAREN) {
|
||||
consume();
|
||||
startCastExpression=mark();
|
||||
if (initialSize > 0) {
|
||||
templateIdScopes.pop();
|
||||
}
|
||||
try {
|
||||
IASTExpression castExpression = castExpression();
|
||||
|
||||
mark = null; // clean up mark so that we can garbage collect
|
||||
return buildTypeIdUnaryExpression(IASTCastExpression.op_cast,
|
||||
typeId, castExpression, startingOffset,
|
||||
calculateEndOffset(castExpression));
|
||||
} catch (BacktrackException b) {
|
||||
try {
|
||||
// try a compoundStatementExpression
|
||||
backup(startCastExpression);
|
||||
if (LT(1) == IToken.tLPAREN) {
|
||||
IASTExpression castExpression = compoundStatementExpression();
|
||||
mark = null; // clean up mark so that we can garbage collect
|
||||
return buildTypeIdUnaryExpression(IASTCastExpression.op_cast,
|
||||
typeId, castExpression, startingOffset,
|
||||
calculateEndOffset(castExpression));
|
||||
}
|
||||
} catch (BacktrackException bte2) {}
|
||||
}
|
||||
}
|
||||
backup(mark);
|
||||
|
@ -965,12 +913,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
}
|
||||
}
|
||||
return unaryExpression();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
@Override
|
||||
protected IASTTypeId typeId(boolean forNewExpression) throws EndOfFileException {
|
||||
if (!canBeTypeSpecifier()) {
|
||||
|
@ -1046,10 +990,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return new CPPASTTypeId();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTExpression deleteExpression() throws EndOfFileException,
|
||||
BacktrackException {
|
||||
int startingOffset = LA(1).getOffset();
|
||||
|
@ -1079,17 +1019,13 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return deleteExpression;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected ICPPASTDeleteExpression createDeleteExpression() {
|
||||
return new CPPASTDeleteExpression();
|
||||
}
|
||||
|
||||
/**
|
||||
* Pazse a new-expression.
|
||||
* Parse a new-expression.
|
||||
*
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
* newexpression: ::? new newplacement? newtypeid
|
||||
* newinitializer? ::? new newplacement? ( typeid )
|
||||
|
@ -1186,14 +1122,13 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
if (typeId != null) {
|
||||
lastOffset = calculateEndOffset(typeId);
|
||||
break master_new_loop;
|
||||
} else {
|
||||
}
|
||||
// Hmmm, so it wasn't typeId after all... Then it is
|
||||
// CASE: new (typeid-looking-as-placement)
|
||||
backup(loopMark);
|
||||
placementParseFailure = true;
|
||||
continue master_new_loop;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Tricky cases: first expression in () is parsed as a
|
||||
// placement,
|
||||
|
@ -1324,17 +1259,10 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected ICPPASTNewExpression createNewExpression() {
|
||||
return new CPPASTNewExpression();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
@Override
|
||||
protected IASTExpression unaryExpression() throws EndOfFileException, BacktrackException {
|
||||
switch (LT(1)) {
|
||||
|
@ -1384,10 +1312,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTExpression postfixExpression() throws EndOfFileException, BacktrackException {
|
||||
IASTExpression firstExpression = null;
|
||||
boolean isTemplate = false;
|
||||
|
@ -1697,17 +1621,10 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected ICPPASTSimpleTypeConstructorExpression createSimpleTypeConstructorExpression() {
|
||||
return new CPPASTSimpleTypeConstructorExpression();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expression
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTExpression primaryExpression() throws EndOfFileException,
|
||||
BacktrackException {
|
||||
IToken t = null;
|
||||
|
@ -1767,6 +1684,9 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
((ASTNode) literalExpression).setOffsetAndLength(t.getOffset(), t.getEndOffset() - t.getOffset());
|
||||
return literalExpression;
|
||||
case IToken.tLPAREN:
|
||||
if (supportStatementsInExpressions && LT(2) == IToken.tLBRACE) {
|
||||
return compoundStatementExpression();
|
||||
}
|
||||
t = consume();
|
||||
if (templateIdScopes.size() > 0) {
|
||||
templateIdScopes.push(IToken.tLPAREN);
|
||||
|
@ -1811,16 +1731,10 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected ICPPASTLiteralExpression createLiteralExpression() {
|
||||
return new CPPASTLiteralExpression();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
protected IASTIdExpression createIdExpression() {
|
||||
return new CPPASTIdExpression();
|
||||
|
@ -1954,10 +1868,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
* unqualified-id ; using :: unqualified-id ; using-directive: using
|
||||
* namespace ::? nested-name-specifier? namespace-name ;
|
||||
*
|
||||
* @param container
|
||||
* Callback object representing the scope these definitions fall
|
||||
* into.
|
||||
* @return TODO
|
||||
* @throws BacktrackException
|
||||
* request for a backtrack
|
||||
*/
|
||||
|
@ -2034,10 +1944,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
* linkageSpecification : extern "string literal" declaration | extern
|
||||
* "string literal" { declaration-seq }
|
||||
*
|
||||
* @param container
|
||||
* Callback object representing the scope these definitions fall
|
||||
* into.
|
||||
* @return TODO
|
||||
* @throws BacktrackException
|
||||
* request for a backtrack
|
||||
*/
|
||||
|
@ -2088,9 +1994,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return linkage;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected ICPPASTLinkageSpecification createLinkageSpecification() {
|
||||
return new CPPASTLinkageSpecification();
|
||||
}
|
||||
|
@ -2102,10 +2005,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
* declaration explicit-instantiation: template declaration
|
||||
* explicit-specialization: template <>declaration
|
||||
*
|
||||
* @param container
|
||||
* Callback object representing the scope these definitions fall
|
||||
* into.
|
||||
* @return TODO
|
||||
* @throws BacktrackException
|
||||
* request for a backtrack
|
||||
*/
|
||||
|
@ -2244,9 +2143,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
* template-argument template-argument: assignment-expression type-id
|
||||
* id-expression
|
||||
*
|
||||
* @param templateDeclaration
|
||||
* Callback's templateDeclaration which serves as a scope to this
|
||||
* list.
|
||||
* @throws BacktrackException
|
||||
* request for a backtrack
|
||||
*/
|
||||
|
@ -2355,9 +2251,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
* namespaceDefinition - usingDirective into usingDeclaration -
|
||||
* explicitInstantiation and explicitSpecialization into templateDeclaration
|
||||
*
|
||||
* @param container
|
||||
* IParserCallback object which serves as the owner scope for
|
||||
* this declaration.
|
||||
* @throws BacktrackException
|
||||
* request a backtrack
|
||||
*/
|
||||
|
@ -2376,13 +2269,17 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
case IToken.t_extern:
|
||||
if (LT(2) == IToken.tSTRING)
|
||||
return linkageSpecification();
|
||||
default:
|
||||
if (supportExtendedTemplateSyntax
|
||||
&& (LT(1) == IToken.t_static || LT(1) == IToken.t_inline || LT(1) == IToken.t_extern)
|
||||
&& LT(2) == IToken.t_template)
|
||||
if (supportExtendedTemplateSyntax && LT(2) == IToken.t_template)
|
||||
return templateDeclaration();
|
||||
return simpleDeclarationStrategyUnion();
|
||||
break;
|
||||
case IToken.t_static:
|
||||
case IToken.t_inline:
|
||||
if (supportExtendedTemplateSyntax && LT(2) == IToken.t_template)
|
||||
return templateDeclaration();
|
||||
break;
|
||||
}
|
||||
|
||||
return simpleDeclarationStrategyUnion();
|
||||
}
|
||||
|
||||
|
||||
|
@ -2395,10 +2292,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
try {
|
||||
after = LA(1);
|
||||
} catch (EndOfFileException eof) {
|
||||
after = null;
|
||||
}
|
||||
} catch (BacktrackException bt) {
|
||||
d1 = null;
|
||||
}
|
||||
if (d1 != null) {
|
||||
if( templateCount != 0 )
|
||||
|
@ -2437,9 +2332,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return d1;
|
||||
}
|
||||
} catch (BacktrackException be) {
|
||||
d2 = null;
|
||||
if (d1 == null)
|
||||
throwBacktrack(be);
|
||||
throw be;
|
||||
}
|
||||
|
||||
if (d2 == null && d1 != null) {
|
||||
|
@ -2466,10 +2360,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
* namespace-definition: namespace identifier { namespace-body } | namespace {
|
||||
* namespace-body } namespace-body: declaration-seq?
|
||||
*
|
||||
* @param container
|
||||
* IParserCallback object which serves as the owner scope for
|
||||
* this declaration.
|
||||
* @return TODO
|
||||
* @throws BacktrackException
|
||||
* request a backtrack
|
||||
*/
|
||||
|
@ -2608,10 +2498,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param duple
|
||||
* @return
|
||||
*/
|
||||
protected ICPPASTTemplateId createTemplateID(ITokenDuple duple) {
|
||||
ICPPASTTemplateId result = new CPPASTTemplateId();
|
||||
((ASTNode) result).setOffsetAndLength(duple.getStartOffset(), duple
|
||||
|
@ -2708,13 +2594,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
* append functionDefinition stuff to end of this rule To do: - work in
|
||||
* functionTryBlock
|
||||
*
|
||||
* @param container
|
||||
* IParserCallback object which serves as the owner scope for
|
||||
* this declaration.
|
||||
* @param tryConstructor
|
||||
* true == take strategy1 (constructor ) : false == take strategy
|
||||
* 2 ( pointer to function)
|
||||
* @return TODO
|
||||
* @throws BacktrackException
|
||||
* request a backtrack
|
||||
*/
|
||||
|
@ -2878,9 +2757,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
* meminitializerlist meminitializer: meminitializerid | ( expressionlist? )
|
||||
* meminitializerid: ::? nestednamespecifier? classname identifier
|
||||
*
|
||||
* @param declarator
|
||||
* IParserCallback object that represents the declarator
|
||||
* (constructor) that owns this initializer
|
||||
* @throws BacktrackException
|
||||
* request a backtrack
|
||||
*/
|
||||
|
@ -2936,9 +2812,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected ICPPASTConstructorChainInitializer createConstructorChainInitializer() {
|
||||
return new CPPASTConstructorChainInitializer();
|
||||
}
|
||||
|
@ -2946,10 +2819,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
/**
|
||||
* This routine parses a parameter declaration
|
||||
*
|
||||
* @param containerObject
|
||||
* The IParserCallback object representing the
|
||||
* parameterDeclarationClause owning the parm.
|
||||
* @return TODO
|
||||
* @throws BacktrackException
|
||||
* request a backtrack
|
||||
*/
|
||||
|
@ -3394,9 +3263,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
/**
|
||||
* Parse an elaborated type specifier.
|
||||
*
|
||||
* @param decl
|
||||
* Declaration which owns the elaborated type
|
||||
* @return TODO
|
||||
* @throws BacktrackException
|
||||
* request a backtrack
|
||||
*/
|
||||
|
@ -3447,11 +3313,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
* Parses the initDeclarator construct of the ANSI C++ spec. initDeclarator :
|
||||
* declarator ("=" initializerClause | "(" expressionList ")")?
|
||||
*
|
||||
* @param constructInitializers
|
||||
* TODO
|
||||
* @param owner
|
||||
* IParserCallback object that represents the owner declaration
|
||||
* object.
|
||||
* @return declarator that this parsing produced.
|
||||
* @throws BacktrackException
|
||||
* request a backtrack
|
||||
|
@ -3571,10 +3432,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
* parameterDeclarationClause ")" (oldKRParameterDeclaration)* declaratorId :
|
||||
* name
|
||||
*
|
||||
* @param forNewTypeId
|
||||
* TODO
|
||||
* @param container
|
||||
* IParserCallback object that represents the owner declaration.
|
||||
* @return declarator that this parsing produced.
|
||||
* @throws BacktrackException
|
||||
* request a backtrack
|
||||
|
@ -3987,10 +3844,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
* Parse a class/struct/union definition. classSpecifier : classKey name
|
||||
* (baseClause)? "{" (memberSpecification)* "}"
|
||||
*
|
||||
* @param owner
|
||||
* IParserCallback object that represents the declaration that
|
||||
* owns this classSpecifier
|
||||
* @return TODO
|
||||
* @throws BacktrackException
|
||||
* request a backtrack
|
||||
*/
|
||||
|
@ -4129,7 +3982,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
* virtual? ::? nestednamespecifier? classname accessspecifier: private |
|
||||
* protected | public
|
||||
*
|
||||
* @param classSpecOwner
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected void baseSpecifier(ICPPASTCompositeTypeSpecifier astClassSpec)
|
||||
|
@ -4214,16 +4066,13 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
baseSpec.setVisibility(visibility);
|
||||
baseSpec.setName(name);
|
||||
astClassSpec.addBaseSpecifier(baseSpec);
|
||||
// fall through
|
||||
break baseSpecifierLoop;
|
||||
default:
|
||||
break baseSpecifierLoop;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected ICPPASTBaseSpecifier createBaseSpecifier() {
|
||||
return new CPPASTBaseSpecifier();
|
||||
}
|
||||
|
@ -4290,9 +4139,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
*/
|
||||
protected ICPPASTCatchHandler createCatchHandler() {
|
||||
return new CPPASTCatchHandler();
|
||||
}
|
||||
|
@ -4650,11 +4496,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @throws EndOfFileException
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTStatement parseTryStatement() throws EndOfFileException, BacktrackException {
|
||||
int startO = consume().getOffset();
|
||||
IASTStatement tryBlock = compoundStatement();
|
||||
|
@ -4735,10 +4576,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
|
||||
}
|
||||
|
||||
/**
|
||||
* @param expectSemi TODO
|
||||
* @return
|
||||
*/
|
||||
protected IASTNode cppStyleCondition(int expectToken) throws BacktrackException, EndOfFileException {
|
||||
IToken mark = mark();
|
||||
try {
|
||||
|
@ -4754,7 +4591,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return simpleDeclaration(SimpleDeclarationStrategy.TRY_VARIABLE, true);
|
||||
} catch (BacktrackException b) {
|
||||
failParse();
|
||||
throwBacktrack(b);
|
||||
throw b;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
@ -4778,11 +4615,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return new CPPASTAmbiguousStatement();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @throws EndOfFileException
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTStatement parseIfStatement() throws EndOfFileException, BacktrackException {
|
||||
ICPPASTIfStatement result = null;
|
||||
ICPPASTIfStatement if_statement = null;
|
||||
|
@ -4862,8 +4694,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
if_statement.setElseClause(new_if_statement);
|
||||
((ASTNode) if_statement).setLength(calculateEndOffset(new_if_statement) - ((ASTNode) if_statement).getOffset());
|
||||
} else {
|
||||
if (result == null && if_statement != null)
|
||||
result = if_statement;
|
||||
if (result == null)
|
||||
result = new_if_statement;
|
||||
if_statement = new_if_statement;
|
||||
|
@ -4932,11 +4762,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
calculateEndOffset(castExpression));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @throws EndOfFileException
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTStatement parseSwitchStatement() throws EndOfFileException, BacktrackException {
|
||||
int startOffset;
|
||||
startOffset = consume().getOffset();
|
||||
|
@ -4972,11 +4797,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
return switch_statement;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return
|
||||
* @throws EndOfFileException
|
||||
* @throws BacktrackException
|
||||
*/
|
||||
protected IASTStatement parseForStatement() throws EndOfFileException, BacktrackException {
|
||||
int startOffset;
|
||||
startOffset = consume().getOffset();
|
||||
|
|
Loading…
Add table
Reference in a new issue