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:
parent
2b2f1eaba6
commit
3a28f498db
2 changed files with 95 additions and 53 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue