From c69e46df852e8daf1a898f5f2d8f0b9d9f957df1 Mon Sep 17 00:00:00 2001 From: Oleg Krasilnikov Date: Thu, 9 Feb 2006 13:45:17 +0000 Subject: [PATCH] Fix #2 for bug 117701 : Backtrack exceptions in GNU parsers Changes: - for C++ parser, exception calls are removed where possible. - both for C & C++ parser, calls to "consume(int)" are replaced by "consume()" - it also allows to avoid useles operations. Testing: parser tests are finished with the same result as before. --- .../parser/AbstractGNUSourceCodeParser.java | 58 ++-- .../core/dom/parser/c/GNUCSourceParser.java | 104 +++--- .../dom/parser/cpp/GNUCPPSourceParser.java | 325 +++++++++--------- 3 files changed, 241 insertions(+), 246 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java index 9fde00ab398..24a3443b9ff 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java @@ -213,13 +213,11 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { * @throws BacktrackException * If LT(1) != type */ - // static int cnt = 0; protected IToken consume(int type) throws EndOfFileException, BacktrackException { if (LT(1) == type) return consume(); IToken la = LA(1); - // System.out.println("from Consume !" + cnt++); throwBacktrack(la.getOffset(), la.getLength()); return null; } @@ -560,7 +558,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { */ protected IASTExpression compoundStatementExpression() throws EndOfFileException, BacktrackException { - int startingOffset = consume(IToken.tLPAREN).getOffset(); + int startingOffset = consume().getOffset(); // tLPAREN always IASTCompoundStatement compoundStatement = null; if (mode == ParserMode.QUICK_PARSE || mode == ParserMode.STRUCTURAL_PARSE) @@ -618,7 +616,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { int lastOffset = 0; while (LT(1) == IToken.tCOMMA) { - consume(IToken.tCOMMA); + consume(); IASTExpression secondExpression = assignmentExpression(); expressionList.addExpression(secondExpression); secondExpression.setParent(expressionList); @@ -645,7 +643,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { throws BacktrackException, EndOfFileException; protected abstract IASTTypeId typeId(boolean forNewExpression) - throws BacktrackException, EndOfFileException; + throws EndOfFileException; protected abstract IASTExpression castExpression() throws BacktrackException, EndOfFileException; @@ -684,7 +682,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { EndOfFileException { IASTExpression firstExpression = logicalAndExpression(); while (LT(1) == IToken.tOR) { - consume(IToken.tOR); + consume(); IASTExpression secondExpression = logicalAndExpression(); firstExpression = buildBinaryExpression( IASTBinaryExpression.op_logicalOr, firstExpression, @@ -701,7 +699,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { EndOfFileException { IASTExpression firstExpression = inclusiveOrExpression(); while (LT(1) == IToken.tAND) { - consume(IToken.tAND); + consume(); IASTExpression secondExpression = inclusiveOrExpression(); firstExpression = buildBinaryExpression( IASTBinaryExpression.op_logicalAnd, firstExpression, @@ -718,7 +716,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { EndOfFileException { IASTExpression firstExpression = exclusiveOrExpression(); while (LT(1) == IToken.tBITOR) { - consume(IToken.tBITOR); + consume(); IASTExpression secondExpression = exclusiveOrExpression(); firstExpression = buildBinaryExpression( IASTBinaryExpression.op_binaryOr, firstExpression, @@ -735,7 +733,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { EndOfFileException { IASTExpression firstExpression = andExpression(); while (LT(1) == IToken.tXOR) { - consume(IToken.tXOR); + consume(); IASTExpression secondExpression = andExpression(); firstExpression = buildBinaryExpression( IASTBinaryExpression.op_binaryXor, firstExpression, @@ -867,7 +865,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { EndOfFileException { IASTExpression firstExpression = logicalOrExpression(); if (LT(1) == IToken.tQUESTION) { - consume(IToken.tQUESTION); + consume(); IASTExpression secondExpression = expression(); IASTExpression thirdExpression = null; @@ -939,7 +937,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { */ protected IASTExpression unaryAlignofExpression() throws EndOfFileException, BacktrackException { - int offset = consume(IGCCToken.t___alignof__).getOffset(); + int offset = consume().getOffset(); // t___alignof__ IASTTypeId d = null; IASTExpression unaryExpression = null; @@ -948,7 +946,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { if (LT(1) == IToken.tLPAREN) { boolean needBack = false; try { - consume(IToken.tLPAREN); + consume(); d = typeId(false); if (d == null) needBack = true; @@ -979,7 +977,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { protected IASTExpression unaryTypeofExpression() throws EndOfFileException, BacktrackException { - int offset = consume(IGCCToken.t_typeof).getOffset(); + int offset = consume().getOffset(); // t_typeof IASTTypeId d = null; IASTExpression unaryExpression = null; @@ -992,7 +990,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { } else { boolean needBack = false; try { - consume(IToken.tLPAREN); + consume(); // tLPAREN d = typeId(false); if (d == null) needBack = true; @@ -1253,7 +1251,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { throws BacktrackException, EndOfFileException { IToken mark = mark(); IASTName name = null; - int startOffset = consume(IToken.t_enum).getOffset(); + int startOffset = consume().getOffset(); // t_enum if (LT(1) == IToken.tIDENTIFIER) { name = createName(identifier()); } else @@ -1266,7 +1264,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { name.setParent(result); name.setPropertyInParent(IASTEnumerationSpecifier.ENUMERATION_NAME); - consume(IToken.tLBRACE); + consume(); // IToken.tLBRACE enumLoop: while (true) { switch (LT(1)) { @@ -1287,7 +1285,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { } IASTExpression initialValue = null; if (LT(1) == IToken.tASSIGN) { - consume(IToken.tASSIGN); + consume(); initialValue = constantExpression(); lastOffset = calculateEndOffset(initialValue); } @@ -1477,7 +1475,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { */ protected IASTDeclaration asmDeclaration() throws EndOfFileException, BacktrackException { - IToken first = consume(IToken.t_asm); + IToken first = consume(); // t_asm consume(IToken.tLPAREN); String assembly = consume(IToken.tSTRING).getImage(); consume(IToken.tRPAREN); @@ -1703,8 +1701,8 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { */ protected IASTStatement parseLabelStatement() throws EndOfFileException, BacktrackException { - IToken labelName = consume(IToken.tIDENTIFIER); - consume(IToken.tCOLON); + IToken labelName = consume(); // tIDENTIFIER + consume(); // tCOLON IASTStatement nestedStatement = statement(); int lastOffset = calculateEndOffset( nestedStatement ); IASTLabelStatement label_statement = createLabelStatement(); @@ -1729,7 +1727,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { */ protected IASTStatement parseNullStatement() throws EndOfFileException, BacktrackException { - IToken t = consume(IToken.tSEMI); + IToken t = consume(); // tSEMI IASTNullStatement null_statement = createNullStatement(); ((ASTNode) null_statement).setOffsetAndLength(t.getOffset(), t @@ -1745,7 +1743,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { */ protected IASTStatement parseGotoStatement() throws EndOfFileException, BacktrackException { - int startOffset = consume(IToken.t_goto).getOffset(); + int startOffset = consume().getOffset(); // t_goto IToken identifier = consume(IToken.tIDENTIFIER); int lastOffset = consume(IToken.tSEMI).getEndOffset(); @@ -1766,7 +1764,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { */ protected IASTStatement parseBreakStatement() throws EndOfFileException, BacktrackException { - int startOffset = consume(IToken.t_break).getOffset(); + int startOffset = consume().getOffset(); // t_break int lastOffset = consume(IToken.tSEMI).getEndOffset(); IASTBreakStatement break_statement = createBreakStatement(); @@ -1782,7 +1780,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { */ protected IASTStatement parseContinueStatement() throws EndOfFileException, BacktrackException { - int startOffset = consume(IToken.t_continue).getOffset(); + int startOffset = consume().getOffset(); // t_continue int lastOffset = consume(IToken.tSEMI).getEndOffset(); IASTContinueStatement continue_statement = createContinueStatement(); @@ -1799,7 +1797,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { protected IASTStatement parseReturnStatement() throws EndOfFileException, BacktrackException { int startOffset; - startOffset = consume(IToken.t_return).getOffset(); + startOffset = consume().getOffset(); // t_return IASTExpression result = null; // See if there is a return expression @@ -1851,7 +1849,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { protected IASTStatement parseDoStatement() throws EndOfFileException, BacktrackException { int startOffset; - startOffset = consume(IToken.t_do).getOffset(); + startOffset = consume().getOffset(); // t_do IASTStatement do_body = statement(); IASTExpression do_condition = null; @@ -1904,7 +1902,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { */ protected IASTStatement parseWhileStatement() throws EndOfFileException, BacktrackException { - int startOffset = consume(IToken.t_while).getOffset(); + int startOffset = consume().getOffset(); consume(IToken.tLPAREN); IASTExpression while_condition = condition(); switch (LT(1)) { @@ -1990,7 +1988,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { */ protected IASTStatement parseDefaultStatement() throws EndOfFileException, BacktrackException { - int startOffset = consume(IToken.t_default).getOffset(); + int startOffset = consume().getOffset(); // t_default int lastOffset = consume(IToken.tCOLON).getEndOffset(); IASTDefaultStatement df = createDefaultStatement(); @@ -2006,7 +2004,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { */ protected IASTStatement parseCaseStatement() throws EndOfFileException, BacktrackException { - int startOffset = consume(IToken.t_case).getOffset(); + int startOffset = consume().getOffset(); // t_case IASTExpression case_exp = constantExpression(); int lastOffset = 0; switch (LT(1)) { @@ -2120,7 +2118,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { protected IASTExpression parseSizeofExpression() throws BacktrackException, EndOfFileException { - int startingOffset = consume(IToken.t_sizeof).getOffset(); + int startingOffset = consume().getOffset(); // t_sizeof IASTNode[] choice = parseTypeIdOrUnaryExpression(true); switch (choice.length) { case 1: diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java index 338d742f85b..f6fc53456b0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java @@ -143,7 +143,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { protected IASTInitializer optionalCInitializer() throws EndOfFileException, BacktrackException { if (LT(1) == IToken.tASSIGN) { - consume(IToken.tASSIGN); + consume(); return cInitializerClause(Collections.EMPTY_LIST); } return null; @@ -159,7 +159,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { int startingOffset = la.getOffset(); la = null; if (LT(1) == IToken.tLBRACE) { - consume(IToken.tLBRACE); + consume(); IASTInitializerList result = createInitializerList(); ((ASTNode) result).setOffset(startingOffset); for (;;) { @@ -169,7 +169,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { List newDesignators = designatorList(); if (newDesignators.size() != 0) if (LT(1) == IToken.tASSIGN) - consume(IToken.tASSIGN); + consume(); IASTInitializer initializer = cInitializerClause(newDesignators); @@ -205,7 +205,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { break; // can end with ", }" if (LT(1) == IToken.tCOMMA) - consume(IToken.tCOMMA); + consume(); if (LT(1) == IToken.tRBRACE) break; if (checkHashcode == LA(1).hashCode()) { @@ -271,7 +271,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { if (LT(1) == IToken.tDOT || LT(1) == IToken.tLBRACKET) { while (LT(1) == IToken.tDOT || LT(1) == IToken.tLBRACKET) { if (LT(1) == IToken.tDOT) { - int offset = consume(IToken.tDOT).getOffset(); + int offset = consume().getOffset(); IToken id = identifier(); ICASTFieldDesignator designator = createFieldDesignator(); ((ASTNode) designator).setOffsetAndLength(offset, id @@ -286,12 +286,11 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { DEFAULT_DESIGNATOR_LIST_SIZE); designatorList.add(designator); } else if (LT(1) == IToken.tLBRACKET) { - IToken mark = consume(IToken.tLBRACKET); + IToken mark = consume(); int offset = mark.getOffset(); IASTExpression constantExpression = expression(); if (LT(1) == IToken.tRBRACKET) { - int lastOffset = consume(IToken.tRBRACKET) - .getEndOffset(); + int lastOffset = consume().getEndOffset(); ICASTArrayDesignator designator = createArrayDesignator(); ((ASTNode) designator).setOffsetAndLength(offset, lastOffset - offset); @@ -369,7 +368,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { DEFAULT_DESIGNATOR_LIST_SIZE); designatorList.add(designator); } else if (LT(1) == IToken.tLBRACKET) { - int startOffset = consume(IToken.tLBRACKET).getOffset(); + int startOffset = consume().getOffset(); IASTExpression constantExpression1 = expression(); consume(IToken.tELLIPSIS); IASTExpression constantExpression2 = expression(); @@ -459,7 +458,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { declarators = (IASTDeclarator[]) ArrayUtil.append( IASTDeclarator.class, declarators, initDeclarator()); while (LT(1) == IToken.tCOMMA) { - consume(IToken.tCOMMA); + consume(); declarators = (IASTDeclarator[]) ArrayUtil.append( IASTDeclarator.class, declarators, initDeclarator()); } } @@ -472,7 +471,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { switch (LT(1)) { case IToken.tSEMI: - semiOffset = consume(IToken.tSEMI).getEndOffset(); + semiOffset = consume().getEndOffset(); consumedSemi = true; break; case IToken.tLBRACE: @@ -894,30 +893,25 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { case IToken.tDECR: return unaryOperatorCastExpression(IASTUnaryExpression.op_prefixDecr); case IToken.t_sizeof: - startingOffset = consume(IToken.t_sizeof).getOffset(); + startingOffset = consume().getOffset(); IToken mark = LA(1); IASTExpression unaryExpression = null; IASTTypeId typeId = null; int lastOffset = 0; if (LT(1) == IToken.tLPAREN) { boolean needBack = false; - try { - consume(IToken.tLPAREN); - typeId = typeId(false); - if (typeId != null) { - switch (LT(1)) { - case IToken.tRPAREN: - case IToken.tEOC: - lastOffset = consume().getEndOffset(); - break; - default: - needBack = true; - // throw backtrack; - } - } else {needBack = true; } - } catch (BacktrackException bt) { - needBack = true; - } + consume(); + typeId = typeId(false); + if (typeId != null) { + switch (LT(1)) { + case IToken.tRPAREN: + case IToken.tEOC: + lastOffset = consume().getEndOffset(); + break; + default: + needBack = true; + } + } else {needBack = true; } if (needBack) { backup(mark); typeId = null; @@ -990,7 +984,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { // ( type-name ) { initializer-list , } IToken m = mark(); try { - int offset = consume(IToken.tLPAREN).getOffset(); + int offset = consume().getOffset(); IASTTypeId t = typeId(false); if (t != null) { consume(IToken.tRPAREN).getEndOffset(); @@ -1012,12 +1006,12 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { switch (LT(1)) { case IToken.tLBRACKET: // array access - consume(IToken.tLBRACKET); + consume(); secondExpression = expression(); int last; switch (LT(1)) { case IToken.tRBRACKET: - last = consume(IToken.tRBRACKET).getEndOffset(); + last = consume().getEndOffset(); break; case IToken.tEOC: last = Integer.MAX_VALUE; @@ -1042,11 +1036,11 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { break; case IToken.tLPAREN: // function call - consume(IToken.tLPAREN); + consume(); if (LT(1) != IToken.tRPAREN) secondExpression = expression(); if (LT(1) == IToken.tRPAREN) - last = consume(IToken.tRPAREN).getEndOffset(); + last = consume().getEndOffset(); else // must be EOC last = Integer.MAX_VALUE; @@ -1068,7 +1062,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { firstExpression = f; break; case IToken.tINCR: - int offset = consume(IToken.tINCR).getEndOffset(); + int offset = consume().getEndOffset(); firstExpression = buildUnaryExpression( IASTUnaryExpression.op_postFixIncr, firstExpression, ((CASTNode) firstExpression).getOffset(), offset); @@ -1081,7 +1075,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { break; case IToken.tDOT: // member access - IToken dot = consume(IToken.tDOT); + IToken dot = consume(); IASTName name = createName(identifier()); if (name == null) throwBacktrack(((ASTNode) firstExpression).getOffset(), @@ -1103,7 +1097,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { break; case IToken.tARROW: // member access - IToken arrow = consume(IToken.tARROW); + IToken arrow = consume(); name = createName(identifier()); if (name == null) throwBacktrack(((ASTNode) firstExpression).getOffset(), @@ -1278,8 +1272,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { return new CASTIdExpression(); } - protected IASTTypeId typeId(boolean forNewExpression) throws EndOfFileException, - BacktrackException { + protected IASTTypeId typeId(boolean forNewExpression) throws EndOfFileException { IToken mark = mark(); int startingOffset = mark.getOffset(); IASTDeclSpecifier declSpecifier = null; @@ -1360,21 +1353,21 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { break; } - last = consume(IToken.tSTAR); + last = consume(); int startOffset = mark.getOffset(); for (;;) { IToken t = LA(1); switch (LT(1)) { case IToken.t_const: - last = consume(IToken.t_const); + last = consume(); isConst = true; break; case IToken.t_volatile: - last = consume(IToken.t_volatile); + last = consume(); isVolatile = true; break; case IToken.t_restrict: - last = consume(IToken.t_restrict); + last = consume(); isRestrict = true; break; } @@ -1518,11 +1511,11 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { simpleType = ICASTSimpleDeclSpecifier.t_Bool; break; case IToken.t__Complex: - last = consume(IToken.t__Complex); + last = consume(); isComplex=true; break; case IToken.t__Imaginary: - last = consume(IToken.t__Imaginary); + last = consume(); isImaginary=true; break; @@ -1778,7 +1771,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { throwBacktrack(errorPoint.getOffset(), errorPoint.getLength()); } - consume(IToken.tLBRACE); + consume(); IASTName name = null; if (nameToken != null) @@ -1941,7 +1934,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { // parameterDeclarationClause // d.setIsFunction(true); // TODO need to create a temporary scope object here - IToken last = consume(IToken.tLPAREN); + IToken last = consume(); finalOffset = last.getEndOffset(); isFunction = true; boolean seenParameter = false; @@ -2075,7 +2068,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { .get(arrayMods.size() - 1)); continue; case IToken.tCOLON: - consume(IToken.tCOLON); + consume(); bitField = constantExpression(); finalOffset = calculateEndOffset(bitField); break; @@ -2230,7 +2223,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { while (LT(1) == IToken.tLBRACKET) { // eat the '[' - int startOffset = consume(IToken.tLBRACKET).getOffset(); + int startOffset = consume().getOffset(); boolean isStatic = false; boolean isConst = false; @@ -2276,13 +2269,12 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { int lastOffset; switch (LT(1)) { case IToken.tRBRACKET: - lastOffset = consume(IToken.tRBRACKET).getEndOffset(); + lastOffset = consume().getEndOffset(); break; case IToken.tEOC: lastOffset = Integer.MAX_VALUE; break; default: - System.out.println("++++ 2 : " + currToken.getImage()); throw backtrack; } @@ -2829,7 +2821,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { - ((ASTNode) new_if_statement).getOffset()); } if (LT(1) == IToken.t_else) { - consume(IToken.t_else); + consume(); if (LT(1) == IToken.t_if) { // an else if, don't recurse, just loop and do another if @@ -2914,7 +2906,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { */ protected IASTStatement parseSwitchStatement() throws EndOfFileException, BacktrackException { int startOffset; - startOffset = consume(IToken.t_switch).getOffset(); + startOffset = consume().getOffset(); consume(IToken.tLPAREN); IASTExpression switch_condition = condition(); consume(IToken.tRPAREN); @@ -2939,7 +2931,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { */ protected IASTStatement parseForStatement() throws EndOfFileException, BacktrackException { int startOffset; - startOffset = consume(IToken.t_for).getOffset(); + startOffset = consume().getOffset(); consume(IToken.tLPAREN); IASTStatement init = forInitStatement(); IASTExpression for_condition = null; @@ -2952,7 +2944,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { } switch (LT(1)) { case IToken.tSEMI: - consume(IToken.tSEMI); + consume(); break; case IToken.tEOC: break; @@ -2969,7 +2961,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { } switch (LT(1)) { case IToken.tRPAREN: - consume(IToken.tRPAREN); + consume(); break; case IToken.tEOC: break; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java index fb4d797477e..5d68f7c3e12 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java @@ -232,7 +232,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { : previousLast.getOffset(); IToken last = previousLast; if (LT(1) == IToken.tLT) { - last = consume(IToken.tLT); + last = consume(); // until we get all the names sorted out ScopeStack scopes = new ScopeStack(); scopes.push(IToken.tLT); @@ -296,16 +296,13 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { IToken mark = mark(); - try { - IASTTypeId typeId = typeId(false); + IASTTypeId typeId = typeId(false); + if (typeId != null) { list.add(typeId); completedArg = true; - } catch (BacktrackException e) { + } else { backup(mark); - } /* - * catch (ASTSemanticException e) { backup(mark); } - */ - + } if (!completedArg) { try { IASTExpression expression = assignmentExpression(); @@ -354,7 +351,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { if (LT(1) == IToken.tCOLONCOLON) { argumentList.addSegment(null); - last = consume(IToken.tCOLONCOLON); + last = consume(); } if (LT(1) == IToken.tCOMPL) @@ -380,7 +377,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { } while (LT(1) == IToken.tCOLONCOLON) { - last = consume(IToken.tCOLONCOLON); + last = consume(); if (LT(1) == IToken.t_template) consume(); @@ -426,7 +423,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { BacktrackException { if (LT(1) == IToken.tLT) { IToken secondMark = mark(); - consume(IToken.tLT); + consume(); try { List list = templateArgumentList(); argumentList.addSegment(list); @@ -457,24 +454,24 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { TemplateParameterManager templateArgs) throws BacktrackException, EndOfFileException { // we know this is an operator - IToken operatorToken = consume(IToken.t_operator); + IToken operatorToken = consume(); IToken toSend = null; IASTTypeId typeId = null; if (LA(1).isOperator() || LT(1) == IToken.tLPAREN || LT(1) == IToken.tLBRACKET) { if ((LT(1) == IToken.t_new || LT(1) == IToken.t_delete) && LT(2) == IToken.tLBRACKET && LT(3) == IToken.tRBRACKET) { - consume(); - consume(IToken.tLBRACKET); - toSend = consume(IToken.tRBRACKET); + consume(); // new or delete + consume(); // lbracket + toSend = consume(); // rbracket // vector new and delete operators } else if (LT(1) == IToken.tLPAREN && LT(2) == IToken.tRPAREN) { // operator () - consume(IToken.tLPAREN); - toSend = consume(IToken.tRPAREN); + consume(); // "(" + toSend = consume(); // ")" } else if (LT(1) == IToken.tLBRACKET && LT(2) == IToken.tRBRACKET) { - consume(IToken.tLBRACKET); - toSend = consume(IToken.tRBRACKET); + consume(); // "[" + toSend = consume(); // "]" } else if (LA(1).isOperator()) toSend = consume(); else @@ -485,6 +482,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { // must be a conversion function IToken t = LA(1); typeId = typeId(true); + if (typeId == null) throw backtrack; if (t != LA(1)) { while (t.getNext() != LA(1)) { t = t.getNext(); @@ -543,7 +541,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { if (LT(1) == IToken.tAMPER) { int length = LA(1).getEndOffset() - LA(1).getOffset(); - int o = consume(IToken.tAMPER).getOffset(); + int o = consume().getOffset(); ICPPASTReferenceOperator refOp = createReferenceOperator(); ((ASTNode) refOp).setOffsetAndLength(o, length); collection.add(refOp); @@ -571,7 +569,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { } } if (LT(1) == IToken.tSTAR) { - last = consume(IToken.tSTAR); + last = consume(); int starOffset = last.getOffset(); for (;;) { @@ -579,16 +577,16 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { int startingOffset = LA(1).getOffset(); switch (LT(1)) { case IToken.t_const: - last = consume(IToken.t_const); + last = consume(); isConst = true; break; case IToken.t_volatile: - last = consume(IToken.t_volatile); + last = consume(); isVolatile = true; break; case IToken.t_restrict: if (allowCPPRestrict) { - last = consume(IToken.t_restrict); + last = consume(); isRestrict = true; break; } @@ -744,7 +742,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { */ protected IASTExpression throwExpression() throws EndOfFileException, BacktrackException { - IToken throwToken = consume(IToken.t_throw); + IToken throwToken = consume(); IASTExpression throwExpression = null; try { throwExpression = expression(); @@ -902,87 +900,76 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { * castExpression : unaryExpression | "(" typeId ")" castExpression */ 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(); - consume(); - if (templateIdScopes.size() > 0) { - templateIdScopes.push(IToken.tLPAREN); - } - boolean popped = false; - boolean proper=false; - IASTTypeId typeId = null; - IToken startCastExpression=null; - // If this isn't a type name, then we shouldn't be here - try { - try { - typeId = typeId(false); - consume(IToken.tRPAREN); - proper = true; - startCastExpression=mark(); - } catch (BacktrackException bte) { - backup(mark); - throwBacktrack(bte); - } - + 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(); + consume(); + if (templateIdScopes.size() > 0) { templateIdScopes.push(IToken.tLPAREN); } + + boolean popped = false; + IASTTypeId typeId = null; + IToken startCastExpression=null; + // If this isn't a type name, then we shouldn't be here + typeId = typeId(false); + if (typeId != null && LT(1) == IToken.tRPAREN) { + consume(); + startCastExpression=mark(); if (templateIdScopes.size() > 0) { templateIdScopes.pop(); popped = true; } - - 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 (typeId != null && proper && 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); - if (templateIdScopes.size() > 0 && !popped) { - templateIdScopes.pop(); + 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) {} } } - } - return unaryExpression(); + backup(mark); + if (templateIdScopes.size() > 0 && !popped) { templateIdScopes.pop(); } + } + return unaryExpression(); - } +} /** * @throws BacktrackException */ - protected IASTTypeId typeId(boolean forNewExpression) - throws EndOfFileException, BacktrackException { + protected IASTTypeId typeId(boolean forNewExpression) throws EndOfFileException { IToken mark = mark(); int startingOffset = mark.getOffset(); IASTDeclSpecifier declSpecifier = null; IASTDeclarator declarator = null; - try { try { declSpecifier = declSpecifierSeq(true, true); } catch (FoundDeclaratorException e) { - throwBacktrack( mark ); + return null; } if (LT(1) != IToken.tEOC) declarator = declarator(SimpleDeclarationStrategy.TRY_FUNCTION, forNewExpression); } catch (BacktrackException bt) { + return null; + /* backup(mark); if (declarator != null || declSpecifier != null) throwBacktrack(startingOffset, figureEndOffset(declSpecifier, @@ -990,26 +977,36 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { - startingOffset); else throwBacktrack(startingOffset, bt.getLength()); + */ } if (declarator != null) { if (declarator.getName().toCharArray().length > 0) { + return null; + /* backup(mark); throwBacktrack(startingOffset, figureEndOffset(declSpecifier, declarator) - startingOffset); + */ } if (declSpecifier instanceof IASTSimpleDeclSpecifier && ((ASTNode) declSpecifier).getLength() == 0) { + return null; + /* backup(mark); throwBacktrack(startingOffset, figureEndOffset(declSpecifier, declarator) - startingOffset); + */ } if (declarator instanceof IASTArrayDeclarator && forNewExpression) { + return null; + /* backup(mark); throwBacktrack(startingOffset, figureEndOffset(declSpecifier, declarator) - startingOffset); + */ } } @@ -1027,7 +1024,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { declarator.setParent(result); declarator.setPropertyInParent(IASTTypeId.ABSTRACT_DECLARATOR); } - return result; } @@ -1049,7 +1045,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { boolean global = false; if (LT(1) == IToken.tCOLONCOLON) { // global scope - consume(IToken.tCOLONCOLON); + consume(); global = true; } @@ -1102,10 +1098,10 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { boolean isGlobal = false; if (LT(1) == IToken.tCOLONCOLON) { - lastOffset = consume(IToken.tCOLONCOLON).getEndOffset(); + lastOffset = consume().getEndOffset(); isGlobal = true; } - lastOffset = consume(IToken.t_new).getEndOffset(); + lastOffset = consume().getEndOffset(); boolean typeIdInParen = false; boolean placementParseFailure = true; IToken beforeSecondParen = null; @@ -1118,7 +1114,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { master_new_loop: for (int i = 0; i < 2; ++i) { IToken loopMark = LA(1); if (LT(1) == IToken.tLPAREN) { - lastOffset = consume(IToken.tLPAREN).getEndOffset(); + lastOffset = consume().getEndOffset(); if (templateIdScopes.size() > 0) { templateIdScopes.push(IToken.tLPAREN); } @@ -1142,7 +1138,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { if (LT(1) == IToken.tLPAREN) { beforeSecondParen = mark(); - lastOffset = consume(IToken.tLPAREN).getEndOffset(); + lastOffset = consume().getEndOffset(); if (templateIdScopes.size() > 0) { templateIdScopes.push(IToken.tLPAREN); } // push 2nd Paren @@ -1156,6 +1152,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { // the first expression in () is not a placement // - then it has to be typeId typeId = typeId(false); + if (typeId == null) throw backtrack; lastOffset = consume(IToken.tRPAREN).getEndOffset(); if (templateIdScopes.size() > 0) { templateIdScopes.pop(); @@ -1176,12 +1173,12 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { // the first expression in () is parsed as a placement, // and the next expression doesn't start with '(' or '[' // - then it has to be typeId - try { - backtrackMarker = mark(); - typeId = typeId(true); + backtrackMarker = mark(); + typeId = typeId(true); + if (typeId != null) { lastOffset = calculateEndOffset(typeId); break master_new_loop; - } catch (BacktrackException e) { + } else { // Hmmm, so it wasn't typeId after all... Then it is // CASE: new (typeid-looking-as-placement) backup(loopMark); @@ -1195,8 +1192,14 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { // and the next expression starts with '('. // The problem is, the first expression might as well be a // typeid - try { - typeId = typeId(true); + typeId = typeId(true); + if (typeId == null) { + backup(beforeSecondParen); + if (templateIdScopes.size() > 0) { + templateIdScopes.pop(); + } + } else + try { lastOffset = consume(IToken.tRPAREN).getEndOffset(); if (templateIdScopes.size() > 0) { templateIdScopes.pop(); @@ -1248,12 +1251,12 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { }// pop that 2nd paren } } - } else { // CASE: new typeid ... // new parameters do not start with '(' // i.e it has to be a plain typeId typeId = typeId(true); + if (typeId == null) throw backtrack; lastOffset = calculateEndOffset(typeId); isNewTypeId = true; break master_new_loop; @@ -1297,7 +1300,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { } // newinitializer if (LT(1) == IToken.tLPAREN) { - lastOffset = consume(IToken.tLPAREN).getEndOffset(); + lastOffset = consume().getEndOffset(); if (templateIdScopes.size() > 0) { templateIdScopes.push(IToken.tLPAREN); } @@ -1396,11 +1399,11 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { switch (LT(1)) { case IToken.t_typename: - int o = consume(IToken.t_typename).getOffset(); + int o = consume().getOffset(); boolean templateTokenConsumed = false; if (LT(1) == IToken.t_template) { - consume(IToken.t_template); + consume(); templateTokenConsumed = true; } ITokenDuple nestedName = name(); @@ -1526,7 +1529,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { switch (LT(1)) { case IToken.tLBRACKET: // array access - consume(IToken.tLBRACKET); + consume(); if (templateIdScopes.size() > 0) { templateIdScopes.push(IToken.tLBRACKET); } @@ -1560,7 +1563,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { break; case IToken.tLPAREN: // function call - consume(IToken.tLPAREN); + consume(); if (templateIdScopes.size() > 0) { templateIdScopes.push(IToken.tLPAREN); @@ -1599,7 +1602,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { firstExpression = fce; break; case IToken.tINCR: - int offset = consume(IToken.tINCR).getEndOffset(); + int offset = consume().getEndOffset(); firstExpression = buildUnaryExpression( IASTUnaryExpression.op_postFixIncr, firstExpression, ((ASTNode) firstExpression).getOffset(), offset); @@ -1612,9 +1615,9 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { break; case IToken.tDOT: // member access - IToken dot = consume(IToken.tDOT); + IToken dot = consume(); if (LT(1) == IToken.t_template) { - consume(IToken.t_template); + consume(); isTemplate = true; } @@ -1643,10 +1646,10 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { break; case IToken.tARROW: // member access - IToken arrow = consume(IToken.tARROW); + IToken arrow = consume(); if (LT(1) == IToken.t_template) { - consume(IToken.t_template); + consume(); isTemplate = true; } @@ -1825,7 +1828,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { IASTExpression lhs = expression(); int finalOffset = Integer.MAX_VALUE; if (LT(1) == IToken.tRPAREN) - finalOffset = consume(IToken.tRPAREN).getEndOffset(); + finalOffset = consume().getEndOffset(); if (templateIdScopes.size() > 0) { templateIdScopes.pop(); } @@ -1910,6 +1913,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { IToken op = consume(); consume(IToken.tLT); IASTTypeId typeID = typeId(false); + if (typeID == null) { throw backtrack; } consume(IToken.tGT); consume(IToken.tLPAREN); IASTExpression lhs = expression(); @@ -1995,11 +1999,11 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { */ protected IASTDeclaration usingClause() throws EndOfFileException, BacktrackException { - IToken firstToken = consume(IToken.t_using); + IToken firstToken = consume(); if (LT(1) == IToken.t_namespace) { // using-directive - int endOffset = consume(IToken.t_namespace).getEndOffset(); + int endOffset = consume().getEndOffset(); IASTName name = null; switch (LT(1)) { case IToken.tIDENTIFIER: @@ -2034,7 +2038,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { if (LT(1) == IToken.t_typename) { typeName = true; - consume(IToken.t_typename); + consume(); } IASTName name = createName(name()); @@ -2086,14 +2090,14 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { */ protected ICPPASTLinkageSpecification linkageSpecification() throws EndOfFileException, BacktrackException { - IToken firstToken = consume(IToken.t_extern); - IToken spec = consume(IToken.tSTRING); + IToken firstToken = consume(); // t_extern + IToken spec = consume(); // tString ICPPASTLinkageSpecification linkage = createLinkageSpecification(); ((ASTNode) linkage).setOffset(firstToken.getOffset()); linkage.setLiteral(spec.getImage()); if (LT(1) == IToken.tLBRACE) { - consume(IToken.tLBRACE); + consume(); linkageDeclarationLoop: while (LT(1) != IToken.tRBRACE) { int checkToken = LA(1).hashCode(); @@ -2173,7 +2177,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { ++templateCount; if (LT(1) == IToken.t_export) { exported = true; - firstToken = consume(IToken.t_export); + firstToken = consume(); consume(IToken.t_template); } else { if (supportExtendedTemplateSyntax) { @@ -2228,10 +2232,10 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { } return templateInstantiation; } - consume(IToken.tLT); + consume(); // check for LT made before if (LT(1) == IToken.tGT) { // explicit-specialization - consume(IToken.tGT); + consume(); ICPPASTTemplateSpecialization templateSpecialization = createTemplateSpecialization(); try { @@ -2353,8 +2357,9 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { lastOffset = calculateEndOffset(identifierName); if (LT(1) == IToken.tASSIGN) // optional = type-id { - consume(IToken.tASSIGN); + consume(); typeId = typeId(false); // type-id + if (typeId == null) throw backtrack; lastOffset = calculateEndOffset(typeId); } } else { @@ -2378,7 +2383,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { returnValue.add(parm); } else if (LT(1) == IToken.t_template) { - IToken firstToken = consume(IToken.t_template); + IToken firstToken = consume(); consume(IToken.tLT); List subResult = templateParameterList(); @@ -2393,7 +2398,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { last = calculateEndOffset(identifierName); if (LT(1) == IToken.tASSIGN) // optional = type-id { - consume(IToken.tASSIGN); + consume(); optionalExpression = primaryExpression(); last = calculateEndOffset(optionalExpression); } @@ -2425,7 +2430,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { returnValue.add(parm); } else if (LT(1) == IToken.tCOMMA) { - consume(IToken.tCOMMA); + consume(); continue; } else { ICPPASTParameterDeclaration parm = parameterDeclaration(); @@ -2603,7 +2608,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { protected IASTDeclaration namespaceDefinitionOrAlias() throws BacktrackException, EndOfFileException { - IToken first = consume(IToken.t_namespace); + IToken first = consume(); int last = first.getEndOffset(); IASTName name = null; // optional name @@ -2660,7 +2665,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { - first.getOffset()); return namespaceDefinition; } else if (LT(1) == IToken.tASSIGN) { - IToken assign = consume(IToken.tASSIGN); + IToken assign = consume(); if (name.toString() == null) { throwBacktrack(first.getOffset(), assign.getEndOffset() @@ -2888,7 +2893,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { .append(IASTDeclarator.class, declarators, initDeclarator(strategy)); while (LT(1) == IToken.tCOMMA) { - consume(IToken.tCOMMA); + consume(); declarators = (IASTDeclarator[]) ArrayUtil.append( IASTDeclarator.class, declarators, initDeclarator(strategy)); @@ -2908,11 +2913,11 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { case IToken.tSEMI: if( fromCatchHandler ) break; - semiOffset = consume(IToken.tSEMI).getEndOffset(); + semiOffset = consume().getEndOffset(); consumedSemi = true; break; case IToken.t_try: - consume(IToken.t_try); + consume(); if (LT(1) == IToken.tCOLON) { constructorChain = new ArrayList( DEFAULT_CONSTRUCTOR_CHAIN_LIST_SIZE); @@ -3070,7 +3075,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { */ protected void ctorInitializer(List collection) throws EndOfFileException, BacktrackException { - consume(IToken.tCOLON); + consume(); ctorLoop: for (;;) { ITokenDuple duple = name(); IASTName name = createName(duple); @@ -3079,7 +3084,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { IASTExpression expressionList = null; switch (LT(1)) { case IToken.tLPAREN: - consume(IToken.tLPAREN); + consume(); if (LT(1) != IToken.tRPAREN) expressionList = expression(); @@ -3118,7 +3123,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { switch (LT(1)) { case IToken.tCOMMA: - consume(IToken.tCOMMA); + consume(); break; case IToken.tLBRACE: case IToken.tEOC: @@ -3320,7 +3325,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { throwBacktrack(la.getOffset(), la.getEndOffset() - la.getOffset()); } - last = consume(IToken.t__Complex); + last = consume(); isComplex=true; break; case IToken.t__Imaginary: @@ -3328,7 +3333,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { IToken la = LA(1); throwBacktrack(la.getOffset(), la.getLength()); } - last = consume(IToken.t__Imaginary); + last = consume(); isImaginary=true; break; case IToken.t_char: @@ -3368,7 +3373,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { break; case IToken.t_typename: isTypename = true; - last = consume(IToken.t_typename); + last = consume(); duple = name(); last = duple.getLastToken(); flags.setEncounteredTypename(true); @@ -3700,7 +3705,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { // handle initializer if (LT(1) == IToken.tASSIGN) { - consume(IToken.tASSIGN); + consume(); try { return initializerClause(); } catch (EndOfFileException eof) { @@ -3717,7 +3722,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { return null; } // initializer in constructor - IToken t = consume(IToken.tLPAREN); // EAT IT! + IToken t = consume(); // EAT IT! int o = t.getOffset(); IASTExpression astExpression = expression(); if( astExpression == null ) @@ -3747,13 +3752,13 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { protected IASTInitializer initializerClause() throws EndOfFileException, BacktrackException { if (LT(1) == IToken.tLBRACE) { - int startingOffset = consume(IToken.tLBRACE).getOffset(); + int startingOffset = consume().getOffset(); IASTInitializerList result = createInitializerList(); ((ASTNode) result).setOffset(startingOffset); if (LT(1) == (IToken.tRBRACE)) { - int l = consume(IToken.tRBRACE).getEndOffset(); + int l = consume().getEndOffset(); ((ASTNode) result).setLength(l - startingOffset); return result; } @@ -3775,7 +3780,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { break; consume(IToken.tCOMMA); } - int l = consume(IToken.tRBRACE).getEndOffset(); + int l = consume().getEndOffset(); // tRBRACE ((ASTNode) result).setLength(l - startingOffset); return result; } @@ -3885,7 +3890,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { boolean success = false; try { - consume( IToken.tLPAREN ); + consume(); // tLPAREN expression(); consume( IToken.tRPAREN ); success = true; @@ -3988,7 +3993,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { if (LT(1) == IToken.t_throw) { exceptionSpecIds = new ArrayList( DEFAULT_SIZE_EXCEPTIONS_LIST); - consume(IToken.t_throw); // throw + consume(); // throw consume(IToken.tLPAREN); // ( boolean done = false; while (!done) { @@ -4002,17 +4007,18 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { break; default: IToken before = LA(1); - try { - exceptionSpecIds.add(typeId(false)); - } catch (BacktrackException e) { - IASTProblem p = failParse(e); - IASTProblemTypeId typeIdProblem = createTypeIDProblem(); + IASTTypeId typeId = typeId(false); + if (typeId != null) { + exceptionSpecIds.add(typeId); + } else { + IASTProblem p = createProblem(IASTProblem.SYNTAX_ERROR, + before.getOffset(), before.getLength()); + IASTProblemTypeId typeIdProblem = createTypeIDProblem(); typeIdProblem.setProblem(p); ((CPPASTNode) typeIdProblem) .setOffsetAndLength(((CPPASTNode) p)); p.setParent(typeIdProblem); - p - .setPropertyInParent(IASTProblemHolder.PROBLEM); + p.setPropertyInParent(IASTProblemHolder.PROBLEM); exceptionSpecIds.add(typeIdProblem); if (before == LA(1)) done = true; @@ -4025,9 +4031,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { if (LT(1) == IToken.tASSIGN && LT(2) == IToken.tINTEGER) { char[] image = LA(2).getCharImage(); if (image.length == 1 && image[0] == '0') { - consume(IToken.tASSIGN); - finalOffset = consume(IToken.tINTEGER) - .getEndOffset(); + consume(); // tASSIGN + finalOffset = consume().getEndOffset(); // tINTEGER isPureVirtual = true; } } @@ -4060,7 +4065,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { .get(arrayMods.size() - 1)); continue; case IToken.tCOLON: - consume(IToken.tCOLON); + consume(); bitField = constantExpression(); finalOffset = calculateEndOffset(bitField); break; @@ -4305,7 +4310,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { } if (LT(1) == IToken.tLBRACE) { - consume(IToken.tLBRACE); + consume(); memberDeclarationLoop: while (true) { int checkToken = LA(1).hashCode(); @@ -4326,7 +4331,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { break; } case IToken.tRBRACE: { - int l = consume(IToken.tRBRACE).getEndOffset(); + int l = consume().getEndOffset(); ((ASTNode) astClassSpecifier).setLength(l - classKey.getOffset()); break memberDeclarationLoop; @@ -4409,7 +4414,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { protected void baseSpecifier(ICPPASTCompositeTypeSpecifier astClassSpec) throws EndOfFileException, BacktrackException { - IToken last = consume(IToken.tCOLON); + IToken last = consume(); // tCOLON boolean isVirtual = false; int visibility = 0; // ASTAccessVisibility.PUBLIC; @@ -4419,10 +4424,10 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { switch (LT(1)) { case IToken.t_virtual: if (firstToken == null) { - firstToken = consume(IToken.t_virtual); + firstToken = consume(); last = firstToken; } else - last = consume(IToken.t_virtual); + last = consume(); isVirtual = true; break; case IToken.t_public: @@ -4532,7 +4537,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { int nextToken = LT(1); while (nextToken == IToken.t_catch) { - int startOffset = consume(IToken.t_catch).getOffset(); + int startOffset = consume().getOffset(); consume(IToken.tLPAREN); boolean isEllipsis = false; IASTDeclaration decl = null; @@ -4726,7 +4731,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { protected void consumeArrayModifiers(List collection) throws EndOfFileException, BacktrackException { while (LT(1) == IToken.tLBRACKET) { - int o = consume(IToken.tLBRACKET).getOffset(); // eat the '[' + int o = consume().getOffset(); // eat the '[' IASTExpression exp = null; if (LT(1) != IToken.tRBRACKET && LT(1) != IToken.tEOC) { @@ -5075,7 +5080,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { */ protected IASTStatement parseTryStatement() throws EndOfFileException, BacktrackException { - int startO = consume(IToken.t_try).getOffset(); + int startO = consume().getOffset(); IASTStatement tryBlock = compoundStatement(); List catchHandlers = new ArrayList(DEFAULT_CATCH_HANDLER_LIST_SIZE); catchHandlerSequence(catchHandlers); @@ -5152,7 +5157,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { */ protected IASTStatement parseWhileStatement() throws EndOfFileException, BacktrackException { - int startOffset = consume(IToken.t_while).getOffset(); + int startOffset = consume().getOffset(); consume(IToken.tLPAREN); IASTNode while_condition = cppStyleCondition(true); consume(IToken.tRPAREN); @@ -5316,7 +5321,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { - ((ASTNode) new_if_statement).getOffset()); } if (LT(1) == IToken.t_else) { - consume(IToken.t_else); + consume(); if (LT(1) == IToken.t_if) { // an else if, don't recurse, just loop and do another if @@ -5426,7 +5431,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { */ protected IASTStatement parseSwitchStatement() throws EndOfFileException, BacktrackException { int startOffset; - startOffset = consume(IToken.t_switch).getOffset(); + startOffset = consume().getOffset(); consume(IToken.tLPAREN); IASTNode switch_condition = cppStyleCondition(true); consume(IToken.tRPAREN); @@ -5460,7 +5465,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { */ protected IASTStatement parseForStatement() throws EndOfFileException, BacktrackException { int startOffset; - startOffset = consume(IToken.t_for).getOffset(); + startOffset = consume().getOffset(); consume(IToken.tLPAREN); IASTStatement init = forInitStatement(); IASTNode for_condition = null; @@ -5473,7 +5478,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { } switch (LT(1)) { case IToken.tSEMI: - consume(IToken.tSEMI); + consume(); break; case IToken.tEOC: break; @@ -5490,7 +5495,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { } switch (LT(1)) { case IToken.tRPAREN: - consume(IToken.tRPAREN); + consume(); break; case IToken.tEOC: break;