diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java index 6e4721d1579..9fde00ab398 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java @@ -213,11 +213,13 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { * @throws BacktrackException * If LT(1) != type */ + // static int cnt = 0; protected IToken consume(int type) throws EndOfFileException, BacktrackException { if (LT(1) == type) return consume(); IToken la = LA(1); + // System.out.println("from Consume !" + cnt++); throwBacktrack(la.getOffset(), la.getLength()); return null; } @@ -944,16 +946,24 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { IToken m = mark(); int lastOffset = 0; if (LT(1) == IToken.tLPAREN) { + boolean needBack = false; try { consume(IToken.tLPAREN); d = typeId(false); - lastOffset = consume(IToken.tRPAREN).getEndOffset(); + if (d == null) + needBack = true; + else + lastOffset = consume(IToken.tRPAREN).getEndOffset(); } catch (BacktrackException bt) { - backup(m); - d = null; - unaryExpression = unaryExpression(); - lastOffset = calculateEndOffset(unaryExpression); + needBack = true; } + if (needBack) { + backup(m); + d = null; + unaryExpression = unaryExpression(); + lastOffset = calculateEndOffset(unaryExpression); + } + } else { unaryExpression = unaryExpression(); lastOffset = calculateEndOffset(unaryExpression); @@ -979,17 +989,25 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { if (LT(2) == IToken.tLBRACE) { unaryExpression = compoundStatementExpression(); lastOffset = calculateEndOffset(unaryExpression); - } else + } else { + boolean needBack = false; try { consume(IToken.tLPAREN); d = typeId(false); - lastOffset = consume(IToken.tRPAREN).getEndOffset(); + if (d == null) + needBack = true; + else + lastOffset = consume(IToken.tRPAREN).getEndOffset(); } catch (BacktrackException bt) { + needBack = true; + } + if (needBack) { backup(m); d = null; unaryExpression = unaryExpression(); lastOffset = calculateEndOffset(unaryExpression); } + } } else { unaryExpression = unaryExpression(); lastOffset = calculateEndOffset(unaryExpression); @@ -2050,20 +2068,22 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { if (typeIdWithParentheses) consume(IToken.tLPAREN); typeId = typeId(false); - if (typeIdWithParentheses) { - switch (LT(1)) { - case IToken.tRPAREN: - case IToken.tEOC: - consume(); - break; - default: - throw backtrack; - } - + if (typeId != null) + { + if (typeIdWithParentheses) { + switch (LT(1)) { + case IToken.tRPAREN: + case IToken.tEOC: + consume(); + break; + default: + typeId = null; + } + } + if (typeId != null) typeIdLA = LA(1); } - typeIdLA = LA(1); - } catch (BacktrackException bte) { - typeId = null; + } catch (BacktrackException e) { + typeId = null; } backup(mark); try { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java index 2bd3d5af449..338d742f85b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java @@ -820,22 +820,29 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { boolean proper=false; IToken startCastExpression=null; // If this isn't a type name, then we shouldn't be here + boolean needBack = false; try { try { typeId = typeId(false); - switch (LT(1)) { - case IToken.tRPAREN: - consume(); - proper=true; - startCastExpression=mark(); - castExpression = castExpression(); - break; - case IToken.tEOC: - break; - default: - throw backtrack; - } + if (typeId != null) { + switch (LT(1)) { + case IToken.tRPAREN: + consume(); + proper=true; + startCastExpression=mark(); + castExpression = castExpression(); + break; + case IToken.tEOC: + break; + default: + needBack = true; +// throw backtrack; + } + } else {needBack = true;} } catch (BacktrackException bte) { + needBack = true; + } + if (needBack) { try { // try a compoundStatementExpression backup(startCastExpression); @@ -849,7 +856,8 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { } catch (BacktrackException bte2) {} backup(mark); - throwBacktrack(bte); + return unaryExpression(); +// throwBacktrack(bte); } return buildTypeIdUnaryExpression(IASTCastExpression.op_cast, @@ -892,18 +900,25 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { IASTTypeId typeId = null; int lastOffset = 0; if (LT(1) == IToken.tLPAREN) { + boolean needBack = false; try { consume(IToken.tLPAREN); typeId = typeId(false); - switch (LT(1)) { - case IToken.tRPAREN: - case IToken.tEOC: - lastOffset = consume().getEndOffset(); - break; - default: - throw backtrack; - } + if (typeId != null) { + switch (LT(1)) { + case IToken.tRPAREN: + case IToken.tEOC: + lastOffset = consume().getEndOffset(); + break; + default: + needBack = true; + // throw backtrack; + } + } else {needBack = true; } } catch (BacktrackException bt) { + needBack = true; + } + if (needBack) { backup(mark); typeId = null; unaryExpression = unaryExpression(); @@ -977,11 +992,13 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { try { int offset = consume(IToken.tLPAREN).getOffset(); IASTTypeId t = typeId(false); - consume(IToken.tRPAREN).getEndOffset(); - IASTInitializer i = cInitializerClause(Collections.EMPTY_LIST); - firstExpression = buildTypeIdInitializerExpression(t, i, - offset, calculateEndOffset(i)); - break; + if (t != null) { + consume(IToken.tRPAREN).getEndOffset(); + IASTInitializer i = cInitializerClause(Collections.EMPTY_LIST); + firstExpression = buildTypeIdInitializerExpression(t, i, + offset, calculateEndOffset(i)); + break; + } else {backup(m); } } catch (BacktrackException bt) { backup(m); } @@ -1273,19 +1290,23 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { { declSpecifier = declSpecifierSeq(false, true); } catch (FoundDeclaratorException e) { - throwBacktrack( e.currToken ); + return null; +// backup(mark); +// throwBacktrack( e.currToken ); } declarator = declarator(); } catch (BacktrackException bt) { - backup(mark); - throwBacktrack(bt); + return null; +// backup(mark); +// throwBacktrack(bt); } if (declarator == null || declarator.getName().toCharArray().length > 0) //$NON-NLS-1$ { - backup(mark); - throwBacktrack(startingOffset, figureEndOffset(declSpecifier, - declarator) - - startingOffset); + return null; +// backup(mark); +// throwBacktrack(startingOffset, figureEndOffset(declSpecifier, +// declarator) +// - startingOffset); } IASTTypeId result = createTypeId(); @@ -2261,6 +2282,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { lastOffset = Integer.MAX_VALUE; break; default: + System.out.println("++++ 2 : " + currToken.getImage()); throw backtrack; }