1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-11 18:25:40 +02:00

added token mapping to CPPBuildASTParserAction

This commit is contained in:
Mike Kucera 2008-05-01 15:07:12 +00:00
parent af61802112
commit 5ef40f0eff
6 changed files with 109 additions and 63 deletions

View file

@ -54,6 +54,7 @@ public class LRParserTestSuite extends TestSuite {
addTestSuite(LRCPPSpecTest.class);
addTestSuite(LRCPPTests.class);
addTestSuite(LRTemplateTests.class);
}};
}

View file

@ -0,0 +1,37 @@
package org.eclipse.cdt.core.lrparser.tests;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.lrparser.c99.C99Language;
import org.eclipse.cdt.core.dom.lrparser.cpp.ISOCPPLanguage;
import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.tests.ast2.AST2TemplateTests;
import org.eclipse.cdt.internal.core.parser.ParserException;
@SuppressWarnings("restriction")
public class LRTemplateTests extends AST2TemplateTests {
public static TestSuite suite() {
return suite(LRTemplateTests.class);
}
@Override
@SuppressWarnings("unused")
protected IASTTranslationUnit parse( String code, ParserLanguage lang, boolean useGNUExtensions, boolean expectNoProblems, boolean parseComments) throws ParserException {
ILanguage language = lang.isCPP() ? getCPPLanguage() : getC99Language();
return ParseHelper.parse(code, language, expectNoProblems);
}
protected ILanguage getC99Language() {
return C99Language.getDefault();
}
protected ILanguage getCPPLanguage() {
return ISOCPPLanguage.getDefault();
}
}

View file

@ -1,4 +1,4 @@
#Fri Apr 25 15:09:24 EDT 2008
#Wed Apr 30 13:42:53 EDT 2008
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
org.eclipse.jdt.core.compiler.compliance=1.5
@ -52,7 +52,7 @@ org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
org.eclipse.jdt.core.compiler.problem.unusedImport=error
org.eclipse.jdt.core.compiler.problem.unusedImport=warning
org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
org.eclipse.jdt.core.compiler.problem.unusedParameter=warning

View file

@ -93,18 +93,14 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
}
private int baseKind(IToken token) {
return tokenMap.mapKind(token.getKind());
}
@Override
protected boolean isCompletionToken(IToken token) {
return asC99Kind(token) == TK_Completion;
}
private int asC99Kind(IToken token) {
return asC99Kind(token.getKind());
}
private int asC99Kind(int tokenKind) {
return tokenMap.mapKind(tokenKind);
return baseKind(token) == TK_Completion;
}
@ -203,7 +199,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
return;
IToken token = (IToken)specifier;
int kind = asC99Kind(token);
int kind = baseKind(token);
switch(kind){
case TK_typedef: node.setStorageClass(IASTDeclSpecifier.sc_typedef); return;
case TK_extern: node.setStorageClass(IASTDeclSpecifier.sc_extern); return;
@ -245,7 +241,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
*/
private void collectArrayModifierTypeQualifiers(ICASTArrayModifier arrayModifier) {
for(Object o : astStack.closeScope()) {
switch(asC99Kind((IToken)o)) {
switch(baseKind((IToken)o)) {
case TK_const: arrayModifier.setConst(true); break;
case TK_restrict: arrayModifier.setRestrict(true); break;
case TK_volatile: arrayModifier.setVolatile(true); break;
@ -350,7 +346,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
for(Object o : astStack.closeScope()) {
IToken token = (IToken)o;
switch(asC99Kind(token)) {
switch(baseKind(token)) {
default: assert false;
case TK_const: pointer.setConst(true); break;
case TK_volatile: pointer.setVolatile(true); break;
@ -500,7 +496,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
if(o instanceof IToken) {
IToken token = (IToken) o;
// There is one identifier token on the stack
int kind = asC99Kind(token);
int kind = baseKind(token);
if(kind == TK_identifier || kind == TK_Completion) {
IASTName name = createName(token);
//name.setBinding(binding);
@ -532,7 +528,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
IASTDeclSpecifier declSpecifier = (IASTDeclSpecifier) astStack.pop();
List<IToken> ruleTokens = parser.getRuleTokens();
if(ruleTokens.size() == 1 && asC99Kind(ruleTokens.get(0)) == TK_EndOfCompletion)
if(ruleTokens.size() == 1 && baseKind(ruleTokens.get(0)) == TK_EndOfCompletion)
return; // do not generate nodes for extra EOC tokens
IASTSimpleDeclaration declaration = nodeFactory.newSimpleDeclaration(declSpecifier);
@ -558,7 +554,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
// Don't generate declaration nodes for extra EOC tokens
// TODO: the token type must be converted
if(asC99Kind(parser.getLeftIToken()) == C99Parsersym.TK_EndOfCompletion)
if(baseKind(parser.getLeftIToken()) == C99Parsersym.TK_EndOfCompletion)
return;
IASTDeclSpecifier declSpecifier = nodeFactory.newCSimpleDeclSpecifier();

View file

@ -28,6 +28,7 @@ public class CPPASTAmbiguousDeclarator extends CPPASTAmbiguity implements IASTDe
public CPPASTAmbiguousDeclarator(IASTDeclarator ... ds) {
System.out.println("CPPASTAmbiguousDeclarator created");
for(IASTDeclarator declarator : ds)
addDeclarator(declarator);
}
@ -76,11 +77,10 @@ public class CPPASTAmbiguousDeclarator extends CPPASTAmbiguity implements IASTDe
if( scope != null ) {
try {
ASTInternal.flushCache(scope);
IScope parentScope = scope.getParent(); // needed to fix bugs
if(parentScope != null) {
ASTInternal.flushCache(parentScope);
}
IScope parentScope = scope;
do {
ASTInternal.flushCache(parentScope);
} while((parentScope = parentScope.getParent()) != null);
} catch (DOMException de) {}
}
}

View file

@ -12,6 +12,7 @@ package org.eclipse.cdt.core.dom.lrparser.action.cpp;
import static org.eclipse.cdt.core.parser.util.CollectionUtils.findFirstAndRemove;
import static org.eclipse.cdt.core.parser.util.CollectionUtils.reverseIterable;
import static org.eclipse.cdt.internal.core.dom.lrparser.c99.C99Parsersym.TK_Completion;
import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.*;
import java.util.Collections;
@ -88,7 +89,10 @@ import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
import org.eclipse.cdt.core.dom.lrparser.LPGTokenAdapter;
import org.eclipse.cdt.core.dom.lrparser.action.BuildASTParserAction;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
import org.eclipse.cdt.core.parser.util.DebugUtil;
import org.eclipse.cdt.internal.core.dom.lrparser.c99.C99Parsersym;
import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPExpressionStatementParser;
import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPNoCastExpressionParser;
import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPNoFunctionDeclaratorParser;
@ -107,6 +111,8 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.OverloadableOperator;
@SuppressWarnings("restriction")
public class CPPBuildASTParserAction extends BuildASTParserAction {
/** Allows code in this class to refer to the token kinds in CPPParsersym */
private final ITokenMap tokenMap;
/** Used to create the AST node objects */
protected final ICPPASTNodeFactory nodeFactory;
@ -119,14 +125,21 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
public CPPBuildASTParserAction(ICPPASTNodeFactory nodeFactory, IParserActionTokenProvider parser, IASTTranslationUnit tu) {
super(nodeFactory, parser, tu);
this.nodeFactory = nodeFactory;
this.tokenMap = new TokenMap(CPPParsersym.orderedTerminalSymbols, parser.getOrderedTerminalSymbols());
}
private int baseKind(IToken token) {
return tokenMap.mapKind(token.getKind());
}
@Override
protected boolean isCompletionToken(IToken token) {
return token.getKind() == CPPParsersym.TK_Completion;
return baseKind(token) == TK_Completion;
}
@Override
protected IParser getExpressionStatementParser() {
return new CPPExpressionStatementParser(parser.getOrderedTerminalSymbols());
@ -269,10 +282,10 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
}
private static int asICPPASTSimpleTypeConstructorExpressionType(IToken token) {
private int asICPPASTSimpleTypeConstructorExpressionType(IToken token) {
assert token != null;
switch(token.getKind()) {
switch(baseKind(token)) {
case TK_char : return ICPPASTSimpleTypeConstructorExpression.t_char;
case TK_wchar_t : return ICPPASTSimpleTypeConstructorExpression.t_wchar_t;
case TK_bool : return ICPPASTSimpleTypeConstructorExpression.t_bool;
@ -765,7 +778,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
}
private static String createStringRepresentation(List<IToken> nameTokens) {
private String createStringRepresentation(List<IToken> nameTokens) {
StringBuilder sb = new StringBuilder();
IToken prev = null;
for(IToken t : nameTokens) {
@ -778,13 +791,13 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
}
private static boolean needSpaceBetween(IToken prev, IToken iter) {
private boolean needSpaceBetween(IToken prev, IToken iter) {
// this logic was copied from BasicTokenDuple.createCharArrayRepresentation()
if(prev == null)
return false;
int prevKind = prev.getKind();
int iterKind = iter.getKind();
int prevKind = baseKind(prev);
int iterKind = baseKind(iter);
return prevKind != TK_ColonColon &&
prevKind != TK_identifier &&
@ -1047,8 +1060,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
* object to determine how to set a specifier.
*/
protected void setSpecifier(ICPPASTDeclSpecifier node, IToken token) {
//TODO int kind = asC99Kind(token)
int kind = token.getKind();
int kind = baseKind(token);
switch(kind){
case TK_typedef: node.setStorageClass(IASTDeclSpecifier.sc_typedef); return;
case TK_extern: node.setStorageClass(IASTDeclSpecifier.sc_extern); return;
@ -1082,7 +1094,6 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
case TK_short: n.setShort(true); return;
}
}
}
@ -1171,8 +1182,8 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
}
private static int getElaboratedTypeSpecifier(IToken token) {
int kind = token.getKind();
private int getElaboratedTypeSpecifier(IToken token) {
int kind = baseKind(token);
switch(kind) {
default: assert false : "wrong token kind: " + kind; //$NON-NLS-1$
case TK_struct: return IASTElaboratedTypeSpecifier.k_struct;
@ -1213,7 +1224,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
if(declarators.isEmpty() &&
declSpecifier instanceof ICPPASTNamedTypeSpecifier &&
ruleTokens.size() >= 2 &&
(nameToken = ruleTokens.get(ruleTokens.size() - 2)).getKind() == TK_identifier) {
baseKind(nameToken = ruleTokens.get(ruleTokens.size() - 2)) == TK_identifier) {
declSpecifier = nodeFactory.newSimpleDeclSpecifier();
for(IToken t : ruleTokens.subList(0, ruleTokens.size()-1))
@ -1246,23 +1257,24 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
public void consumeInitDeclaratorComplete() {
if(TRACE_ACTIONS) DebugUtil.printMethodTrace();
IASTDeclarator declarator = (IASTDeclarator) astStack.peek();
if(!(declarator instanceof IASTFunctionDeclarator))
return;
IParser secondaryParser = new CPPNoFunctionDeclaratorParser(parser.getOrderedTerminalSymbols());
IASTNode alternateDeclarator = runSecondaryParser(secondaryParser);
if(alternateDeclarator == null || alternateDeclarator instanceof IASTProblemDeclaration)
return;
astStack.pop();
IASTNode ambiguityNode = new CPPASTAmbiguousDeclarator(declarator, (IASTDeclarator)alternateDeclarator);
setOffsetAndLength(ambiguityNode);
astStack.push(ambiguityNode);
// System.out.println(parser.getRuleTokens());
// IASTDeclarator declarator = (IASTDeclarator) astStack.peek();
// if(!(declarator instanceof IASTFunctionDeclarator))
// return;
//
// IParser secondaryParser = new CPPNoFunctionDeclaratorParser(parser.getOrderedTerminalSymbols());
// IASTNode alternateDeclarator = runSecondaryParser(secondaryParser);
//
// if(alternateDeclarator == null || alternateDeclarator instanceof IASTProblemDeclaration)
// return;
//
// astStack.pop();
// IASTNode ambiguityNode = new CPPASTAmbiguousDeclarator(declarator, (IASTDeclarator)alternateDeclarator);
//
// setOffsetAndLength(ambiguityNode);
// astStack.push(ambiguityNode);
//
if(TRACE_AST_STACK) System.out.println(astStack);
}
@ -1285,8 +1297,8 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
}
private static int getAccessSpecifier(IToken token) {
int kind = token.getKind();
private int getAccessSpecifier(IToken token) {
int kind = baseKind(token);
switch(kind) {
default: assert false : "wrong token kind: " + kind; //$NON-NLS-1$
case TK_private: return ICPPASTVisibilityLabel.v_private;
@ -1396,8 +1408,8 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
}
private static int getCompositeTypeSpecifier(IToken token) {
int kind = token.getKind();
private int getCompositeTypeSpecifier(IToken token) {
final int kind = baseKind(token);
switch(kind) {
default: assert false : "wrong token kind: " + kind; //$NON-NLS-1$
case TK_struct: return IASTCompositeTypeSpecifier.k_struct;
@ -1424,10 +1436,10 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
}
private static void addCVQualifiersToPointer(IASTPointer pointer, List<Object> tokens) {
private void addCVQualifiersToPointer(IASTPointer pointer, List<Object> tokens) {
for(Object t : tokens) {
IToken token = (IToken) t;
int kind = token.getKind(); // TODO this should be asXXXKind
int kind = baseKind(token);
switch(kind) {
default : assert false;
case TK_const: pointer.setConst(true); break;
@ -1468,7 +1480,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
// find the last double colon by searching for it
for(IToken t : reverseIterable(parser.getRuleTokens())) {
if(t.getKind() == TK_ColonColon) {
if(baseKind(t) == TK_ColonColon) {
endOffset = endOffset(t);
break;
}
@ -1518,7 +1530,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
}
for(Object token : astStack.closeScope()) {
int kind = ((IToken)token).getKind();
int kind = baseKind((IToken)token);
switch(kind) {
default: assert false : "wrong token kind: " + kind; //$NON-NLS-1$
case TK_const: declarator.setConst(true); break;
@ -1713,8 +1725,8 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
if(TRACE_AST_STACK) System.out.println(astStack);
}
private static int getTemplateParameterType(IToken token) {
int kind = token.getKind();
private int getTemplateParameterType(IToken token) {
int kind = baseKind(token);
switch(kind) {
default: assert false : "wrong token kind: " + kind; //$NON-NLS-1$
case TK_class: return ICPPASTSimpleTypeTemplateParameter.st_class;