mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-12 02:35:37 +02:00
added token mapping to CPPBuildASTParserAction
This commit is contained in:
parent
af61802112
commit
5ef40f0eff
6 changed files with 109 additions and 63 deletions
|
@ -54,6 +54,7 @@ public class LRParserTestSuite extends TestSuite {
|
|||
|
||||
addTestSuite(LRCPPSpecTest.class);
|
||||
addTestSuite(LRCPPTests.class);
|
||||
addTestSuite(LRTemplateTests.class);
|
||||
|
||||
}};
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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) {}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue