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:
parent
2f616a8c07
commit
c69e46df85
3 changed files with 241 additions and 246 deletions
|
@ -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:
|
||||||
|
|
|
@ -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,30 +893,25 @@ 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)) {
|
case IToken.tRPAREN:
|
||||||
case IToken.tRPAREN:
|
case IToken.tEOC:
|
||||||
case IToken.tEOC:
|
lastOffset = consume().getEndOffset();
|
||||||
lastOffset = consume().getEndOffset();
|
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;
|
||||||
|
|
|
@ -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();
|
||||||
|
@ -902,87 +900,76 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
* castExpression : unaryExpression | "(" typeId ")" castExpression
|
* castExpression : unaryExpression | "(" typeId ")" castExpression
|
||||||
*/
|
*/
|
||||||
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 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
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) {
|
if (templateIdScopes.size() > 0) {
|
||||||
templateIdScopes.pop();
|
templateIdScopes.pop();
|
||||||
popped = true;
|
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 {
|
||||||
// try a compoundStatementExpression
|
IASTExpression castExpression = castExpression();
|
||||||
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);
|
mark = null; // clean up mark so that we can garbage collect
|
||||||
if (templateIdScopes.size() > 0 && !popped) {
|
return buildTypeIdUnaryExpression(IASTCastExpression.op_cast,
|
||||||
templateIdScopes.pop();
|
typeId, castExpression, startingOffset,
|
||||||
|
calculateEndOffset(castExpression));
|
||||||
|
} catch (BacktrackException b) {
|
||||||
|
try {
|
||||||
|
// try a compoundStatementExpression
|
||||||
|
backup(startCastExpression);
|
||||||
|
if (LT(1) == IToken.tLPAREN) {
|
||||||
|
IASTExpression castExpression = compoundStatementExpression();
|
||||||
|
mark = null; // clean up mark so that we can garbage collect
|
||||||
|
return buildTypeIdUnaryExpression(IASTCastExpression.op_cast,
|
||||||
|
typeId, castExpression, startingOffset,
|
||||||
|
calculateEndOffset(castExpression));
|
||||||
|
}
|
||||||
|
} catch (BacktrackException bte2) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
backup(mark);
|
||||||
return unaryExpression();
|
if (templateIdScopes.size() > 0 && !popped) { templateIdScopes.pop(); }
|
||||||
|
}
|
||||||
|
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 {
|
||||||
IASTProblemTypeId typeIdProblem = createTypeIDProblem();
|
IASTProblem p = createProblem(IASTProblem.SYNTAX_ERROR,
|
||||||
|
before.getOffset(), before.getLength());
|
||||||
|
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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue