1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-08 10:16:03 +02:00

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.
This commit is contained in:
Oleg Krasilnikov 2006-02-09 13:45:17 +00:00
parent 2f616a8c07
commit c69e46df85
3 changed files with 241 additions and 246 deletions

View file

@ -213,13 +213,11 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
* @throws BacktrackException * @throws BacktrackException
* If LT(1) != type * If LT(1) != type
*/ */
// static int cnt = 0;
protected IToken consume(int type) throws EndOfFileException, protected IToken consume(int type) throws EndOfFileException,
BacktrackException { BacktrackException {
if (LT(1) == type) if (LT(1) == type)
return consume(); return consume();
IToken la = LA(1); IToken la = LA(1);
// System.out.println("from Consume !" + cnt++);
throwBacktrack(la.getOffset(), la.getLength()); throwBacktrack(la.getOffset(), la.getLength());
return null; return null;
} }
@ -560,7 +558,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
*/ */
protected IASTExpression compoundStatementExpression() protected IASTExpression compoundStatementExpression()
throws EndOfFileException, BacktrackException { throws EndOfFileException, BacktrackException {
int startingOffset = consume(IToken.tLPAREN).getOffset(); int startingOffset = consume().getOffset(); // tLPAREN always
IASTCompoundStatement compoundStatement = null; IASTCompoundStatement compoundStatement = null;
if (mode == ParserMode.QUICK_PARSE if (mode == ParserMode.QUICK_PARSE
|| mode == ParserMode.STRUCTURAL_PARSE) || mode == ParserMode.STRUCTURAL_PARSE)
@ -618,7 +616,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
int lastOffset = 0; int lastOffset = 0;
while (LT(1) == IToken.tCOMMA) { while (LT(1) == IToken.tCOMMA) {
consume(IToken.tCOMMA); consume();
IASTExpression secondExpression = assignmentExpression(); IASTExpression secondExpression = assignmentExpression();
expressionList.addExpression(secondExpression); expressionList.addExpression(secondExpression);
secondExpression.setParent(expressionList); secondExpression.setParent(expressionList);
@ -645,7 +643,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
throws BacktrackException, EndOfFileException; throws BacktrackException, EndOfFileException;
protected abstract IASTTypeId typeId(boolean forNewExpression) protected abstract IASTTypeId typeId(boolean forNewExpression)
throws BacktrackException, EndOfFileException; throws EndOfFileException;
protected abstract IASTExpression castExpression() protected abstract IASTExpression castExpression()
throws BacktrackException, EndOfFileException; throws BacktrackException, EndOfFileException;
@ -684,7 +682,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
EndOfFileException { EndOfFileException {
IASTExpression firstExpression = logicalAndExpression(); IASTExpression firstExpression = logicalAndExpression();
while (LT(1) == IToken.tOR) { while (LT(1) == IToken.tOR) {
consume(IToken.tOR); consume();
IASTExpression secondExpression = logicalAndExpression(); IASTExpression secondExpression = logicalAndExpression();
firstExpression = buildBinaryExpression( firstExpression = buildBinaryExpression(
IASTBinaryExpression.op_logicalOr, firstExpression, IASTBinaryExpression.op_logicalOr, firstExpression,
@ -701,7 +699,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
EndOfFileException { EndOfFileException {
IASTExpression firstExpression = inclusiveOrExpression(); IASTExpression firstExpression = inclusiveOrExpression();
while (LT(1) == IToken.tAND) { while (LT(1) == IToken.tAND) {
consume(IToken.tAND); consume();
IASTExpression secondExpression = inclusiveOrExpression(); IASTExpression secondExpression = inclusiveOrExpression();
firstExpression = buildBinaryExpression( firstExpression = buildBinaryExpression(
IASTBinaryExpression.op_logicalAnd, firstExpression, IASTBinaryExpression.op_logicalAnd, firstExpression,
@ -718,7 +716,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
EndOfFileException { EndOfFileException {
IASTExpression firstExpression = exclusiveOrExpression(); IASTExpression firstExpression = exclusiveOrExpression();
while (LT(1) == IToken.tBITOR) { while (LT(1) == IToken.tBITOR) {
consume(IToken.tBITOR); consume();
IASTExpression secondExpression = exclusiveOrExpression(); IASTExpression secondExpression = exclusiveOrExpression();
firstExpression = buildBinaryExpression( firstExpression = buildBinaryExpression(
IASTBinaryExpression.op_binaryOr, firstExpression, IASTBinaryExpression.op_binaryOr, firstExpression,
@ -735,7 +733,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
EndOfFileException { EndOfFileException {
IASTExpression firstExpression = andExpression(); IASTExpression firstExpression = andExpression();
while (LT(1) == IToken.tXOR) { while (LT(1) == IToken.tXOR) {
consume(IToken.tXOR); consume();
IASTExpression secondExpression = andExpression(); IASTExpression secondExpression = andExpression();
firstExpression = buildBinaryExpression( firstExpression = buildBinaryExpression(
IASTBinaryExpression.op_binaryXor, firstExpression, IASTBinaryExpression.op_binaryXor, firstExpression,
@ -867,7 +865,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
EndOfFileException { EndOfFileException {
IASTExpression firstExpression = logicalOrExpression(); IASTExpression firstExpression = logicalOrExpression();
if (LT(1) == IToken.tQUESTION) { if (LT(1) == IToken.tQUESTION) {
consume(IToken.tQUESTION); consume();
IASTExpression secondExpression = expression(); IASTExpression secondExpression = expression();
IASTExpression thirdExpression = null; IASTExpression thirdExpression = null;
@ -939,7 +937,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
*/ */
protected IASTExpression unaryAlignofExpression() protected IASTExpression unaryAlignofExpression()
throws EndOfFileException, BacktrackException { throws EndOfFileException, BacktrackException {
int offset = consume(IGCCToken.t___alignof__).getOffset(); int offset = consume().getOffset(); // t___alignof__
IASTTypeId d = null; IASTTypeId d = null;
IASTExpression unaryExpression = null; IASTExpression unaryExpression = null;
@ -948,7 +946,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
if (LT(1) == IToken.tLPAREN) { if (LT(1) == IToken.tLPAREN) {
boolean needBack = false; boolean needBack = false;
try { try {
consume(IToken.tLPAREN); consume();
d = typeId(false); d = typeId(false);
if (d == null) if (d == null)
needBack = true; needBack = true;
@ -979,7 +977,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
protected IASTExpression unaryTypeofExpression() throws EndOfFileException, protected IASTExpression unaryTypeofExpression() throws EndOfFileException,
BacktrackException { BacktrackException {
int offset = consume(IGCCToken.t_typeof).getOffset(); int offset = consume().getOffset(); // t_typeof
IASTTypeId d = null; IASTTypeId d = null;
IASTExpression unaryExpression = null; IASTExpression unaryExpression = null;
@ -992,7 +990,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
} else { } else {
boolean needBack = false; boolean needBack = false;
try { try {
consume(IToken.tLPAREN); consume(); // tLPAREN
d = typeId(false); d = typeId(false);
if (d == null) if (d == null)
needBack = true; needBack = true;
@ -1253,7 +1251,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
throws BacktrackException, EndOfFileException { throws BacktrackException, EndOfFileException {
IToken mark = mark(); IToken mark = mark();
IASTName name = null; IASTName name = null;
int startOffset = consume(IToken.t_enum).getOffset(); int startOffset = consume().getOffset(); // t_enum
if (LT(1) == IToken.tIDENTIFIER) { if (LT(1) == IToken.tIDENTIFIER) {
name = createName(identifier()); name = createName(identifier());
} else } else
@ -1266,7 +1264,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
name.setParent(result); name.setParent(result);
name.setPropertyInParent(IASTEnumerationSpecifier.ENUMERATION_NAME); name.setPropertyInParent(IASTEnumerationSpecifier.ENUMERATION_NAME);
consume(IToken.tLBRACE); consume(); // IToken.tLBRACE
enumLoop: while (true) { enumLoop: while (true) {
switch (LT(1)) { switch (LT(1)) {
@ -1287,7 +1285,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
} }
IASTExpression initialValue = null; IASTExpression initialValue = null;
if (LT(1) == IToken.tASSIGN) { if (LT(1) == IToken.tASSIGN) {
consume(IToken.tASSIGN); consume();
initialValue = constantExpression(); initialValue = constantExpression();
lastOffset = calculateEndOffset(initialValue); lastOffset = calculateEndOffset(initialValue);
} }
@ -1477,7 +1475,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
*/ */
protected IASTDeclaration asmDeclaration() throws EndOfFileException, protected IASTDeclaration asmDeclaration() throws EndOfFileException,
BacktrackException { BacktrackException {
IToken first = consume(IToken.t_asm); IToken first = consume(); // t_asm
consume(IToken.tLPAREN); consume(IToken.tLPAREN);
String assembly = consume(IToken.tSTRING).getImage(); String assembly = consume(IToken.tSTRING).getImage();
consume(IToken.tRPAREN); consume(IToken.tRPAREN);
@ -1703,8 +1701,8 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
*/ */
protected IASTStatement parseLabelStatement() throws EndOfFileException, protected IASTStatement parseLabelStatement() throws EndOfFileException,
BacktrackException { BacktrackException {
IToken labelName = consume(IToken.tIDENTIFIER); IToken labelName = consume(); // tIDENTIFIER
consume(IToken.tCOLON); consume(); // tCOLON
IASTStatement nestedStatement = statement(); IASTStatement nestedStatement = statement();
int lastOffset = calculateEndOffset( nestedStatement ); int lastOffset = calculateEndOffset( nestedStatement );
IASTLabelStatement label_statement = createLabelStatement(); IASTLabelStatement label_statement = createLabelStatement();
@ -1729,7 +1727,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
*/ */
protected IASTStatement parseNullStatement() throws EndOfFileException, protected IASTStatement parseNullStatement() throws EndOfFileException,
BacktrackException { BacktrackException {
IToken t = consume(IToken.tSEMI); IToken t = consume(); // tSEMI
IASTNullStatement null_statement = createNullStatement(); IASTNullStatement null_statement = createNullStatement();
((ASTNode) null_statement).setOffsetAndLength(t.getOffset(), t ((ASTNode) null_statement).setOffsetAndLength(t.getOffset(), t
@ -1745,7 +1743,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
*/ */
protected IASTStatement parseGotoStatement() throws EndOfFileException, protected IASTStatement parseGotoStatement() throws EndOfFileException,
BacktrackException { BacktrackException {
int startOffset = consume(IToken.t_goto).getOffset(); int startOffset = consume().getOffset(); // t_goto
IToken identifier = consume(IToken.tIDENTIFIER); IToken identifier = consume(IToken.tIDENTIFIER);
int lastOffset = consume(IToken.tSEMI).getEndOffset(); int lastOffset = consume(IToken.tSEMI).getEndOffset();
@ -1766,7 +1764,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
*/ */
protected IASTStatement parseBreakStatement() throws EndOfFileException, protected IASTStatement parseBreakStatement() throws EndOfFileException,
BacktrackException { BacktrackException {
int startOffset = consume(IToken.t_break).getOffset(); int startOffset = consume().getOffset(); // t_break
int lastOffset = consume(IToken.tSEMI).getEndOffset(); int lastOffset = consume(IToken.tSEMI).getEndOffset();
IASTBreakStatement break_statement = createBreakStatement(); IASTBreakStatement break_statement = createBreakStatement();
@ -1782,7 +1780,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
*/ */
protected IASTStatement parseContinueStatement() throws EndOfFileException, protected IASTStatement parseContinueStatement() throws EndOfFileException,
BacktrackException { BacktrackException {
int startOffset = consume(IToken.t_continue).getOffset(); int startOffset = consume().getOffset(); // t_continue
int lastOffset = consume(IToken.tSEMI).getEndOffset(); int lastOffset = consume(IToken.tSEMI).getEndOffset();
IASTContinueStatement continue_statement = createContinueStatement(); IASTContinueStatement continue_statement = createContinueStatement();
@ -1799,7 +1797,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
protected IASTStatement parseReturnStatement() throws EndOfFileException, protected IASTStatement parseReturnStatement() throws EndOfFileException,
BacktrackException { BacktrackException {
int startOffset; int startOffset;
startOffset = consume(IToken.t_return).getOffset(); startOffset = consume().getOffset(); // t_return
IASTExpression result = null; IASTExpression result = null;
// See if there is a return expression // See if there is a return expression
@ -1851,7 +1849,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
protected IASTStatement parseDoStatement() throws EndOfFileException, protected IASTStatement parseDoStatement() throws EndOfFileException,
BacktrackException { BacktrackException {
int startOffset; int startOffset;
startOffset = consume(IToken.t_do).getOffset(); startOffset = consume().getOffset(); // t_do
IASTStatement do_body = statement(); IASTStatement do_body = statement();
IASTExpression do_condition = null; IASTExpression do_condition = null;
@ -1904,7 +1902,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
*/ */
protected IASTStatement parseWhileStatement() throws EndOfFileException, protected IASTStatement parseWhileStatement() throws EndOfFileException,
BacktrackException { BacktrackException {
int startOffset = consume(IToken.t_while).getOffset(); int startOffset = consume().getOffset();
consume(IToken.tLPAREN); consume(IToken.tLPAREN);
IASTExpression while_condition = condition(); IASTExpression while_condition = condition();
switch (LT(1)) { switch (LT(1)) {
@ -1990,7 +1988,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
*/ */
protected IASTStatement parseDefaultStatement() throws EndOfFileException, protected IASTStatement parseDefaultStatement() throws EndOfFileException,
BacktrackException { BacktrackException {
int startOffset = consume(IToken.t_default).getOffset(); int startOffset = consume().getOffset(); // t_default
int lastOffset = consume(IToken.tCOLON).getEndOffset(); int lastOffset = consume(IToken.tCOLON).getEndOffset();
IASTDefaultStatement df = createDefaultStatement(); IASTDefaultStatement df = createDefaultStatement();
@ -2006,7 +2004,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
*/ */
protected IASTStatement parseCaseStatement() throws EndOfFileException, protected IASTStatement parseCaseStatement() throws EndOfFileException,
BacktrackException { BacktrackException {
int startOffset = consume(IToken.t_case).getOffset(); int startOffset = consume().getOffset(); // t_case
IASTExpression case_exp = constantExpression(); IASTExpression case_exp = constantExpression();
int lastOffset = 0; int lastOffset = 0;
switch (LT(1)) { switch (LT(1)) {
@ -2120,7 +2118,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
protected IASTExpression parseSizeofExpression() throws BacktrackException, protected IASTExpression parseSizeofExpression() throws BacktrackException,
EndOfFileException { EndOfFileException {
int startingOffset = consume(IToken.t_sizeof).getOffset(); int startingOffset = consume().getOffset(); // t_sizeof
IASTNode[] choice = parseTypeIdOrUnaryExpression(true); IASTNode[] choice = parseTypeIdOrUnaryExpression(true);
switch (choice.length) { switch (choice.length) {
case 1: case 1:

View file

@ -143,7 +143,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
protected IASTInitializer optionalCInitializer() throws EndOfFileException, protected IASTInitializer optionalCInitializer() throws EndOfFileException,
BacktrackException { BacktrackException {
if (LT(1) == IToken.tASSIGN) { if (LT(1) == IToken.tASSIGN) {
consume(IToken.tASSIGN); consume();
return cInitializerClause(Collections.EMPTY_LIST); return cInitializerClause(Collections.EMPTY_LIST);
} }
return null; return null;
@ -159,7 +159,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
int startingOffset = la.getOffset(); int startingOffset = la.getOffset();
la = null; la = null;
if (LT(1) == IToken.tLBRACE) { if (LT(1) == IToken.tLBRACE) {
consume(IToken.tLBRACE); consume();
IASTInitializerList result = createInitializerList(); IASTInitializerList result = createInitializerList();
((ASTNode) result).setOffset(startingOffset); ((ASTNode) result).setOffset(startingOffset);
for (;;) { for (;;) {
@ -169,7 +169,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
List newDesignators = designatorList(); List newDesignators = designatorList();
if (newDesignators.size() != 0) if (newDesignators.size() != 0)
if (LT(1) == IToken.tASSIGN) if (LT(1) == IToken.tASSIGN)
consume(IToken.tASSIGN); consume();
IASTInitializer initializer = cInitializerClause(newDesignators); IASTInitializer initializer = cInitializerClause(newDesignators);
@ -205,7 +205,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
break; break;
// can end with ", }" // can end with ", }"
if (LT(1) == IToken.tCOMMA) if (LT(1) == IToken.tCOMMA)
consume(IToken.tCOMMA); consume();
if (LT(1) == IToken.tRBRACE) if (LT(1) == IToken.tRBRACE)
break; break;
if (checkHashcode == LA(1).hashCode()) { if (checkHashcode == LA(1).hashCode()) {
@ -271,7 +271,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
if (LT(1) == IToken.tDOT || LT(1) == IToken.tLBRACKET) { if (LT(1) == IToken.tDOT || LT(1) == IToken.tLBRACKET) {
while (LT(1) == IToken.tDOT || LT(1) == IToken.tLBRACKET) { while (LT(1) == IToken.tDOT || LT(1) == IToken.tLBRACKET) {
if (LT(1) == IToken.tDOT) { if (LT(1) == IToken.tDOT) {
int offset = consume(IToken.tDOT).getOffset(); int offset = consume().getOffset();
IToken id = identifier(); IToken id = identifier();
ICASTFieldDesignator designator = createFieldDesignator(); ICASTFieldDesignator designator = createFieldDesignator();
((ASTNode) designator).setOffsetAndLength(offset, id ((ASTNode) designator).setOffsetAndLength(offset, id
@ -286,12 +286,11 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
DEFAULT_DESIGNATOR_LIST_SIZE); DEFAULT_DESIGNATOR_LIST_SIZE);
designatorList.add(designator); designatorList.add(designator);
} else if (LT(1) == IToken.tLBRACKET) { } else if (LT(1) == IToken.tLBRACKET) {
IToken mark = consume(IToken.tLBRACKET); IToken mark = consume();
int offset = mark.getOffset(); int offset = mark.getOffset();
IASTExpression constantExpression = expression(); IASTExpression constantExpression = expression();
if (LT(1) == IToken.tRBRACKET) { if (LT(1) == IToken.tRBRACKET) {
int lastOffset = consume(IToken.tRBRACKET) int lastOffset = consume().getEndOffset();
.getEndOffset();
ICASTArrayDesignator designator = createArrayDesignator(); ICASTArrayDesignator designator = createArrayDesignator();
((ASTNode) designator).setOffsetAndLength(offset, ((ASTNode) designator).setOffsetAndLength(offset,
lastOffset - offset); lastOffset - offset);
@ -369,7 +368,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
DEFAULT_DESIGNATOR_LIST_SIZE); DEFAULT_DESIGNATOR_LIST_SIZE);
designatorList.add(designator); designatorList.add(designator);
} else if (LT(1) == IToken.tLBRACKET) { } else if (LT(1) == IToken.tLBRACKET) {
int startOffset = consume(IToken.tLBRACKET).getOffset(); int startOffset = consume().getOffset();
IASTExpression constantExpression1 = expression(); IASTExpression constantExpression1 = expression();
consume(IToken.tELLIPSIS); consume(IToken.tELLIPSIS);
IASTExpression constantExpression2 = expression(); IASTExpression constantExpression2 = expression();
@ -459,7 +458,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
declarators = (IASTDeclarator[]) ArrayUtil.append( IASTDeclarator.class, declarators, initDeclarator()); declarators = (IASTDeclarator[]) ArrayUtil.append( IASTDeclarator.class, declarators, initDeclarator());
while (LT(1) == IToken.tCOMMA) { while (LT(1) == IToken.tCOMMA) {
consume(IToken.tCOMMA); consume();
declarators = (IASTDeclarator[]) ArrayUtil.append( IASTDeclarator.class, declarators, initDeclarator()); declarators = (IASTDeclarator[]) ArrayUtil.append( IASTDeclarator.class, declarators, initDeclarator());
} }
} }
@ -472,7 +471,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
switch (LT(1)) { switch (LT(1)) {
case IToken.tSEMI: case IToken.tSEMI:
semiOffset = consume(IToken.tSEMI).getEndOffset(); semiOffset = consume().getEndOffset();
consumedSemi = true; consumedSemi = true;
break; break;
case IToken.tLBRACE: case IToken.tLBRACE:
@ -894,15 +893,14 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
case IToken.tDECR: case IToken.tDECR:
return unaryOperatorCastExpression(IASTUnaryExpression.op_prefixDecr); return unaryOperatorCastExpression(IASTUnaryExpression.op_prefixDecr);
case IToken.t_sizeof: case IToken.t_sizeof:
startingOffset = consume(IToken.t_sizeof).getOffset(); startingOffset = consume().getOffset();
IToken mark = LA(1); IToken mark = LA(1);
IASTExpression unaryExpression = null; IASTExpression unaryExpression = null;
IASTTypeId typeId = null; IASTTypeId typeId = null;
int lastOffset = 0; int lastOffset = 0;
if (LT(1) == IToken.tLPAREN) { if (LT(1) == IToken.tLPAREN) {
boolean needBack = false; boolean needBack = false;
try { consume();
consume(IToken.tLPAREN);
typeId = typeId(false); typeId = typeId(false);
if (typeId != null) { if (typeId != null) {
switch (LT(1)) { switch (LT(1)) {
@ -912,12 +910,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
break; break;
default: default:
needBack = true; needBack = true;
// throw backtrack;
} }
} else {needBack = true; } } else {needBack = true; }
} catch (BacktrackException bt) {
needBack = true;
}
if (needBack) { if (needBack) {
backup(mark); backup(mark);
typeId = null; typeId = null;
@ -990,7 +984,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
// ( type-name ) { initializer-list , } // ( type-name ) { initializer-list , }
IToken m = mark(); IToken m = mark();
try { try {
int offset = consume(IToken.tLPAREN).getOffset(); int offset = consume().getOffset();
IASTTypeId t = typeId(false); IASTTypeId t = typeId(false);
if (t != null) { if (t != null) {
consume(IToken.tRPAREN).getEndOffset(); consume(IToken.tRPAREN).getEndOffset();
@ -1012,12 +1006,12 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
switch (LT(1)) { switch (LT(1)) {
case IToken.tLBRACKET: case IToken.tLBRACKET:
// array access // array access
consume(IToken.tLBRACKET); consume();
secondExpression = expression(); secondExpression = expression();
int last; int last;
switch (LT(1)) { switch (LT(1)) {
case IToken.tRBRACKET: case IToken.tRBRACKET:
last = consume(IToken.tRBRACKET).getEndOffset(); last = consume().getEndOffset();
break; break;
case IToken.tEOC: case IToken.tEOC:
last = Integer.MAX_VALUE; last = Integer.MAX_VALUE;
@ -1042,11 +1036,11 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
break; break;
case IToken.tLPAREN: case IToken.tLPAREN:
// function call // function call
consume(IToken.tLPAREN); consume();
if (LT(1) != IToken.tRPAREN) if (LT(1) != IToken.tRPAREN)
secondExpression = expression(); secondExpression = expression();
if (LT(1) == IToken.tRPAREN) if (LT(1) == IToken.tRPAREN)
last = consume(IToken.tRPAREN).getEndOffset(); last = consume().getEndOffset();
else else
// must be EOC // must be EOC
last = Integer.MAX_VALUE; last = Integer.MAX_VALUE;
@ -1068,7 +1062,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
firstExpression = f; firstExpression = f;
break; break;
case IToken.tINCR: case IToken.tINCR:
int offset = consume(IToken.tINCR).getEndOffset(); int offset = consume().getEndOffset();
firstExpression = buildUnaryExpression( firstExpression = buildUnaryExpression(
IASTUnaryExpression.op_postFixIncr, firstExpression, IASTUnaryExpression.op_postFixIncr, firstExpression,
((CASTNode) firstExpression).getOffset(), offset); ((CASTNode) firstExpression).getOffset(), offset);
@ -1081,7 +1075,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
break; break;
case IToken.tDOT: case IToken.tDOT:
// member access // member access
IToken dot = consume(IToken.tDOT); IToken dot = consume();
IASTName name = createName(identifier()); IASTName name = createName(identifier());
if (name == null) if (name == null)
throwBacktrack(((ASTNode) firstExpression).getOffset(), throwBacktrack(((ASTNode) firstExpression).getOffset(),
@ -1103,7 +1097,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
break; break;
case IToken.tARROW: case IToken.tARROW:
// member access // member access
IToken arrow = consume(IToken.tARROW); IToken arrow = consume();
name = createName(identifier()); name = createName(identifier());
if (name == null) if (name == null)
throwBacktrack(((ASTNode) firstExpression).getOffset(), throwBacktrack(((ASTNode) firstExpression).getOffset(),
@ -1278,8 +1272,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
return new CASTIdExpression(); return new CASTIdExpression();
} }
protected IASTTypeId typeId(boolean forNewExpression) throws EndOfFileException, protected IASTTypeId typeId(boolean forNewExpression) throws EndOfFileException {
BacktrackException {
IToken mark = mark(); IToken mark = mark();
int startingOffset = mark.getOffset(); int startingOffset = mark.getOffset();
IASTDeclSpecifier declSpecifier = null; IASTDeclSpecifier declSpecifier = null;
@ -1360,21 +1353,21 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
break; break;
} }
last = consume(IToken.tSTAR); last = consume();
int startOffset = mark.getOffset(); int startOffset = mark.getOffset();
for (;;) { for (;;) {
IToken t = LA(1); IToken t = LA(1);
switch (LT(1)) { switch (LT(1)) {
case IToken.t_const: case IToken.t_const:
last = consume(IToken.t_const); last = consume();
isConst = true; isConst = true;
break; break;
case IToken.t_volatile: case IToken.t_volatile:
last = consume(IToken.t_volatile); last = consume();
isVolatile = true; isVolatile = true;
break; break;
case IToken.t_restrict: case IToken.t_restrict:
last = consume(IToken.t_restrict); last = consume();
isRestrict = true; isRestrict = true;
break; break;
} }
@ -1518,11 +1511,11 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
simpleType = ICASTSimpleDeclSpecifier.t_Bool; simpleType = ICASTSimpleDeclSpecifier.t_Bool;
break; break;
case IToken.t__Complex: case IToken.t__Complex:
last = consume(IToken.t__Complex); last = consume();
isComplex=true; isComplex=true;
break; break;
case IToken.t__Imaginary: case IToken.t__Imaginary:
last = consume(IToken.t__Imaginary); last = consume();
isImaginary=true; isImaginary=true;
break; break;
@ -1778,7 +1771,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
throwBacktrack(errorPoint.getOffset(), errorPoint.getLength()); throwBacktrack(errorPoint.getOffset(), errorPoint.getLength());
} }
consume(IToken.tLBRACE); consume();
IASTName name = null; IASTName name = null;
if (nameToken != null) if (nameToken != null)
@ -1941,7 +1934,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
// parameterDeclarationClause // parameterDeclarationClause
// d.setIsFunction(true); // d.setIsFunction(true);
// TODO need to create a temporary scope object here // TODO need to create a temporary scope object here
IToken last = consume(IToken.tLPAREN); IToken last = consume();
finalOffset = last.getEndOffset(); finalOffset = last.getEndOffset();
isFunction = true; isFunction = true;
boolean seenParameter = false; boolean seenParameter = false;
@ -2075,7 +2068,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
.get(arrayMods.size() - 1)); .get(arrayMods.size() - 1));
continue; continue;
case IToken.tCOLON: case IToken.tCOLON:
consume(IToken.tCOLON); consume();
bitField = constantExpression(); bitField = constantExpression();
finalOffset = calculateEndOffset(bitField); finalOffset = calculateEndOffset(bitField);
break; break;
@ -2230,7 +2223,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
while (LT(1) == IToken.tLBRACKET) { while (LT(1) == IToken.tLBRACKET) {
// eat the '[' // eat the '['
int startOffset = consume(IToken.tLBRACKET).getOffset(); int startOffset = consume().getOffset();
boolean isStatic = false; boolean isStatic = false;
boolean isConst = false; boolean isConst = false;
@ -2276,13 +2269,12 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
int lastOffset; int lastOffset;
switch (LT(1)) { switch (LT(1)) {
case IToken.tRBRACKET: case IToken.tRBRACKET:
lastOffset = consume(IToken.tRBRACKET).getEndOffset(); lastOffset = consume().getEndOffset();
break; break;
case IToken.tEOC: case IToken.tEOC:
lastOffset = Integer.MAX_VALUE; lastOffset = Integer.MAX_VALUE;
break; break;
default: default:
System.out.println("++++ 2 : " + currToken.getImage());
throw backtrack; throw backtrack;
} }
@ -2829,7 +2821,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
- ((ASTNode) new_if_statement).getOffset()); - ((ASTNode) new_if_statement).getOffset());
} }
if (LT(1) == IToken.t_else) { if (LT(1) == IToken.t_else) {
consume(IToken.t_else); consume();
if (LT(1) == IToken.t_if) { if (LT(1) == IToken.t_if) {
// an else if, don't recurse, just loop and do another 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 { protected IASTStatement parseSwitchStatement() throws EndOfFileException, BacktrackException {
int startOffset; int startOffset;
startOffset = consume(IToken.t_switch).getOffset(); startOffset = consume().getOffset();
consume(IToken.tLPAREN); consume(IToken.tLPAREN);
IASTExpression switch_condition = condition(); IASTExpression switch_condition = condition();
consume(IToken.tRPAREN); consume(IToken.tRPAREN);
@ -2939,7 +2931,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
*/ */
protected IASTStatement parseForStatement() throws EndOfFileException, BacktrackException { protected IASTStatement parseForStatement() throws EndOfFileException, BacktrackException {
int startOffset; int startOffset;
startOffset = consume(IToken.t_for).getOffset(); startOffset = consume().getOffset();
consume(IToken.tLPAREN); consume(IToken.tLPAREN);
IASTStatement init = forInitStatement(); IASTStatement init = forInitStatement();
IASTExpression for_condition = null; IASTExpression for_condition = null;
@ -2952,7 +2944,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
} }
switch (LT(1)) { switch (LT(1)) {
case IToken.tSEMI: case IToken.tSEMI:
consume(IToken.tSEMI); consume();
break; break;
case IToken.tEOC: case IToken.tEOC:
break; break;
@ -2969,7 +2961,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
} }
switch (LT(1)) { switch (LT(1)) {
case IToken.tRPAREN: case IToken.tRPAREN:
consume(IToken.tRPAREN); consume();
break; break;
case IToken.tEOC: case IToken.tEOC:
break; break;

View file

@ -232,7 +232,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
: previousLast.getOffset(); : previousLast.getOffset();
IToken last = previousLast; IToken last = previousLast;
if (LT(1) == IToken.tLT) { if (LT(1) == IToken.tLT) {
last = consume(IToken.tLT); last = consume();
// until we get all the names sorted out // until we get all the names sorted out
ScopeStack scopes = new ScopeStack(); ScopeStack scopes = new ScopeStack();
scopes.push(IToken.tLT); scopes.push(IToken.tLT);
@ -296,16 +296,13 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
IToken mark = mark(); IToken mark = mark();
try {
IASTTypeId typeId = typeId(false); IASTTypeId typeId = typeId(false);
if (typeId != null) {
list.add(typeId); list.add(typeId);
completedArg = true; completedArg = true;
} catch (BacktrackException e) { } else {
backup(mark); backup(mark);
} /* }
* catch (ASTSemanticException e) { backup(mark); }
*/
if (!completedArg) { if (!completedArg) {
try { try {
IASTExpression expression = assignmentExpression(); IASTExpression expression = assignmentExpression();
@ -354,7 +351,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
if (LT(1) == IToken.tCOLONCOLON) { if (LT(1) == IToken.tCOLONCOLON) {
argumentList.addSegment(null); argumentList.addSegment(null);
last = consume(IToken.tCOLONCOLON); last = consume();
} }
if (LT(1) == IToken.tCOMPL) if (LT(1) == IToken.tCOMPL)
@ -380,7 +377,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
} }
while (LT(1) == IToken.tCOLONCOLON) { while (LT(1) == IToken.tCOLONCOLON) {
last = consume(IToken.tCOLONCOLON); last = consume();
if (LT(1) == IToken.t_template) if (LT(1) == IToken.t_template)
consume(); consume();
@ -426,7 +423,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
BacktrackException { BacktrackException {
if (LT(1) == IToken.tLT) { if (LT(1) == IToken.tLT) {
IToken secondMark = mark(); IToken secondMark = mark();
consume(IToken.tLT); consume();
try { try {
List list = templateArgumentList(); List list = templateArgumentList();
argumentList.addSegment(list); argumentList.addSegment(list);
@ -457,24 +454,24 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
TemplateParameterManager templateArgs) throws BacktrackException, TemplateParameterManager templateArgs) throws BacktrackException,
EndOfFileException { EndOfFileException {
// we know this is an operator // we know this is an operator
IToken operatorToken = consume(IToken.t_operator); IToken operatorToken = consume();
IToken toSend = null; IToken toSend = null;
IASTTypeId typeId = null; IASTTypeId typeId = null;
if (LA(1).isOperator() || LT(1) == IToken.tLPAREN if (LA(1).isOperator() || LT(1) == IToken.tLPAREN
|| LT(1) == IToken.tLBRACKET) { || LT(1) == IToken.tLBRACKET) {
if ((LT(1) == IToken.t_new || LT(1) == IToken.t_delete) if ((LT(1) == IToken.t_new || LT(1) == IToken.t_delete)
&& LT(2) == IToken.tLBRACKET && LT(3) == IToken.tRBRACKET) { && LT(2) == IToken.tLBRACKET && LT(3) == IToken.tRBRACKET) {
consume(); consume(); // new or delete
consume(IToken.tLBRACKET); consume(); // lbracket
toSend = consume(IToken.tRBRACKET); toSend = consume(); // rbracket
// vector new and delete operators // vector new and delete operators
} else if (LT(1) == IToken.tLPAREN && LT(2) == IToken.tRPAREN) { } else if (LT(1) == IToken.tLPAREN && LT(2) == IToken.tRPAREN) {
// operator () // operator ()
consume(IToken.tLPAREN); consume(); // "("
toSend = consume(IToken.tRPAREN); toSend = consume(); // ")"
} else if (LT(1) == IToken.tLBRACKET && LT(2) == IToken.tRBRACKET) { } else if (LT(1) == IToken.tLBRACKET && LT(2) == IToken.tRBRACKET) {
consume(IToken.tLBRACKET); consume(); // "["
toSend = consume(IToken.tRBRACKET); toSend = consume(); // "]"
} else if (LA(1).isOperator()) } else if (LA(1).isOperator())
toSend = consume(); toSend = consume();
else else
@ -485,6 +482,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
// must be a conversion function // must be a conversion function
IToken t = LA(1); IToken t = LA(1);
typeId = typeId(true); typeId = typeId(true);
if (typeId == null) throw backtrack;
if (t != LA(1)) { if (t != LA(1)) {
while (t.getNext() != LA(1)) { while (t.getNext() != LA(1)) {
t = t.getNext(); t = t.getNext();
@ -543,7 +541,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
if (LT(1) == IToken.tAMPER) { if (LT(1) == IToken.tAMPER) {
int length = LA(1).getEndOffset() - LA(1).getOffset(); int length = LA(1).getEndOffset() - LA(1).getOffset();
int o = consume(IToken.tAMPER).getOffset(); int o = consume().getOffset();
ICPPASTReferenceOperator refOp = createReferenceOperator(); ICPPASTReferenceOperator refOp = createReferenceOperator();
((ASTNode) refOp).setOffsetAndLength(o, length); ((ASTNode) refOp).setOffsetAndLength(o, length);
collection.add(refOp); collection.add(refOp);
@ -571,7 +569,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
} }
} }
if (LT(1) == IToken.tSTAR) { if (LT(1) == IToken.tSTAR) {
last = consume(IToken.tSTAR); last = consume();
int starOffset = last.getOffset(); int starOffset = last.getOffset();
for (;;) { for (;;) {
@ -579,16 +577,16 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
int startingOffset = LA(1).getOffset(); int startingOffset = LA(1).getOffset();
switch (LT(1)) { switch (LT(1)) {
case IToken.t_const: case IToken.t_const:
last = consume(IToken.t_const); last = consume();
isConst = true; isConst = true;
break; break;
case IToken.t_volatile: case IToken.t_volatile:
last = consume(IToken.t_volatile); last = consume();
isVolatile = true; isVolatile = true;
break; break;
case IToken.t_restrict: case IToken.t_restrict:
if (allowCPPRestrict) { if (allowCPPRestrict) {
last = consume(IToken.t_restrict); last = consume();
isRestrict = true; isRestrict = true;
break; break;
} }
@ -744,7 +742,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
*/ */
protected IASTExpression throwExpression() throws EndOfFileException, protected IASTExpression throwExpression() throws EndOfFileException,
BacktrackException { BacktrackException {
IToken throwToken = consume(IToken.t_throw); IToken throwToken = consume();
IASTExpression throwExpression = null; IASTExpression throwExpression = null;
try { try {
throwExpression = expression(); throwExpression = expression();
@ -903,36 +901,27 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
*/ */
protected IASTExpression castExpression() throws EndOfFileException, protected IASTExpression castExpression() throws EndOfFileException,
BacktrackException { BacktrackException {
// TO DO: we need proper symbol checkint to ensure type name // TO DO: we need proper symbol checkint to ensure type name
if (LT(1) == IToken.tLPAREN) { if (LT(1) == IToken.tLPAREN) {
IToken la = LA(1); IToken la = LA(1);
int startingOffset = la.getOffset(); int startingOffset = la.getOffset();
IToken mark = mark(); IToken mark = mark();
consume(); consume();
if (templateIdScopes.size() > 0) { if (templateIdScopes.size() > 0) { templateIdScopes.push(IToken.tLPAREN); }
templateIdScopes.push(IToken.tLPAREN);
}
boolean popped = false; boolean popped = false;
boolean proper=false;
IASTTypeId typeId = null; IASTTypeId typeId = null;
IToken startCastExpression=null; IToken startCastExpression=null;
// If this isn't a type name, then we shouldn't be here // If this isn't a type name, then we shouldn't be here
try {
try {
typeId = typeId(false); typeId = typeId(false);
consume(IToken.tRPAREN); if (typeId != null && LT(1) == IToken.tRPAREN) {
proper = true; consume();
startCastExpression=mark(); startCastExpression=mark();
} catch (BacktrackException bte) {
backup(mark);
throwBacktrack(bte);
}
if (templateIdScopes.size() > 0) { if (templateIdScopes.size() > 0) {
templateIdScopes.pop(); templateIdScopes.pop();
popped = true; popped = true;
} }
try {
IASTExpression castExpression = castExpression(); IASTExpression castExpression = castExpression();
mark = null; // clean up mark so that we can garbage collect mark = null; // clean up mark so that we can garbage collect
@ -943,7 +932,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
try { try {
// try a compoundStatementExpression // try a compoundStatementExpression
backup(startCastExpression); backup(startCastExpression);
if (typeId != null && proper && LT(1) == IToken.tLPAREN) { if (LT(1) == IToken.tLPAREN) {
IASTExpression castExpression = compoundStatementExpression(); IASTExpression castExpression = compoundStatementExpression();
mark = null; // clean up mark so that we can garbage collect mark = null; // clean up mark so that we can garbage collect
return buildTypeIdUnaryExpression(IASTCastExpression.op_cast, return buildTypeIdUnaryExpression(IASTCastExpression.op_cast,
@ -951,38 +940,36 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
calculateEndOffset(castExpression)); calculateEndOffset(castExpression));
} }
} catch (BacktrackException bte2) {} } catch (BacktrackException bte2) {}
}
}
backup(mark); backup(mark);
if (templateIdScopes.size() > 0 && !popped) { if (templateIdScopes.size() > 0 && !popped) { templateIdScopes.pop(); }
templateIdScopes.pop();
}
}
} }
return unaryExpression(); return unaryExpression();
} }
/** /**
* @throws BacktrackException * @throws BacktrackException
*/ */
protected IASTTypeId typeId(boolean forNewExpression) protected IASTTypeId typeId(boolean forNewExpression) throws EndOfFileException {
throws EndOfFileException, BacktrackException {
IToken mark = mark(); IToken mark = mark();
int startingOffset = mark.getOffset(); int startingOffset = mark.getOffset();
IASTDeclSpecifier declSpecifier = null; IASTDeclSpecifier declSpecifier = null;
IASTDeclarator declarator = null; IASTDeclarator declarator = null;
try { try {
try { try {
declSpecifier = declSpecifierSeq(true, true); declSpecifier = declSpecifierSeq(true, true);
} }
catch (FoundDeclaratorException e) { catch (FoundDeclaratorException e) {
throwBacktrack( mark ); return null;
} }
if (LT(1) != IToken.tEOC) if (LT(1) != IToken.tEOC)
declarator = declarator(SimpleDeclarationStrategy.TRY_FUNCTION, declarator = declarator(SimpleDeclarationStrategy.TRY_FUNCTION,
forNewExpression); forNewExpression);
} catch (BacktrackException bt) { } catch (BacktrackException bt) {
return null;
/*
backup(mark); backup(mark);
if (declarator != null || declSpecifier != null) if (declarator != null || declSpecifier != null)
throwBacktrack(startingOffset, figureEndOffset(declSpecifier, throwBacktrack(startingOffset, figureEndOffset(declSpecifier,
@ -990,26 +977,36 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
- startingOffset); - startingOffset);
else else
throwBacktrack(startingOffset, bt.getLength()); throwBacktrack(startingOffset, bt.getLength());
*/
} }
if (declarator != null) { if (declarator != null) {
if (declarator.getName().toCharArray().length > 0) { if (declarator.getName().toCharArray().length > 0) {
return null;
/*
backup(mark); backup(mark);
throwBacktrack(startingOffset, figureEndOffset(declSpecifier, throwBacktrack(startingOffset, figureEndOffset(declSpecifier,
declarator) declarator)
- startingOffset); - startingOffset);
*/
} }
if (declSpecifier instanceof IASTSimpleDeclSpecifier if (declSpecifier instanceof IASTSimpleDeclSpecifier
&& ((ASTNode) declSpecifier).getLength() == 0) { && ((ASTNode) declSpecifier).getLength() == 0) {
return null;
/*
backup(mark); backup(mark);
throwBacktrack(startingOffset, figureEndOffset(declSpecifier, throwBacktrack(startingOffset, figureEndOffset(declSpecifier,
declarator) declarator)
- startingOffset); - startingOffset);
*/
} }
if (declarator instanceof IASTArrayDeclarator && forNewExpression) { if (declarator instanceof IASTArrayDeclarator && forNewExpression) {
return null;
/*
backup(mark); backup(mark);
throwBacktrack(startingOffset, figureEndOffset(declSpecifier, throwBacktrack(startingOffset, figureEndOffset(declSpecifier,
declarator) declarator)
- startingOffset); - startingOffset);
*/
} }
} }
@ -1027,7 +1024,6 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
declarator.setParent(result); declarator.setParent(result);
declarator.setPropertyInParent(IASTTypeId.ABSTRACT_DECLARATOR); declarator.setPropertyInParent(IASTTypeId.ABSTRACT_DECLARATOR);
} }
return result; return result;
} }
@ -1049,7 +1045,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
boolean global = false; boolean global = false;
if (LT(1) == IToken.tCOLONCOLON) { if (LT(1) == IToken.tCOLONCOLON) {
// global scope // global scope
consume(IToken.tCOLONCOLON); consume();
global = true; global = true;
} }
@ -1102,10 +1098,10 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
boolean isGlobal = false; boolean isGlobal = false;
if (LT(1) == IToken.tCOLONCOLON) { if (LT(1) == IToken.tCOLONCOLON) {
lastOffset = consume(IToken.tCOLONCOLON).getEndOffset(); lastOffset = consume().getEndOffset();
isGlobal = true; isGlobal = true;
} }
lastOffset = consume(IToken.t_new).getEndOffset(); lastOffset = consume().getEndOffset();
boolean typeIdInParen = false; boolean typeIdInParen = false;
boolean placementParseFailure = true; boolean placementParseFailure = true;
IToken beforeSecondParen = null; IToken beforeSecondParen = null;
@ -1118,7 +1114,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
master_new_loop: for (int i = 0; i < 2; ++i) { master_new_loop: for (int i = 0; i < 2; ++i) {
IToken loopMark = LA(1); IToken loopMark = LA(1);
if (LT(1) == IToken.tLPAREN) { if (LT(1) == IToken.tLPAREN) {
lastOffset = consume(IToken.tLPAREN).getEndOffset(); lastOffset = consume().getEndOffset();
if (templateIdScopes.size() > 0) { if (templateIdScopes.size() > 0) {
templateIdScopes.push(IToken.tLPAREN); templateIdScopes.push(IToken.tLPAREN);
} }
@ -1142,7 +1138,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
if (LT(1) == IToken.tLPAREN) { if (LT(1) == IToken.tLPAREN) {
beforeSecondParen = mark(); beforeSecondParen = mark();
lastOffset = consume(IToken.tLPAREN).getEndOffset(); lastOffset = consume().getEndOffset();
if (templateIdScopes.size() > 0) { if (templateIdScopes.size() > 0) {
templateIdScopes.push(IToken.tLPAREN); templateIdScopes.push(IToken.tLPAREN);
} // push 2nd Paren } // push 2nd Paren
@ -1156,6 +1152,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
// the first expression in () is not a placement // the first expression in () is not a placement
// - then it has to be typeId // - then it has to be typeId
typeId = typeId(false); typeId = typeId(false);
if (typeId == null) throw backtrack;
lastOffset = consume(IToken.tRPAREN).getEndOffset(); lastOffset = consume(IToken.tRPAREN).getEndOffset();
if (templateIdScopes.size() > 0) { if (templateIdScopes.size() > 0) {
templateIdScopes.pop(); templateIdScopes.pop();
@ -1176,12 +1173,12 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
// the first expression in () is parsed as a placement, // the first expression in () is parsed as a placement,
// and the next expression doesn't start with '(' or '[' // and the next expression doesn't start with '(' or '['
// - then it has to be typeId // - then it has to be typeId
try {
backtrackMarker = mark(); backtrackMarker = mark();
typeId = typeId(true); typeId = typeId(true);
if (typeId != null) {
lastOffset = calculateEndOffset(typeId); lastOffset = calculateEndOffset(typeId);
break master_new_loop; break master_new_loop;
} catch (BacktrackException e) { } else {
// Hmmm, so it wasn't typeId after all... Then it is // Hmmm, so it wasn't typeId after all... Then it is
// CASE: new (typeid-looking-as-placement) // CASE: new (typeid-looking-as-placement)
backup(loopMark); backup(loopMark);
@ -1195,8 +1192,14 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
// and the next expression starts with '('. // and the next expression starts with '('.
// The problem is, the first expression might as well be a // The problem is, the first expression might as well be a
// typeid // 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(); lastOffset = consume(IToken.tRPAREN).getEndOffset();
if (templateIdScopes.size() > 0) { if (templateIdScopes.size() > 0) {
templateIdScopes.pop(); templateIdScopes.pop();
@ -1248,12 +1251,12 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
}// pop that 2nd paren }// pop that 2nd paren
} }
} }
} else { } else {
// CASE: new typeid ... // CASE: new typeid ...
// new parameters do not start with '(' // new parameters do not start with '('
// i.e it has to be a plain typeId // i.e it has to be a plain typeId
typeId = typeId(true); typeId = typeId(true);
if (typeId == null) throw backtrack;
lastOffset = calculateEndOffset(typeId); lastOffset = calculateEndOffset(typeId);
isNewTypeId = true; isNewTypeId = true;
break master_new_loop; break master_new_loop;
@ -1297,7 +1300,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
} }
// newinitializer // newinitializer
if (LT(1) == IToken.tLPAREN) { if (LT(1) == IToken.tLPAREN) {
lastOffset = consume(IToken.tLPAREN).getEndOffset(); lastOffset = consume().getEndOffset();
if (templateIdScopes.size() > 0) { if (templateIdScopes.size() > 0) {
templateIdScopes.push(IToken.tLPAREN); templateIdScopes.push(IToken.tLPAREN);
} }
@ -1396,11 +1399,11 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
switch (LT(1)) { switch (LT(1)) {
case IToken.t_typename: case IToken.t_typename:
int o = consume(IToken.t_typename).getOffset(); int o = consume().getOffset();
boolean templateTokenConsumed = false; boolean templateTokenConsumed = false;
if (LT(1) == IToken.t_template) { if (LT(1) == IToken.t_template) {
consume(IToken.t_template); consume();
templateTokenConsumed = true; templateTokenConsumed = true;
} }
ITokenDuple nestedName = name(); ITokenDuple nestedName = name();
@ -1526,7 +1529,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
switch (LT(1)) { switch (LT(1)) {
case IToken.tLBRACKET: case IToken.tLBRACKET:
// array access // array access
consume(IToken.tLBRACKET); consume();
if (templateIdScopes.size() > 0) { if (templateIdScopes.size() > 0) {
templateIdScopes.push(IToken.tLBRACKET); templateIdScopes.push(IToken.tLBRACKET);
} }
@ -1560,7 +1563,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
break; break;
case IToken.tLPAREN: case IToken.tLPAREN:
// function call // function call
consume(IToken.tLPAREN); consume();
if (templateIdScopes.size() > 0) { if (templateIdScopes.size() > 0) {
templateIdScopes.push(IToken.tLPAREN); templateIdScopes.push(IToken.tLPAREN);
@ -1599,7 +1602,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
firstExpression = fce; firstExpression = fce;
break; break;
case IToken.tINCR: case IToken.tINCR:
int offset = consume(IToken.tINCR).getEndOffset(); int offset = consume().getEndOffset();
firstExpression = buildUnaryExpression( firstExpression = buildUnaryExpression(
IASTUnaryExpression.op_postFixIncr, firstExpression, IASTUnaryExpression.op_postFixIncr, firstExpression,
((ASTNode) firstExpression).getOffset(), offset); ((ASTNode) firstExpression).getOffset(), offset);
@ -1612,9 +1615,9 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
break; break;
case IToken.tDOT: case IToken.tDOT:
// member access // member access
IToken dot = consume(IToken.tDOT); IToken dot = consume();
if (LT(1) == IToken.t_template) { if (LT(1) == IToken.t_template) {
consume(IToken.t_template); consume();
isTemplate = true; isTemplate = true;
} }
@ -1643,10 +1646,10 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
break; break;
case IToken.tARROW: case IToken.tARROW:
// member access // member access
IToken arrow = consume(IToken.tARROW); IToken arrow = consume();
if (LT(1) == IToken.t_template) { if (LT(1) == IToken.t_template) {
consume(IToken.t_template); consume();
isTemplate = true; isTemplate = true;
} }
@ -1825,7 +1828,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
IASTExpression lhs = expression(); IASTExpression lhs = expression();
int finalOffset = Integer.MAX_VALUE; int finalOffset = Integer.MAX_VALUE;
if (LT(1) == IToken.tRPAREN) if (LT(1) == IToken.tRPAREN)
finalOffset = consume(IToken.tRPAREN).getEndOffset(); finalOffset = consume().getEndOffset();
if (templateIdScopes.size() > 0) { if (templateIdScopes.size() > 0) {
templateIdScopes.pop(); templateIdScopes.pop();
} }
@ -1910,6 +1913,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
IToken op = consume(); IToken op = consume();
consume(IToken.tLT); consume(IToken.tLT);
IASTTypeId typeID = typeId(false); IASTTypeId typeID = typeId(false);
if (typeID == null) { throw backtrack; }
consume(IToken.tGT); consume(IToken.tGT);
consume(IToken.tLPAREN); consume(IToken.tLPAREN);
IASTExpression lhs = expression(); IASTExpression lhs = expression();
@ -1995,11 +1999,11 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
*/ */
protected IASTDeclaration usingClause() throws EndOfFileException, protected IASTDeclaration usingClause() throws EndOfFileException,
BacktrackException { BacktrackException {
IToken firstToken = consume(IToken.t_using); IToken firstToken = consume();
if (LT(1) == IToken.t_namespace) { if (LT(1) == IToken.t_namespace) {
// using-directive // using-directive
int endOffset = consume(IToken.t_namespace).getEndOffset(); int endOffset = consume().getEndOffset();
IASTName name = null; IASTName name = null;
switch (LT(1)) { switch (LT(1)) {
case IToken.tIDENTIFIER: case IToken.tIDENTIFIER:
@ -2034,7 +2038,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
if (LT(1) == IToken.t_typename) { if (LT(1) == IToken.t_typename) {
typeName = true; typeName = true;
consume(IToken.t_typename); consume();
} }
IASTName name = createName(name()); IASTName name = createName(name());
@ -2086,14 +2090,14 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
*/ */
protected ICPPASTLinkageSpecification linkageSpecification() protected ICPPASTLinkageSpecification linkageSpecification()
throws EndOfFileException, BacktrackException { throws EndOfFileException, BacktrackException {
IToken firstToken = consume(IToken.t_extern); IToken firstToken = consume(); // t_extern
IToken spec = consume(IToken.tSTRING); IToken spec = consume(); // tString
ICPPASTLinkageSpecification linkage = createLinkageSpecification(); ICPPASTLinkageSpecification linkage = createLinkageSpecification();
((ASTNode) linkage).setOffset(firstToken.getOffset()); ((ASTNode) linkage).setOffset(firstToken.getOffset());
linkage.setLiteral(spec.getImage()); linkage.setLiteral(spec.getImage());
if (LT(1) == IToken.tLBRACE) { if (LT(1) == IToken.tLBRACE) {
consume(IToken.tLBRACE); consume();
linkageDeclarationLoop: while (LT(1) != IToken.tRBRACE) { linkageDeclarationLoop: while (LT(1) != IToken.tRBRACE) {
int checkToken = LA(1).hashCode(); int checkToken = LA(1).hashCode();
@ -2173,7 +2177,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
++templateCount; ++templateCount;
if (LT(1) == IToken.t_export) { if (LT(1) == IToken.t_export) {
exported = true; exported = true;
firstToken = consume(IToken.t_export); firstToken = consume();
consume(IToken.t_template); consume(IToken.t_template);
} else { } else {
if (supportExtendedTemplateSyntax) { if (supportExtendedTemplateSyntax) {
@ -2228,10 +2232,10 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
} }
return templateInstantiation; return templateInstantiation;
} }
consume(IToken.tLT); consume(); // check for LT made before
if (LT(1) == IToken.tGT) { if (LT(1) == IToken.tGT) {
// explicit-specialization // explicit-specialization
consume(IToken.tGT); consume();
ICPPASTTemplateSpecialization templateSpecialization = createTemplateSpecialization(); ICPPASTTemplateSpecialization templateSpecialization = createTemplateSpecialization();
try { try {
@ -2353,8 +2357,9 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
lastOffset = calculateEndOffset(identifierName); lastOffset = calculateEndOffset(identifierName);
if (LT(1) == IToken.tASSIGN) // optional = type-id if (LT(1) == IToken.tASSIGN) // optional = type-id
{ {
consume(IToken.tASSIGN); consume();
typeId = typeId(false); // type-id typeId = typeId(false); // type-id
if (typeId == null) throw backtrack;
lastOffset = calculateEndOffset(typeId); lastOffset = calculateEndOffset(typeId);
} }
} else { } else {
@ -2378,7 +2383,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
returnValue.add(parm); returnValue.add(parm);
} else if (LT(1) == IToken.t_template) { } else if (LT(1) == IToken.t_template) {
IToken firstToken = consume(IToken.t_template); IToken firstToken = consume();
consume(IToken.tLT); consume(IToken.tLT);
List subResult = templateParameterList(); List subResult = templateParameterList();
@ -2393,7 +2398,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
last = calculateEndOffset(identifierName); last = calculateEndOffset(identifierName);
if (LT(1) == IToken.tASSIGN) // optional = type-id if (LT(1) == IToken.tASSIGN) // optional = type-id
{ {
consume(IToken.tASSIGN); consume();
optionalExpression = primaryExpression(); optionalExpression = primaryExpression();
last = calculateEndOffset(optionalExpression); last = calculateEndOffset(optionalExpression);
} }
@ -2425,7 +2430,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
returnValue.add(parm); returnValue.add(parm);
} else if (LT(1) == IToken.tCOMMA) { } else if (LT(1) == IToken.tCOMMA) {
consume(IToken.tCOMMA); consume();
continue; continue;
} else { } else {
ICPPASTParameterDeclaration parm = parameterDeclaration(); ICPPASTParameterDeclaration parm = parameterDeclaration();
@ -2603,7 +2608,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
protected IASTDeclaration namespaceDefinitionOrAlias() protected IASTDeclaration namespaceDefinitionOrAlias()
throws BacktrackException, EndOfFileException { throws BacktrackException, EndOfFileException {
IToken first = consume(IToken.t_namespace); IToken first = consume();
int last = first.getEndOffset(); int last = first.getEndOffset();
IASTName name = null; IASTName name = null;
// optional name // optional name
@ -2660,7 +2665,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
- first.getOffset()); - first.getOffset());
return namespaceDefinition; return namespaceDefinition;
} else if (LT(1) == IToken.tASSIGN) { } else if (LT(1) == IToken.tASSIGN) {
IToken assign = consume(IToken.tASSIGN); IToken assign = consume();
if (name.toString() == null) { if (name.toString() == null) {
throwBacktrack(first.getOffset(), assign.getEndOffset() throwBacktrack(first.getOffset(), assign.getEndOffset()
@ -2888,7 +2893,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
.append(IASTDeclarator.class, declarators, .append(IASTDeclarator.class, declarators,
initDeclarator(strategy)); initDeclarator(strategy));
while (LT(1) == IToken.tCOMMA) { while (LT(1) == IToken.tCOMMA) {
consume(IToken.tCOMMA); consume();
declarators = (IASTDeclarator[]) ArrayUtil.append( declarators = (IASTDeclarator[]) ArrayUtil.append(
IASTDeclarator.class, declarators, IASTDeclarator.class, declarators,
initDeclarator(strategy)); initDeclarator(strategy));
@ -2908,11 +2913,11 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
case IToken.tSEMI: case IToken.tSEMI:
if( fromCatchHandler ) if( fromCatchHandler )
break; break;
semiOffset = consume(IToken.tSEMI).getEndOffset(); semiOffset = consume().getEndOffset();
consumedSemi = true; consumedSemi = true;
break; break;
case IToken.t_try: case IToken.t_try:
consume(IToken.t_try); consume();
if (LT(1) == IToken.tCOLON) { if (LT(1) == IToken.tCOLON) {
constructorChain = new ArrayList( constructorChain = new ArrayList(
DEFAULT_CONSTRUCTOR_CHAIN_LIST_SIZE); DEFAULT_CONSTRUCTOR_CHAIN_LIST_SIZE);
@ -3070,7 +3075,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
*/ */
protected void ctorInitializer(List collection) throws EndOfFileException, protected void ctorInitializer(List collection) throws EndOfFileException,
BacktrackException { BacktrackException {
consume(IToken.tCOLON); consume();
ctorLoop: for (;;) { ctorLoop: for (;;) {
ITokenDuple duple = name(); ITokenDuple duple = name();
IASTName name = createName(duple); IASTName name = createName(duple);
@ -3079,7 +3084,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
IASTExpression expressionList = null; IASTExpression expressionList = null;
switch (LT(1)) { switch (LT(1)) {
case IToken.tLPAREN: case IToken.tLPAREN:
consume(IToken.tLPAREN); consume();
if (LT(1) != IToken.tRPAREN) if (LT(1) != IToken.tRPAREN)
expressionList = expression(); expressionList = expression();
@ -3118,7 +3123,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
switch (LT(1)) { switch (LT(1)) {
case IToken.tCOMMA: case IToken.tCOMMA:
consume(IToken.tCOMMA); consume();
break; break;
case IToken.tLBRACE: case IToken.tLBRACE:
case IToken.tEOC: case IToken.tEOC:
@ -3320,7 +3325,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
throwBacktrack(la.getOffset(), la.getEndOffset() throwBacktrack(la.getOffset(), la.getEndOffset()
- la.getOffset()); - la.getOffset());
} }
last = consume(IToken.t__Complex); last = consume();
isComplex=true; isComplex=true;
break; break;
case IToken.t__Imaginary: case IToken.t__Imaginary:
@ -3328,7 +3333,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
IToken la = LA(1); IToken la = LA(1);
throwBacktrack(la.getOffset(), la.getLength()); throwBacktrack(la.getOffset(), la.getLength());
} }
last = consume(IToken.t__Imaginary); last = consume();
isImaginary=true; isImaginary=true;
break; break;
case IToken.t_char: case IToken.t_char:
@ -3368,7 +3373,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
break; break;
case IToken.t_typename: case IToken.t_typename:
isTypename = true; isTypename = true;
last = consume(IToken.t_typename); last = consume();
duple = name(); duple = name();
last = duple.getLastToken(); last = duple.getLastToken();
flags.setEncounteredTypename(true); flags.setEncounteredTypename(true);
@ -3700,7 +3705,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
// handle initializer // handle initializer
if (LT(1) == IToken.tASSIGN) { if (LT(1) == IToken.tASSIGN) {
consume(IToken.tASSIGN); consume();
try { try {
return initializerClause(); return initializerClause();
} catch (EndOfFileException eof) { } catch (EndOfFileException eof) {
@ -3717,7 +3722,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
return null; return null;
} }
// initializer in constructor // initializer in constructor
IToken t = consume(IToken.tLPAREN); // EAT IT! IToken t = consume(); // EAT IT!
int o = t.getOffset(); int o = t.getOffset();
IASTExpression astExpression = expression(); IASTExpression astExpression = expression();
if( astExpression == null ) if( astExpression == null )
@ -3747,13 +3752,13 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
protected IASTInitializer initializerClause() throws EndOfFileException, protected IASTInitializer initializerClause() throws EndOfFileException,
BacktrackException { BacktrackException {
if (LT(1) == IToken.tLBRACE) { if (LT(1) == IToken.tLBRACE) {
int startingOffset = consume(IToken.tLBRACE).getOffset(); int startingOffset = consume().getOffset();
IASTInitializerList result = createInitializerList(); IASTInitializerList result = createInitializerList();
((ASTNode) result).setOffset(startingOffset); ((ASTNode) result).setOffset(startingOffset);
if (LT(1) == (IToken.tRBRACE)) { if (LT(1) == (IToken.tRBRACE)) {
int l = consume(IToken.tRBRACE).getEndOffset(); int l = consume().getEndOffset();
((ASTNode) result).setLength(l - startingOffset); ((ASTNode) result).setLength(l - startingOffset);
return result; return result;
} }
@ -3775,7 +3780,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
break; break;
consume(IToken.tCOMMA); consume(IToken.tCOMMA);
} }
int l = consume(IToken.tRBRACE).getEndOffset(); int l = consume().getEndOffset(); // tRBRACE
((ASTNode) result).setLength(l - startingOffset); ((ASTNode) result).setLength(l - startingOffset);
return result; return result;
} }
@ -3885,7 +3890,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
boolean success = false; boolean success = false;
try try
{ {
consume( IToken.tLPAREN ); consume(); // tLPAREN
expression(); expression();
consume( IToken.tRPAREN ); consume( IToken.tRPAREN );
success = true; success = true;
@ -3988,7 +3993,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
if (LT(1) == IToken.t_throw) { if (LT(1) == IToken.t_throw) {
exceptionSpecIds = new ArrayList( exceptionSpecIds = new ArrayList(
DEFAULT_SIZE_EXCEPTIONS_LIST); DEFAULT_SIZE_EXCEPTIONS_LIST);
consume(IToken.t_throw); // throw consume(); // throw
consume(IToken.tLPAREN); // ( consume(IToken.tLPAREN); // (
boolean done = false; boolean done = false;
while (!done) { while (!done) {
@ -4002,17 +4007,18 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
break; break;
default: default:
IToken before = LA(1); IToken before = LA(1);
try { IASTTypeId typeId = typeId(false);
exceptionSpecIds.add(typeId(false)); if (typeId != null) {
} catch (BacktrackException e) { exceptionSpecIds.add(typeId);
IASTProblem p = failParse(e); } else {
IASTProblem p = createProblem(IASTProblem.SYNTAX_ERROR,
before.getOffset(), before.getLength());
IASTProblemTypeId typeIdProblem = createTypeIDProblem(); IASTProblemTypeId typeIdProblem = createTypeIDProblem();
typeIdProblem.setProblem(p); typeIdProblem.setProblem(p);
((CPPASTNode) typeIdProblem) ((CPPASTNode) typeIdProblem)
.setOffsetAndLength(((CPPASTNode) p)); .setOffsetAndLength(((CPPASTNode) p));
p.setParent(typeIdProblem); p.setParent(typeIdProblem);
p p.setPropertyInParent(IASTProblemHolder.PROBLEM);
.setPropertyInParent(IASTProblemHolder.PROBLEM);
exceptionSpecIds.add(typeIdProblem); exceptionSpecIds.add(typeIdProblem);
if (before == LA(1)) if (before == LA(1))
done = true; done = true;
@ -4025,9 +4031,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
if (LT(1) == IToken.tASSIGN && LT(2) == IToken.tINTEGER) { if (LT(1) == IToken.tASSIGN && LT(2) == IToken.tINTEGER) {
char[] image = LA(2).getCharImage(); char[] image = LA(2).getCharImage();
if (image.length == 1 && image[0] == '0') { if (image.length == 1 && image[0] == '0') {
consume(IToken.tASSIGN); consume(); // tASSIGN
finalOffset = consume(IToken.tINTEGER) finalOffset = consume().getEndOffset(); // tINTEGER
.getEndOffset();
isPureVirtual = true; isPureVirtual = true;
} }
} }
@ -4060,7 +4065,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
.get(arrayMods.size() - 1)); .get(arrayMods.size() - 1));
continue; continue;
case IToken.tCOLON: case IToken.tCOLON:
consume(IToken.tCOLON); consume();
bitField = constantExpression(); bitField = constantExpression();
finalOffset = calculateEndOffset(bitField); finalOffset = calculateEndOffset(bitField);
break; break;
@ -4305,7 +4310,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
} }
if (LT(1) == IToken.tLBRACE) { if (LT(1) == IToken.tLBRACE) {
consume(IToken.tLBRACE); consume();
memberDeclarationLoop: while (true) { memberDeclarationLoop: while (true) {
int checkToken = LA(1).hashCode(); int checkToken = LA(1).hashCode();
@ -4326,7 +4331,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
break; break;
} }
case IToken.tRBRACE: { case IToken.tRBRACE: {
int l = consume(IToken.tRBRACE).getEndOffset(); int l = consume().getEndOffset();
((ASTNode) astClassSpecifier).setLength(l ((ASTNode) astClassSpecifier).setLength(l
- classKey.getOffset()); - classKey.getOffset());
break memberDeclarationLoop; break memberDeclarationLoop;
@ -4409,7 +4414,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
protected void baseSpecifier(ICPPASTCompositeTypeSpecifier astClassSpec) protected void baseSpecifier(ICPPASTCompositeTypeSpecifier astClassSpec)
throws EndOfFileException, BacktrackException { throws EndOfFileException, BacktrackException {
IToken last = consume(IToken.tCOLON); IToken last = consume(); // tCOLON
boolean isVirtual = false; boolean isVirtual = false;
int visibility = 0; // ASTAccessVisibility.PUBLIC; int visibility = 0; // ASTAccessVisibility.PUBLIC;
@ -4419,10 +4424,10 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
switch (LT(1)) { switch (LT(1)) {
case IToken.t_virtual: case IToken.t_virtual:
if (firstToken == null) { if (firstToken == null) {
firstToken = consume(IToken.t_virtual); firstToken = consume();
last = firstToken; last = firstToken;
} else } else
last = consume(IToken.t_virtual); last = consume();
isVirtual = true; isVirtual = true;
break; break;
case IToken.t_public: case IToken.t_public:
@ -4532,7 +4537,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
int nextToken = LT(1); int nextToken = LT(1);
while (nextToken == IToken.t_catch) { while (nextToken == IToken.t_catch) {
int startOffset = consume(IToken.t_catch).getOffset(); int startOffset = consume().getOffset();
consume(IToken.tLPAREN); consume(IToken.tLPAREN);
boolean isEllipsis = false; boolean isEllipsis = false;
IASTDeclaration decl = null; IASTDeclaration decl = null;
@ -4726,7 +4731,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
protected void consumeArrayModifiers(List collection) protected void consumeArrayModifiers(List collection)
throws EndOfFileException, BacktrackException { throws EndOfFileException, BacktrackException {
while (LT(1) == IToken.tLBRACKET) { while (LT(1) == IToken.tLBRACKET) {
int o = consume(IToken.tLBRACKET).getOffset(); // eat the '[' int o = consume().getOffset(); // eat the '['
IASTExpression exp = null; IASTExpression exp = null;
if (LT(1) != IToken.tRBRACKET && LT(1) != IToken.tEOC) { if (LT(1) != IToken.tRBRACKET && LT(1) != IToken.tEOC) {
@ -5075,7 +5080,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
*/ */
protected IASTStatement parseTryStatement() throws EndOfFileException, protected IASTStatement parseTryStatement() throws EndOfFileException,
BacktrackException { BacktrackException {
int startO = consume(IToken.t_try).getOffset(); int startO = consume().getOffset();
IASTStatement tryBlock = compoundStatement(); IASTStatement tryBlock = compoundStatement();
List catchHandlers = new ArrayList(DEFAULT_CATCH_HANDLER_LIST_SIZE); List catchHandlers = new ArrayList(DEFAULT_CATCH_HANDLER_LIST_SIZE);
catchHandlerSequence(catchHandlers); catchHandlerSequence(catchHandlers);
@ -5152,7 +5157,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
*/ */
protected IASTStatement parseWhileStatement() throws EndOfFileException, protected IASTStatement parseWhileStatement() throws EndOfFileException,
BacktrackException { BacktrackException {
int startOffset = consume(IToken.t_while).getOffset(); int startOffset = consume().getOffset();
consume(IToken.tLPAREN); consume(IToken.tLPAREN);
IASTNode while_condition = cppStyleCondition(true); IASTNode while_condition = cppStyleCondition(true);
consume(IToken.tRPAREN); consume(IToken.tRPAREN);
@ -5316,7 +5321,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
- ((ASTNode) new_if_statement).getOffset()); - ((ASTNode) new_if_statement).getOffset());
} }
if (LT(1) == IToken.t_else) { if (LT(1) == IToken.t_else) {
consume(IToken.t_else); consume();
if (LT(1) == IToken.t_if) { if (LT(1) == IToken.t_if) {
// an else if, don't recurse, just loop and do another 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 { protected IASTStatement parseSwitchStatement() throws EndOfFileException, BacktrackException {
int startOffset; int startOffset;
startOffset = consume(IToken.t_switch).getOffset(); startOffset = consume().getOffset();
consume(IToken.tLPAREN); consume(IToken.tLPAREN);
IASTNode switch_condition = cppStyleCondition(true); IASTNode switch_condition = cppStyleCondition(true);
consume(IToken.tRPAREN); consume(IToken.tRPAREN);
@ -5460,7 +5465,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
*/ */
protected IASTStatement parseForStatement() throws EndOfFileException, BacktrackException { protected IASTStatement parseForStatement() throws EndOfFileException, BacktrackException {
int startOffset; int startOffset;
startOffset = consume(IToken.t_for).getOffset(); startOffset = consume().getOffset();
consume(IToken.tLPAREN); consume(IToken.tLPAREN);
IASTStatement init = forInitStatement(); IASTStatement init = forInitStatement();
IASTNode for_condition = null; IASTNode for_condition = null;
@ -5473,7 +5478,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
} }
switch (LT(1)) { switch (LT(1)) {
case IToken.tSEMI: case IToken.tSEMI:
consume(IToken.tSEMI); consume();
break; break;
case IToken.tEOC: case IToken.tEOC:
break; break;
@ -5490,7 +5495,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
} }
switch (LT(1)) { switch (LT(1)) {
case IToken.tRPAREN: case IToken.tRPAREN:
consume(IToken.tRPAREN); consume();
break; break;
case IToken.tEOC: case IToken.tEOC:
break; break;