1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-21 07:55:24 +02:00

Patch for Oleg Krasilnikov (oleg.krasilnikov@intel.com).

Bug 117701 - Backtrack exceptions in GNU parsers
This commit is contained in:
John Camelon 2005-12-02 21:18:22 +00:00
parent 2b2f1eaba6
commit 3a28f498db
2 changed files with 95 additions and 53 deletions

View file

@ -213,11 +213,13 @@ 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;
} }
@ -944,16 +946,24 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
IToken m = mark(); IToken m = mark();
int lastOffset = 0; int lastOffset = 0;
if (LT(1) == IToken.tLPAREN) { if (LT(1) == IToken.tLPAREN) {
boolean needBack = false;
try { try {
consume(IToken.tLPAREN); consume(IToken.tLPAREN);
d = typeId(false); d = typeId(false);
lastOffset = consume(IToken.tRPAREN).getEndOffset(); if (d == null)
needBack = true;
else
lastOffset = consume(IToken.tRPAREN).getEndOffset();
} catch (BacktrackException bt) { } catch (BacktrackException bt) {
backup(m); needBack = true;
d = null;
unaryExpression = unaryExpression();
lastOffset = calculateEndOffset(unaryExpression);
} }
if (needBack) {
backup(m);
d = null;
unaryExpression = unaryExpression();
lastOffset = calculateEndOffset(unaryExpression);
}
} else { } else {
unaryExpression = unaryExpression(); unaryExpression = unaryExpression();
lastOffset = calculateEndOffset(unaryExpression); lastOffset = calculateEndOffset(unaryExpression);
@ -979,17 +989,25 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
if (LT(2) == IToken.tLBRACE) { if (LT(2) == IToken.tLBRACE) {
unaryExpression = compoundStatementExpression(); unaryExpression = compoundStatementExpression();
lastOffset = calculateEndOffset(unaryExpression); lastOffset = calculateEndOffset(unaryExpression);
} else } else {
boolean needBack = false;
try { try {
consume(IToken.tLPAREN); consume(IToken.tLPAREN);
d = typeId(false); d = typeId(false);
lastOffset = consume(IToken.tRPAREN).getEndOffset(); if (d == null)
needBack = true;
else
lastOffset = consume(IToken.tRPAREN).getEndOffset();
} catch (BacktrackException bt) { } catch (BacktrackException bt) {
needBack = true;
}
if (needBack) {
backup(m); backup(m);
d = null; d = null;
unaryExpression = unaryExpression(); unaryExpression = unaryExpression();
lastOffset = calculateEndOffset(unaryExpression); lastOffset = calculateEndOffset(unaryExpression);
} }
}
} else { } else {
unaryExpression = unaryExpression(); unaryExpression = unaryExpression();
lastOffset = calculateEndOffset(unaryExpression); lastOffset = calculateEndOffset(unaryExpression);
@ -2050,20 +2068,22 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser {
if (typeIdWithParentheses) if (typeIdWithParentheses)
consume(IToken.tLPAREN); consume(IToken.tLPAREN);
typeId = typeId(false); typeId = typeId(false);
if (typeIdWithParentheses) { if (typeId != null)
switch (LT(1)) { {
case IToken.tRPAREN: if (typeIdWithParentheses) {
case IToken.tEOC: switch (LT(1)) {
consume(); case IToken.tRPAREN:
break; case IToken.tEOC:
default: consume();
throw backtrack; break;
} default:
typeId = null;
}
}
if (typeId != null) typeIdLA = LA(1);
} }
typeIdLA = LA(1); } catch (BacktrackException e) {
} catch (BacktrackException bte) { typeId = null;
typeId = null;
} }
backup(mark); backup(mark);
try { try {

View file

@ -820,22 +820,29 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
boolean proper=false; boolean proper=false;
IToken startCastExpression=null; IToken startCastExpression=null;
// If this isn't a type name, then we shouldn't be here // If this isn't a type name, then we shouldn't be here
boolean needBack = false;
try { try {
try { try {
typeId = typeId(false); typeId = typeId(false);
switch (LT(1)) { if (typeId != null) {
case IToken.tRPAREN: switch (LT(1)) {
consume(); case IToken.tRPAREN:
proper=true; consume();
startCastExpression=mark(); proper=true;
castExpression = castExpression(); startCastExpression=mark();
break; castExpression = castExpression();
case IToken.tEOC: break;
break; case IToken.tEOC:
default: break;
throw backtrack; default:
} needBack = true;
// throw backtrack;
}
} else {needBack = true;}
} catch (BacktrackException bte) { } catch (BacktrackException bte) {
needBack = true;
}
if (needBack) {
try { try {
// try a compoundStatementExpression // try a compoundStatementExpression
backup(startCastExpression); backup(startCastExpression);
@ -849,7 +856,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
} catch (BacktrackException bte2) {} } catch (BacktrackException bte2) {}
backup(mark); backup(mark);
throwBacktrack(bte); return unaryExpression();
// throwBacktrack(bte);
} }
return buildTypeIdUnaryExpression(IASTCastExpression.op_cast, return buildTypeIdUnaryExpression(IASTCastExpression.op_cast,
@ -892,18 +900,25 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
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;
try { try {
consume(IToken.tLPAREN); consume(IToken.tLPAREN);
typeId = typeId(false); typeId = typeId(false);
switch (LT(1)) { if (typeId != null) {
case IToken.tRPAREN: switch (LT(1)) {
case IToken.tEOC: case IToken.tRPAREN:
lastOffset = consume().getEndOffset(); case IToken.tEOC:
break; lastOffset = consume().getEndOffset();
default: break;
throw backtrack; default:
} needBack = true;
// throw backtrack;
}
} else {needBack = true; }
} catch (BacktrackException bt) { } catch (BacktrackException bt) {
needBack = true;
}
if (needBack) {
backup(mark); backup(mark);
typeId = null; typeId = null;
unaryExpression = unaryExpression(); unaryExpression = unaryExpression();
@ -977,11 +992,13 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
try { try {
int offset = consume(IToken.tLPAREN).getOffset(); int offset = consume(IToken.tLPAREN).getOffset();
IASTTypeId t = typeId(false); IASTTypeId t = typeId(false);
consume(IToken.tRPAREN).getEndOffset(); if (t != null) {
IASTInitializer i = cInitializerClause(Collections.EMPTY_LIST); consume(IToken.tRPAREN).getEndOffset();
firstExpression = buildTypeIdInitializerExpression(t, i, IASTInitializer i = cInitializerClause(Collections.EMPTY_LIST);
offset, calculateEndOffset(i)); firstExpression = buildTypeIdInitializerExpression(t, i,
break; offset, calculateEndOffset(i));
break;
} else {backup(m); }
} catch (BacktrackException bt) { } catch (BacktrackException bt) {
backup(m); backup(m);
} }
@ -1273,19 +1290,23 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
{ {
declSpecifier = declSpecifierSeq(false, true); declSpecifier = declSpecifierSeq(false, true);
} catch (FoundDeclaratorException e) { } catch (FoundDeclaratorException e) {
throwBacktrack( e.currToken ); return null;
// backup(mark);
// throwBacktrack( e.currToken );
} }
declarator = declarator(); declarator = declarator();
} catch (BacktrackException bt) { } catch (BacktrackException bt) {
backup(mark); return null;
throwBacktrack(bt); // backup(mark);
// throwBacktrack(bt);
} }
if (declarator == null || declarator.getName().toCharArray().length > 0) //$NON-NLS-1$ if (declarator == null || declarator.getName().toCharArray().length > 0) //$NON-NLS-1$
{ {
backup(mark); return null;
throwBacktrack(startingOffset, figureEndOffset(declSpecifier, // backup(mark);
declarator) // throwBacktrack(startingOffset, figureEndOffset(declSpecifier,
- startingOffset); // declarator)
// - startingOffset);
} }
IASTTypeId result = createTypeId(); IASTTypeId result = createTypeId();
@ -2261,6 +2282,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
lastOffset = Integer.MAX_VALUE; lastOffset = Integer.MAX_VALUE;
break; break;
default: default:
System.out.println("++++ 2 : " + currToken.getImage());
throw backtrack; throw backtrack;
} }