1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 22:52:11 +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
* 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:

View file

@ -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;

View file

@ -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;