1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-06 17:26:01 +02:00

org.eclipse.cdt.core<BR>

&nbsp;Restructuring of the parser extension packages. <BR>
&nbsp;Introduce IParserExtension and IASTFactory mechanisms w/partial implementation for GCC. <BR>
&nbsp;Introduce IGCCToken and GCCKeywords and fleshed out GCCScannerExtension implementation and interworking with Scanner. <BR>
&nbsp;Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=39697<BR>
&nbsp;Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=39695<BR>
&nbsp;Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=39684<BR>
<BR>
org.eclipse.cdt.core.tests<BR>
&nbsp;Moved testBug39684() & testBug39695() from ASTFailedTests to QuickParseASTTests.<BR>
&nbsp;Updated CompleteParseASTTest::testBug39697().<BR>
&nbsp;Added CompleteParseASTTest::testBug39684() & CompleteParseASTTest::testBug39695().
This commit is contained in:
John Camelon 2004-04-20 17:36:41 +00:00
parent b9541fc2a5
commit b8154fb0fc
45 changed files with 1358 additions and 468 deletions

View file

@ -1,3 +1,8 @@
2004-04-20 John Camelon
Moved testBug39684() & testBug39695() from ASTFailedTests to QuickParseASTTests.
Updated CompleteParseASTTest::testBug39697().
Added CompleteParseASTTest::testBug39684() & CompleteParseASTTest::testBug39695().
2004-04-20 David Inglis
The CoreModel interfaces throw much more exception, we need to log them for errors.

View file

@ -74,10 +74,7 @@ public class ASTFailedTests extends BaseASTTest
"The expected error did not occur.",
typedef.getName().equals( "name" ) );
}
public void testBug39684() throws Exception
{
assertCodeFailsParse("typeof(foo(1)) bar () { return foo(1); }");
}
public void testBug39686() throws Exception
{
Writer code = new StringWriter();
@ -115,10 +112,7 @@ public class ASTFailedTests extends BaseASTTest
assertCodeFailsParse(code.toString());
}
public void testBug39695() throws Exception
{
assertCodeFailsParse("int a = __alignof__ (int);");
}
public void testBug39695A() throws Exception
{
assertCodeFailsParse("int foo asm (\"myfoo\") = 2;");

View file

@ -42,6 +42,8 @@ import org.eclipse.cdt.core.parser.ast.IASTUsingDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTUsingDirective;
import org.eclipse.cdt.core.parser.ast.IASTVariable;
import org.eclipse.cdt.core.parser.ast.IASTVariableReference;
import org.eclipse.cdt.core.parser.ast.gcc.IASTGCCExpression;
import org.eclipse.cdt.core.parser.ast.gcc.IASTGCCSimpleTypeSpecifier;
import org.eclipse.cdt.internal.core.parser.ParserException;
@ -1532,25 +1534,27 @@ public class CompleteParseASTTest extends CompleteParseBaseTest
IASTVariable signedInt = (IASTVariable) i.next();
assertTrue( ((IASTSimpleTypeSpecifier) signedInt.getAbstractDeclaration().getTypeSpecifier()).isSigned() );
assertFalse( i.hasNext() );
writer = new StringWriter();
writer.write( "int * __restrict__ resPointer1;\n");
writer.write( "int * __restrict resPointer2;\n");
i = parse( writer.toString(), true, ParserLanguage.C ).getDeclarations();
int count = 0;
while( i.hasNext() )
for( int j = 0; j < 2; ++j )
{
++count;
IASTVariable resPointer = (IASTVariable) i.next();
Iterator pOps = resPointer.getAbstractDeclaration().getPointerOperators();
assertTrue( pOps.hasNext() );
ASTPointerOperator op = (ASTPointerOperator) pOps.next();
assertFalse( pOps.hasNext() );
assertEquals( op, ASTPointerOperator.RESTRICT_POINTER );
}
assertEquals( count, 2 );
}
writer = new StringWriter();
writer.write( "int * __restrict__ resPointer1;\n");
writer.write( "int * __restrict resPointer2;\n");
i = parse( writer.toString(), true, ((j == 0 )? ParserLanguage.C : ParserLanguage.CPP) ).getDeclarations();
int count = 0;
while( i.hasNext() )
{
++count;
IASTVariable resPointer = (IASTVariable) i.next();
Iterator pOps = resPointer.getAbstractDeclaration().getPointerOperators();
assertTrue( pOps.hasNext() );
ASTPointerOperator op = (ASTPointerOperator) pOps.next();
assertFalse( pOps.hasNext() );
assertEquals( op, ASTPointerOperator.RESTRICT_POINTER );
}
assertEquals( count, 2 );
}
}
public void testBug59149() throws Exception
{
Writer writer = new StringWriter();
@ -1560,5 +1564,20 @@ public class CompleteParseASTTest extends CompleteParseBaseTest
Iterator i = parse( writer.toString() ).getDeclarations();
IASTClassSpecifier A = (IASTClassSpecifier) ((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
IASTClassSpecifier B = (IASTClassSpecifier) ((IASTAbstractTypeSpecifierDeclaration)i.next()).getTypeSpecifier();
}
}
public void testBug39695() throws Exception
{
Iterator i = parse("int a = __alignof__ (int);").getDeclarations();
IASTVariable a = (IASTVariable) i.next();
assertFalse( i.hasNext() );
assertEquals( a.getInitializerClause().getAssigmentExpression().getExpressionKind(), IASTGCCExpression.Kind.UNARY_ALIGNOF_TYPEID );
}
public void testBug39684() throws Exception
{
IASTFunction bar = (IASTFunction) parse("typeof(foo(1)) bar () { return foo(1); }").getDeclarations().next();
IASTSimpleTypeSpecifier simpleTypeSpec = ((IASTSimpleTypeSpecifier)bar.getReturnType().getTypeSpecifier());
assertEquals( simpleTypeSpec.getType(), IASTGCCSimpleTypeSpecifier.Type.TYPEOF );
}
}

View file

@ -2177,4 +2177,14 @@ public class QuickParseASTTests extends BaseASTTest
assertTrue( f.isFriend() );
}
public void testBug39695() throws Exception
{
parse("int a = __alignof__ (int);");
}
public void testBug39684() throws Exception
{
parse("typeof(foo(1)) bar () { return foo(1); }");
}
}

View file

@ -1,3 +1,11 @@
2004-04-20 John Camelon
Restructuring of the parser extension packages.
Introduce IParserExtension and IASTFactory mechanisms w/partial implementation for GCC.
Introduce IGCCToken and GCCKeywords and fleshed out GCCScannerExtension implementation and interworking with Scanner.
Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=39697
Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=39695
Fixed https://bugs.eclipse.org/bugs/show_bug.cgi?id=39684
2004-04-19 Andrew Niefer
fix bug 59149 [Parser] Redundant friend declaration fails parse

View file

@ -0,0 +1,22 @@
/**********************************************************************
* Copyright (c) 2002,2003 Rational Software Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v0.5
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v05.html
*
* Contributors:
* IBM Rational Software - Initial API and implementation */
package org.eclipse.cdt.core.parser;
/**
* @author jcamelon
*
*/
public class GCCKeywords {
public static final String TYPEOF = "typeof"; //$NON-NLS-1$
public static final String __ALIGNOF__ = "__alignof__"; //$NON-NLS-1$
}

View file

@ -0,0 +1,22 @@
/**********************************************************************
* Copyright (c) 2002,2003 Rational Software Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v0.5
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v05.html
*
* Contributors:
* IBM Rational Software - Initial API and implementation */
package org.eclipse.cdt.core.parser;
/**
* @author jcamelon
*
*/
public interface IGCCToken extends IToken {
public static final int t_typeof = tLAST + 1;
public static final int t___alignof__ = tLAST + 2;
}

View file

@ -15,6 +15,7 @@ import java.util.List;
import org.eclipse.cdt.core.parser.ast.IASTFactory;
import org.eclipse.cdt.core.parser.extension.ExtensionDialect;
import org.eclipse.cdt.core.parser.extension.IParserExtension;
import org.eclipse.cdt.core.parser.extension.IParserExtensionFactory;
import org.eclipse.cdt.internal.core.parser.CompleteParser;
import org.eclipse.cdt.internal.core.parser.CompletionParser;
@ -43,11 +44,11 @@ public class ParserFactory {
public static IASTFactory createASTFactory( IFilenameProvider provider, ParserMode mode, ParserLanguage language )
{
if( mode == ParserMode.QUICK_PARSE )
return new QuickParseASTFactory( extensionFactory.createASTExtensionFactory( ParserMode.QUICK_PARSE ) );
return new QuickParseASTFactory();
else if( mode == ParserMode.EXPRESSION_PARSE )
return new ExpressionParseASTFactory( extensionFactory.createASTExtensionFactory( ParserMode.EXPRESSION_PARSE ) );
return new ExpressionParseASTFactory( extensionFactory.createASTExtension( mode ));
else
return new CompleteParseASTFactory( provider, language, mode, extensionFactory.createASTExtensionFactory( ParserMode.COMPLETE_PARSE ) );
return new CompleteParseASTFactory( provider, language, mode, extensionFactory.createASTExtension( mode ));
}
public static IParser createParser( IScanner scanner, ISourceElementRequestor callback, ParserMode mode, ParserLanguage language, IParserLogService log ) throws ParserFactoryError
@ -57,16 +58,17 @@ public class ParserFactory {
IParserLogService logService = ( log == null ) ? createDefaultLogService() : log;
ParserMode ourMode = ( (mode == null )? ParserMode.COMPLETE_PARSE : mode );
ISourceElementRequestor ourCallback = (( callback == null) ? new NullSourceElementRequestor() : callback );
IParserExtension extension = extensionFactory.createParserExtension();
if( ourMode == ParserMode.COMPLETE_PARSE)
return new CompleteParser( scanner, ourCallback, language, logService );
return new CompleteParser( scanner, ourCallback, language, logService, extension);
else if( ourMode == ParserMode.STRUCTURAL_PARSE )
return new StructuralParser( scanner, ourCallback, language, logService );
return new StructuralParser( scanner, ourCallback, language, logService, extension );
else if( ourMode == ParserMode.COMPLETION_PARSE )
return new CompletionParser( scanner, ourCallback, language, logService );
return new CompletionParser( scanner, ourCallback, language, logService, extension );
else if (ourMode == ParserMode.SELECTION_PARSE )
return new SelectionParser( scanner, ourCallback, language, logService );
return new SelectionParser( scanner, ourCallback, language, logService, extension );
else
return new QuickParser( scanner, ourCallback, language, logService );
return new QuickParser( scanner, ourCallback, language, logService, extension );
}
public static IScanner createScanner( Reader input, String fileName, IScannerInfo config, ParserMode mode, ParserLanguage language, ISourceElementRequestor requestor, IParserLogService log, List workingCopies ) throws ParserFactoryError

View file

@ -111,11 +111,13 @@ public interface IASTExpression extends ISourceElementCallbackDelegate
public static final Kind ASSIGNMENTEXPRESSION_XOR = new Kind( 83 );
public static final Kind EXPRESSIONLIST = new Kind( 84 );
protected static final int LAST_KIND = 84;
/**
* @param enumValue
*/
private Kind(int enumValue)
protected Kind(int enumValue)
{
super(enumValue);
}
@ -216,7 +218,11 @@ public interface IASTExpression extends ISourceElementCallbackDelegate
* @return
*/
public String getKindName() {
return (String) names.get(this);
Object check = names.get(this);
if( check != null )
return (String) check;
return "EXTENSION SPECIFIED"; //$NON-NLS-1$
}
public boolean isPostfixMemberReference()

View file

@ -9,6 +9,7 @@
* IBM Rational Software - Initial API and implementation
***********************************************************************/
package org.eclipse.cdt.core.parser.ast;
import java.util.Hashtable;
import java.util.List;
import org.eclipse.cdt.core.parser.IMacroDescriptor;
@ -153,7 +154,7 @@ public interface IASTFactory
boolean isLong,
boolean isSigned,
boolean isUnsigned,
boolean isTypename, boolean isComplex, boolean isImaginary, boolean isGlobal ) throws ASTSemanticException;
boolean isTypename, boolean isComplex, boolean isImaginary, boolean isGlobal, Hashtable extensionParms ) throws ASTSemanticException;
public IASTFunction createFunction(
IASTScope scope,

View file

@ -31,6 +31,8 @@ public interface IASTSimpleTypeSpecifier extends IASTTypeSpecifier
public static final Type CLASS_OR_TYPENAME = new Type( 8 );
public static final Type TEMPLATE = new Type( 9 );
public static final Type _BOOL = new Type( 10 );
protected static final int LAST_TYPE = 10;
/**
* @param enumValue
*/

View file

@ -1,23 +0,0 @@
/*******************************************************************************
* Copyright (c) 2000 - 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.core.parser.ast.extension;
import org.eclipse.cdt.core.parser.ast.ASTExpressionEvaluationException;
import org.eclipse.cdt.core.parser.ast.IASTExpression;
/**
* @author jcamelon
*/
public interface IASTExpressionExtension {
public void setExpression(IASTExpression expression );
public int evaluateExpression() throws ASTExpressionEvaluationException;
}

View file

@ -1,21 +0,0 @@
/*******************************************************************************
* Copyright (c) 2000 - 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.core.parser.ast.extension;
import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException;
/**
* @author jcamelon
*/
public interface IASTExtensionFactory {
public IASTExpressionExtension createExpressionExtension( ) throws ASTNotImplementedException;
}

View file

@ -0,0 +1,34 @@
/**********************************************************************
* Copyright (c) 2002,2003 Rational Software Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v0.5
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v05.html
*
* Contributors:
* IBM Rational Software - Initial API and implementation */
package org.eclipse.cdt.core.parser.ast.gcc;
import org.eclipse.cdt.core.parser.ast.IASTExpression;
/**
* @author jcamelon
*
*/
public interface IASTGCCExpression extends IASTExpression {
public static class Kind extends IASTExpression.Kind
{
public static final Kind UNARY_ALIGNOF_UNARYEXPRESSION = new Kind( LAST_KIND + 1 );
public static final Kind UNARY_ALIGNOF_TYPEID = new Kind( LAST_KIND + 2 );
public static final Kind UNARY_TYPEOF_UNARYEXPRESSION = new Kind( LAST_KIND + 3 );
public static final Kind UNARY_TYPEOF_TYPEID = new Kind( LAST_KIND + 4 );
protected Kind( int kind )
{
super( kind );
}
}
}

View file

@ -0,0 +1,36 @@
/**********************************************************************
* Copyright (c) 2002,2003 Rational Software Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v0.5
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v05.html
*
* Contributors:
* IBM Rational Software - Initial API and implementation */
package org.eclipse.cdt.core.parser.ast.gcc;
import org.eclipse.cdt.core.parser.ast.IASTExpression;
import org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier;
/**
* @author jcamelon
*
*/
public interface IASTGCCSimpleTypeSpecifier extends IASTSimpleTypeSpecifier {
public static class Type extends IASTSimpleTypeSpecifier.Type
{
public static final Type TYPEOF = new Type( LAST_TYPE + 1 );
/**
* @param enumValue
*/
protected Type(int enumValue) {
super(enumValue);
}
}
public IASTExpression getTypeOfExpression();
}

View file

@ -0,0 +1,64 @@
/**********************************************************************
* Copyright (c) 2002,2003 Rational Software Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v0.5
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v05.html
*
* Contributors:
* IBM Rational Software - Initial API and implementation */
package org.eclipse.cdt.core.parser.extension;
import java.util.Hashtable;
import org.eclipse.cdt.core.parser.ITokenDuple;
import org.eclipse.cdt.core.parser.ast.IASTExpression;
import org.eclipse.cdt.core.parser.ast.IASTScope;
import org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTTypeId;
import org.eclipse.cdt.core.parser.ast.IASTExpression.IASTNewExpressionDescriptor;
import org.eclipse.cdt.core.parser.ast.IASTExpression.Kind;
import org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier.Type;
import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable;
import org.eclipse.cdt.internal.core.parser.pst.TypeInfo;
/**
* @author jcamelon
*
*/
public interface IASTFactoryExtension {
public boolean overrideCreateExpressionMethod();
public IASTExpression createExpression(
IASTScope scope,
IASTExpression.Kind kind,
IASTExpression lhs,
IASTExpression rhs,
IASTExpression thirdExpression,
IASTTypeId typeId,
ITokenDuple idExpression, String literal, IASTNewExpressionDescriptor newDescriptor);
public boolean canHandleExpressionKind( IASTExpression.Kind kind );
/**
* @param kind
* @param lhs
* @param rhs
* @param typeId
* @return TODO
*/
public TypeInfo getExpressionResultType(Kind kind, IASTExpression lhs, IASTExpression rhs, IASTTypeId typeId);
public boolean overrideCreateSimpleTypeSpecifierMethod(Type type);
public IASTSimpleTypeSpecifier createSimpleTypeSpecifier(
ParserSymbolTable pst,
IASTScope scope,
IASTSimpleTypeSpecifier.Type kind,
ITokenDuple typeName,
boolean isShort,
boolean isLong,
boolean isSigned,
boolean isUnsigned, boolean isTypename, boolean isComplex, boolean isImaginary, boolean isGlobal, Hashtable extensionParms );
}

View file

@ -10,9 +10,44 @@
*******************************************************************************/
package org.eclipse.cdt.core.parser.extension;
import org.eclipse.cdt.core.parser.IToken;
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.ast.ASTPointerOperator;
import org.eclipse.cdt.core.parser.ast.IASTExpression;
import org.eclipse.cdt.core.parser.ast.IASTScope;
import org.eclipse.cdt.core.parser.ast.IASTCompletionNode.CompletionKind;
import org.eclipse.cdt.internal.core.parser.DeclarationWrapper;
import org.eclipse.cdt.internal.core.parser.IParserData;
import org.eclipse.cdt.internal.core.parser.Parser;
/**
* @author jcamelon
*/
public interface IParserExtension {
public boolean isValidCVModifier( ParserLanguage language, int tokenType );
public ASTPointerOperator getPointerOperator( ParserLanguage language, int tokenType );
public boolean isValidUnaryExpressionStart( int tokenType );
public IASTExpression parseUnaryExpression( IASTScope scope, IParserData data, CompletionKind kind );
/**
* @param i
* @return
*/
public boolean canHandleDeclSpecifierSequence(int tokenType );
public interface IDeclSpecifierExtensionResult
{
public IToken getFirstToken();
public IToken getLastToken();
public Parser.Flags getFlags();
}
/**
* @param parser
* @param flags
* @param sdw
* @return TODO
*/
public IDeclSpecifierExtensionResult handleDeclSpecifierSequence(IParserData parser, Parser.Flags flags, DeclarationWrapper sdw, CompletionKind kind );
}

View file

@ -12,7 +12,6 @@ package org.eclipse.cdt.core.parser.extension;
import org.eclipse.cdt.core.parser.ParserFactoryError;
import org.eclipse.cdt.core.parser.ParserMode;
import org.eclipse.cdt.core.parser.ast.extension.IASTExtensionFactory;
/**
@ -21,6 +20,6 @@ import org.eclipse.cdt.core.parser.ast.extension.IASTExtensionFactory;
public interface IParserExtensionFactory {
public IScannerExtension createScannerExtension() throws ParserFactoryError;
public IASTExtensionFactory createASTExtensionFactory(ParserMode mode) throws ParserFactoryError;
public IParserExtension createParserExtension() throws ParserFactoryError;
public IASTFactoryExtension createASTExtension(ParserMode mode);
}

View file

@ -10,20 +10,23 @@
***********************************************************************/
package org.eclipse.cdt.core.parser.extension;
import org.eclipse.cdt.core.parser.IToken;
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.internal.core.parser.scanner.IScannerData;
/**
* @author jcamelon
*/
public interface IScannerExtension extends Cloneable {
public Object clone( );
public interface IScannerExtension {
public String initializeMacroValue( String original );
public void setupBuiltInMacros(ParserLanguage language);
public String initializeMacroValue( IScannerData scannerData, String original );
public void setupBuiltInMacros(IScannerData scannerData, ParserLanguage language);
public boolean canHandlePreprocessorDirective( String directive );
public void handlePreprocessorDirective( String directive, String restOfLine );
public void handlePreprocessorDirective( IScannerData scannerData, String directive, String restOfLine );
public boolean isExtensionKeyword(String tokenImage);
public IToken createExtensionToken(String image, IScannerData scannerData);
/**
* @return

View file

@ -22,6 +22,7 @@ import org.eclipse.cdt.core.parser.ParserMode;
import org.eclipse.cdt.core.parser.ast.IASTCompletionNode;
import org.eclipse.cdt.core.parser.ast.IASTNode;
import org.eclipse.cdt.core.parser.ast.IASTScope;
import org.eclipse.cdt.core.parser.extension.IParserExtension;
/**
* @author jcamelon
@ -35,8 +36,8 @@ public class CompleteParser extends Parser {
* @param language
* @param log
*/
public CompleteParser(IScanner scanner, ISourceElementRequestor callback, ParserLanguage language, IParserLogService log) {
super(scanner, callback, language, log);
public CompleteParser(IScanner scanner, ISourceElementRequestor callback, ParserLanguage language, IParserLogService log, IParserExtension extension ) {
super(scanner, callback, language, log, extension );
}
protected void handleFunctionBody(IASTScope scope) throws BacktrackException, EndOfFileException

View file

@ -32,6 +32,7 @@ import org.eclipse.cdt.core.parser.ast.IASTCompletionNode;
import org.eclipse.cdt.core.parser.ast.IASTNode;
import org.eclipse.cdt.core.parser.ast.IASTScope;
import org.eclipse.cdt.core.parser.ast.IASTCompletionNode.CompletionKind;
import org.eclipse.cdt.core.parser.extension.IParserExtension;
import org.eclipse.cdt.internal.core.parser.ast.ASTCompletionNode;
import org.eclipse.cdt.internal.core.parser.token.KeywordSets.Key;
@ -46,8 +47,8 @@ public class CompletionParser extends ContextualParser implements IParser {
* @param language
* @param log
*/
public CompletionParser(IScanner scanner, ISourceElementRequestor callback, ParserLanguage language, IParserLogService log) {
super(scanner, callback, language, log);
public CompletionParser(IScanner scanner, ISourceElementRequestor callback, ParserLanguage language, IParserLogService log, IParserExtension extension ) {
super(scanner, callback, language, log, extension );
}
/* (non-Javadoc)

View file

@ -25,6 +25,7 @@ import org.eclipse.cdt.core.parser.ast.IASTExpression;
import org.eclipse.cdt.core.parser.ast.IASTNode;
import org.eclipse.cdt.core.parser.ast.IASTScope;
import org.eclipse.cdt.core.parser.ast.IASTCompletionNode.CompletionKind;
import org.eclipse.cdt.core.parser.extension.IParserExtension;
import org.eclipse.cdt.internal.core.parser.token.KeywordSets;
import org.eclipse.cdt.internal.core.parser.token.TokenDuple;
import org.eclipse.cdt.internal.core.parser.token.TokenFactory;
@ -45,8 +46,8 @@ public class ContextualParser extends CompleteParser {
IScanner scanner,
ISourceElementRequestor callback,
ParserLanguage language,
IParserLogService log) {
super(scanner, callback, language, log);
IParserLogService log, IParserExtension extension ) {
super(scanner, callback, language, log, extension );
}
protected IASTScope scope;

View file

@ -11,6 +11,7 @@
package org.eclipse.cdt.internal.core.parser;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
@ -84,6 +85,39 @@ public class DeclarationWrapper implements IDeclaratorOwner
{
return scope;
}
public DeclarationWrapper( DeclarationWrapper wrapper )
{
this( wrapper.getScope(), wrapper.getStartingOffset(), wrapper.getStartingLine(), wrapper.getOwnerTemplate() );
setAuto( wrapper.isAuto() );
setComplex( wrapper.isComplex() );
setConst( wrapper.isConst() );
setEndingOffsetAndLineNumber( wrapper.getEndOffset(), wrapper.getEndLine() );
setExplicit( wrapper.isExplicit() );
setExtern(wrapper.isExtern() );
setFriend(wrapper.isFriend());
setGloballyQualified( wrapper.isGloballyQualified() );
setImaginary( wrapper.isImaginary() );
setInline( wrapper.isInline());
setLong( wrapper.isLong() );
setMutable( wrapper.isMutable() );
setName( wrapper.getName() );
setRegister(wrapper.isRegister() );
setRestrict( wrapper.isRestrict() );
setShort(wrapper.isShort());
setSigned(wrapper.isSigned());
setSimpleType(wrapper.getSimpleType());
setStatic(wrapper.isStatic());
setTypedef(wrapper.isTypedef());
setTypenamed(wrapper.isTypeNamed());
setTypeName(wrapper.getName());
setTypeSpecifier(wrapper.getTypeSpecifier());
setUnsigned(wrapper.isUnsigned());
setVirtual(wrapper.isVirtual());
setVolatile(wrapper.isVolatile());
}
/**
* @param scope
*/
@ -755,4 +789,18 @@ public class DeclarationWrapper implements IDeclaratorOwner
public boolean isGloballyQualified(){
return global;
}
private Hashtable extensionParameters = new Hashtable();
/**
* @param key
* @param typeOfExpression
*/
public void setExtensionParameter(String key, Object value) {
extensionParameters.put( key, value );
}
public Hashtable getExtensionParameters()
{
return extensionParameters;
}
}

View file

@ -39,6 +39,7 @@ import org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTTypeId;
import org.eclipse.cdt.core.parser.ast.IASTCompletionNode.CompletionKind;
import org.eclipse.cdt.core.parser.ast.IASTExpression.Kind;
import org.eclipse.cdt.core.parser.extension.IParserExtension;
import org.eclipse.cdt.internal.core.parser.token.KeywordSets;
import org.eclipse.cdt.internal.core.parser.token.SimpleToken;
import org.eclipse.cdt.internal.core.parser.token.TokenDuple;
@ -48,29 +49,146 @@ import org.eclipse.cdt.internal.core.parser.util.TraceUtil;
/**
* @author jcamelon
*/
public class ExpressionParser implements IExpressionParser {
public class ExpressionParser implements IExpressionParser, IParserData {
protected static final String EMPTY_STRING = ""; //$NON-NLS-1$
protected final IParserLogService log;
private static int FIRST_ERROR_OFFSET_UNSET = -1;
protected int firstErrorOffset = FIRST_ERROR_OFFSET_UNSET;
protected boolean parsePassed = true;
protected int firstErrorOffset = FIRST_ERROR_OFFSET_UNSET;
protected static BacktrackException backtrack = new BacktrackException();
protected final IParserExtension extension;
//TODO this stuff needs to be encapsulated by IParserData
protected final IParserLogService log;
protected ParserLanguage language = ParserLanguage.CPP;
protected IASTFactory astFactory = null;
protected IScanner scanner;
protected IToken currToken;
protected IToken lastToken;
private boolean limitReached = false;
private Stack templateIdScopes = null;
/**
* @return Returns the astFactory.
*/
public IASTFactory getAstFactory() {
return astFactory;
}
/**
* @return Returns the log.
*/
public IParserLogService getLog() {
return log;
}
/**
* Look Ahead in the token list to see what is coming.
*
* @param i How far ahead do you wish to peek?
* @return the token you wish to observe
* @throws EndOfFileException if looking ahead encounters EOF, throw EndOfFile
*/
public IToken LA(int i) throws EndOfFileException {
if (parserTimeout()){
throw new ParseError( ParseError.ParseErrorKind.TIMEOUT );
}
if (i < 1) // can't go backwards
return null;
if (currToken == null)
currToken = fetchToken();
IToken retToken = currToken;
for (; i > 1; --i)
{
retToken = retToken.getNext();
if (retToken == null)
retToken = fetchToken();
}
return retToken;
}
/**
* Look ahead in the token list and return the token type.
*
* @param i How far ahead do you wish to peek?
* @return The type of that token
* @throws EndOfFileException if looking ahead encounters EOF, throw EndOfFile
*/
public int LT(int i) throws EndOfFileException {
return LA(i).getType();
}
/**
* Consume the next token available, regardless of the type.
*
* @return The token that was consumed and removed from our buffer.
* @throws EndOfFileException If there is no token to consume.
*/
public IToken consume() throws EndOfFileException {
if (currToken == null)
currToken = fetchToken();
if (currToken != null)
lastToken = currToken;
currToken = currToken.getNext();
handleNewToken( lastToken );
return lastToken;
}
/**
* Consume the next token available only if the type is as specified.
*
* @param type The type of token that you are expecting.
* @return the token that was consumed and removed from our buffer.
* @throws BacktrackException If LT(1) != type
*/
public IToken consume(int type) throws EndOfFileException, BacktrackException {
if (LT(1) == type)
return consume();
else
throw backtrack;
}
/**
* Mark our place in the buffer so that we could return to it should we have to.
*
* @return The current token.
* @throws EndOfFileException If there are no more tokens.
*/
public IToken mark() throws EndOfFileException {
if (currToken == null)
currToken = fetchToken();
return currToken;
}
/**
* Rollback to a previous point, reseting the queue of tokens.
*
* @param mark The point that we wish to restore to.
*
*/
public void backup(IToken mark) {
currToken = (SimpleToken)mark;
lastToken = null; // this is not entirely right ...
}
/**
* @param extension TODO
* @param scanner2
* @param callback
* @param language2
* @param log2
*/
public ExpressionParser(IScanner scanner, ParserLanguage language, IParserLogService log) {
public ExpressionParser(IScanner scanner, ParserLanguage language, IParserLogService log, IParserExtension extension) {
this.scanner = scanner;
this.language = language;
this.log = log;
this.extension = extension;
setupASTFactory(scanner, language);
}
@ -439,10 +557,23 @@ public class ExpressionParser implements IExpressionParser {
declarator.addPointerOperator(ASTPointerOperator.RESTRICT_POINTER);
break;
}
else
else
{
if( extension.isValidCVModifier( language, IToken.t_restrict ))
{
result = consume( IToken.t_restrict );
declarator.addPointerOperator( extension.getPointerOperator(language, IToken.t_restrict ));
break;
}
throw backtrack;
}
default :
if( extension.isValidCVModifier( language, LT(1)))
{
result = consume();
declarator.addPointerOperator( extension.getPointerOperator( language, result.getType() ));
}
}
return result;
}
@ -954,7 +1085,7 @@ public class ExpressionParser implements IExpressionParser {
* @param methodName
* @param e
*/
protected void logException(String methodName, Exception e) {
public void logException(String methodName, Exception e) {
if( !(e instanceof EndOfFileException ))
{
StringBuffer buffer = new StringBuffer();
@ -1340,7 +1471,7 @@ public class ExpressionParser implements IExpressionParser {
* @param completionKind TODO
* @throws BacktrackException
*/
protected IASTTypeId typeId(IASTScope scope, boolean skipArrayModifiers, CompletionKind completionKind) throws EndOfFileException, BacktrackException {
public IASTTypeId typeId(IASTScope scope, boolean skipArrayModifiers, CompletionKind completionKind) throws EndOfFileException, BacktrackException {
IToken mark = mark();
IToken start = mark;
ITokenDuple name = null;
@ -1796,7 +1927,7 @@ public class ExpressionParser implements IExpressionParser {
* @param expression
* @throws BacktrackException
*/
protected IASTExpression unaryExpression(IASTScope scope, CompletionKind kind) throws EndOfFileException, BacktrackException {
public IASTExpression unaryExpression(IASTScope scope, CompletionKind kind) throws EndOfFileException, BacktrackException {
switch (LT(1))
{
case IToken.tSTAR :
@ -1914,6 +2045,11 @@ public class ExpressionParser implements IExpressionParser {
}
}
default :
if( extension.isValidUnaryExpressionStart( LT(1)))
{
IASTExpression extensionExpression = extension.parseUnaryExpression(scope,this,kind);
if( extensionExpression != null ) return extensionExpression;
}
return postfixExpression(scope,kind);
}
}
@ -2606,12 +2742,6 @@ public class ExpressionParser implements IExpressionParser {
}
protected static BacktrackException backtrack = new BacktrackException();
protected IScanner scanner;
protected IToken currToken;
protected IToken lastToken;
private boolean limitReached = false;
/**
* Fetches a token from the scanner.
*
@ -2652,98 +2782,6 @@ public class ExpressionParser implements IExpressionParser {
throw new EndOfFileException();
}
/**
* Look Ahead in the token list to see what is coming.
*
* @param i How far ahead do you wish to peek?
* @return the token you wish to observe
* @throws EndOfFileException if looking ahead encounters EOF, throw EndOfFile
*/
protected IToken LA(int i) throws EndOfFileException {
if (parserTimeout()){
throw new ParseError( ParseError.ParseErrorKind.TIMEOUT );
}
if (i < 1) // can't go backwards
return null;
if (currToken == null)
currToken = fetchToken();
IToken retToken = currToken;
for (; i > 1; --i)
{
retToken = retToken.getNext();
if (retToken == null)
retToken = fetchToken();
}
return retToken;
}
/**
* Look ahead in the token list and return the token type.
*
* @param i How far ahead do you wish to peek?
* @return The type of that token
* @throws EndOfFileException if looking ahead encounters EOF, throw EndOfFile
*/
protected int LT(int i) throws EndOfFileException {
return LA(i).getType();
}
/**
* Consume the next token available, regardless of the type.
*
* @return The token that was consumed and removed from our buffer.
* @throws EndOfFileException If there is no token to consume.
*/
protected IToken consume() throws EndOfFileException {
if (currToken == null)
currToken = fetchToken();
if (currToken != null)
lastToken = currToken;
currToken = currToken.getNext();
handleNewToken( lastToken );
return lastToken;
}
/**
* Consume the next token available only if the type is as specified.
*
* @param type The type of token that you are expecting.
* @return the token that was consumed and removed from our buffer.
* @throws BacktrackException If LT(1) != type
*/
protected IToken consume(int type) throws EndOfFileException, BacktrackException {
if (LT(1) == type)
return consume();
else
throw backtrack;
}
/**
* Mark our place in the buffer so that we could return to it should we have to.
*
* @return The current token.
* @throws EndOfFileException If there are no more tokens.
*/
protected IToken mark() throws EndOfFileException {
if (currToken == null)
currToken = fetchToken();
return currToken;
}
/**
* Rollback to a previous point, reseting the queue of tokens.
*
* @param mark The point that we wish to restore to.
*
*/
protected void backup(IToken mark) {
currToken = (SimpleToken)mark;
lastToken = null; // this is not entirely right ...
}
protected IASTExpression assignmentOperatorExpression(IASTScope scope, IASTExpression.Kind kind, IASTExpression lhs, CompletionKind completionKind) throws EndOfFileException, BacktrackException {
consume();
IASTExpression assignmentExpression = assignmentExpression(scope,completionKind);
@ -2841,4 +2879,10 @@ public class ExpressionParser implements IExpressionParser {
protected boolean parserTimeout(){
return false;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.parser.IParserData#getLastToken()
*/
public IToken getLastToken() {
return lastToken;
}
}

View file

@ -0,0 +1,322 @@
/**********************************************************************
* Copyright (c) 2002,2003 Rational Software Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v0.5
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v05.html
*
* Contributors:
* IBM Rational Software - Initial API and implementation */
package org.eclipse.cdt.internal.core.parser;
import java.util.Hashtable;
import org.eclipse.cdt.core.parser.BacktrackException;
import org.eclipse.cdt.core.parser.EndOfFileException;
import org.eclipse.cdt.core.parser.Enum;
import org.eclipse.cdt.core.parser.IGCCToken;
import org.eclipse.cdt.core.parser.IToken;
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.ast.ASTPointerOperator;
import org.eclipse.cdt.core.parser.ast.ASTSemanticException;
import org.eclipse.cdt.core.parser.ast.IASTCompletionNode;
import org.eclipse.cdt.core.parser.ast.IASTExpression;
import org.eclipse.cdt.core.parser.ast.IASTScope;
import org.eclipse.cdt.core.parser.ast.IASTTypeId;
import org.eclipse.cdt.core.parser.ast.IASTCompletionNode.CompletionKind;
import org.eclipse.cdt.core.parser.ast.gcc.IASTGCCExpression;
import org.eclipse.cdt.core.parser.ast.gcc.IASTGCCSimpleTypeSpecifier;
import org.eclipse.cdt.core.parser.extension.IParserExtension;
import org.eclipse.cdt.internal.core.parser.Parser.Flags;
import org.eclipse.cdt.internal.core.parser.ast.complete.gcc.ASTGCCSimpleTypeSpecifier;
/**
* @author jcamelon
*
*/
public class GCCParserExtension implements IParserExtension {
private static final String EMPTY_STRING = "";
protected static BacktrackException backtrack = new BacktrackException();
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.extension.IParserExtension#isValidCVModifier(org.eclipse.cdt.core.parser.ParserLanguage, int)
*/
public boolean isValidCVModifier(ParserLanguage language, int tokenType) {
if( tokenType == IToken.t_restrict && language == ParserLanguage.CPP )
return true;
return false;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.extension.IParserExtension#getPointerOperator(org.eclipse.cdt.core.parser.ParserLanguage, int)
*/
public ASTPointerOperator getPointerOperator(ParserLanguage language, int tokenType) {
if( tokenType == IToken.t_restrict && language == ParserLanguage.CPP )
return ASTPointerOperator.RESTRICT_POINTER;
return null;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.extension.IParserExtension#isValidUnaryExpressionStart(int)
*/
public boolean isValidUnaryExpressionStart(int tokenType) {
switch( tokenType )
{
case IGCCToken.t___alignof__:
case IGCCToken.t_typeof:
return true;
default:
return false;
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.extension.IParserExtension#parseUnaryExpression(org.eclipse.cdt.internal.core.parser.IParserData)
*/
public IASTExpression parseUnaryExpression(IASTScope scope, IParserData data, IASTCompletionNode.CompletionKind kind) {
try {
switch( data.LT(1))
{
case IGCCToken.t___alignof__:
return performUnaryExpression( data, scope, kind, UnaryExpressionKind.ALIGNOF );
case IGCCToken.t_typeof:
return performUnaryExpression( data, scope, kind, UnaryExpressionKind.TYPEOF );
default:
break;
}
} catch (EndOfFileException e) {
//TODO
}
return null;
}
protected static class UnaryExpressionKind extends Enum
{
public static final UnaryExpressionKind ALIGNOF = new UnaryExpressionKind( 1 );
public static final UnaryExpressionKind TYPEOF = new UnaryExpressionKind( 2 );
/**
* @param enumValue
*/
protected UnaryExpressionKind(int enumValue) {
super(enumValue);
}
}
/**
* @param data
* @param scope
* @param kind
* @param type TODO
* @return
*/
protected IASTExpression performUnaryExpression(IParserData data, IASTScope scope, CompletionKind kind, UnaryExpressionKind type) {
IToken startingPoint = null;
try
{
if( type == UnaryExpressionKind.ALIGNOF )
startingPoint = data.consume(IGCCToken.t___alignof__);
else if( type == UnaryExpressionKind.TYPEOF )
startingPoint = data.consume(IGCCToken.t_typeof );
} catch( BacktrackException b )
{
return null;
} catch (EndOfFileException e) {
return null;
}
try
{
IToken mark = data.mark();
IASTTypeId d = null;
IASTExpression unaryExpression = null;
if (data.LT(1) == IToken.tLPAREN)
{
try
{
data.consume(IToken.tLPAREN);
d = data.typeId(scope, false, CompletionKind.TYPE_REFERENCE);
data.consume(IToken.tRPAREN);
}
catch (BacktrackException bt)
{
data.backup(mark);
d = null;
unaryExpression = data.unaryExpression(scope,kind);
}
}
else
{
unaryExpression = data.unaryExpression(scope,kind);
}
if (d != null & unaryExpression == null)
try
{
IASTExpression.Kind expKind = null;
if( type == UnaryExpressionKind.ALIGNOF )
expKind = IASTGCCExpression.Kind.UNARY_ALIGNOF_TYPEID;
else if( type == UnaryExpressionKind.TYPEOF )
expKind = IASTGCCExpression.Kind.UNARY_TYPEOF_TYPEID;
return data.getAstFactory().createExpression(
scope,
expKind,
null,
null,
null,
d,
null, EMPTY_STRING, null);
}
catch (ASTSemanticException e)
{
data.backup( startingPoint );
return null;
} catch (Exception e)
{
data.logException( "unaryExpression_1::createExpression()", e ); //$NON-NLS-1$
data.backup( startingPoint );
return null;
}
else if (unaryExpression != null && d == null)
try
{
IASTExpression.Kind expKind = null;
if( type == UnaryExpressionKind.ALIGNOF )
expKind = IASTGCCExpression.Kind.UNARY_ALIGNOF_UNARYEXPRESSION;
else if( type == UnaryExpressionKind.TYPEOF )
expKind = IASTGCCExpression.Kind.UNARY_TYPEOF_UNARYEXPRESSION;
return data.getAstFactory().createExpression(
scope,
expKind,
unaryExpression,
null,
null,
null,
null, EMPTY_STRING, null);
}
catch (ASTSemanticException e1)
{
data.backup( startingPoint );
return null;
} catch (Exception e)
{
data.logException( "unaryExpression_1::createExpression()", e ); //$NON-NLS-1$
data.backup( startingPoint );
return null;
}
return null;
}
catch( BacktrackException bt )
{
data.backup( startingPoint );
return null;
}
catch( EndOfFileException eof )
{
data.backup( startingPoint );
return null;
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.extension.IParserExtension#canHandleDeclSpecifierSequence(int)
*/
public boolean canHandleDeclSpecifierSequence(int tokenType) {
switch( tokenType )
{
case IGCCToken.t_typeof:
return true;
default:
return false;
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.extension.IParserExtension#handleDeclSpecifierSequence(org.eclipse.cdt.internal.core.parser.IParserData, org.eclipse.cdt.core.model.Flags, org.eclipse.cdt.internal.core.parser.DeclarationWrapper)
*/
public IDeclSpecifierExtensionResult handleDeclSpecifierSequence(IParserData data, Parser.Flags flags, DeclarationWrapper sdw, CompletionKind kind) {
IToken startingPoint = null;
try
{
startingPoint = data.mark();
} catch( EndOfFileException eof )
{
return null;
}
try
{
switch( data.LT(1))
{
case IGCCToken.t_typeof:
IASTExpression typeOfExpression = performUnaryExpression( data, sdw.getScope(), kind, UnaryExpressionKind.TYPEOF );
if( typeOfExpression != null )
{
sdw.setSimpleType( IASTGCCSimpleTypeSpecifier.Type.TYPEOF );
flags.setEncounteredRawType(true);
Hashtable params = new Hashtable();
params.put( ASTGCCSimpleTypeSpecifier.TYPEOF_EXRESSION, typeOfExpression );
sdw.setExtensionParameter( ASTGCCSimpleTypeSpecifier.TYPEOF_EXRESSION, typeOfExpression );
return new GCCDeclSpecifierExtensionResult( startingPoint, data.getLastToken(), flags, params );
}
data.backup( startingPoint );
return null;
default:
data.backup( startingPoint );
return null;
}
}
// catch( BacktrackException bt )
// {
//
// }
catch( EndOfFileException eof )
{
data.backup( startingPoint );
}
return null;
}
public class GCCDeclSpecifierExtensionResult implements IDeclSpecifierExtensionResult
{
private final IToken first;
private final IToken last;
private final Flags flags;
/**
* @param startingPoint
* @param token
* @param flags
*/
public GCCDeclSpecifierExtensionResult(IToken startingPoint, IToken token, Flags flags, Hashtable params) {
first = startingPoint;
last = token;
this.flags = flags;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.extension.IParserExtension.IDeclSpecifierExtensionResult#getFirstToken()
*/
public IToken getFirstToken() {
return first;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.extension.IParserExtension.IDeclSpecifierExtensionResult#getLastToken()
*/
public IToken getLastToken() {
return last;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.extension.IParserExtension.IDeclSpecifierExtensionResult#getFlags()
*/
public Flags getFlags() {
return flags;
}
}
}

View file

@ -0,0 +1,101 @@
/**********************************************************************
* Copyright (c) 2002,2003 Rational Software Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v0.5
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v05.html
*
* Contributors:
* IBM Rational Software - Initial API and implementation */
package org.eclipse.cdt.internal.core.parser;
import org.eclipse.cdt.core.parser.BacktrackException;
import org.eclipse.cdt.core.parser.EndOfFileException;
import org.eclipse.cdt.core.parser.IParserLogService;
import org.eclipse.cdt.core.parser.IToken;
import org.eclipse.cdt.core.parser.ast.IASTExpression;
import org.eclipse.cdt.core.parser.ast.IASTFactory;
import org.eclipse.cdt.core.parser.ast.IASTScope;
import org.eclipse.cdt.core.parser.ast.IASTTypeId;
import org.eclipse.cdt.core.parser.ast.IASTCompletionNode.CompletionKind;
/**
* @author jcamelon
*
*/
public interface IParserData {
/**
* @return Returns the astFactory.
*/
public abstract IASTFactory getAstFactory();
/**
* @return Returns the log.
*/
public abstract IParserLogService getLog();
/**
* Look Ahead in the token list to see what is coming.
*
* @param i How far ahead do you wish to peek?
* @return the token you wish to observe
* @throws EndOfFileException if looking ahead encounters EOF, throw EndOfFile
*/
public abstract IToken LA(int i) throws EndOfFileException;
/**
* Look ahead in the token list and return the token type.
*
* @param i How far ahead do you wish to peek?
* @return The type of that token
* @throws EndOfFileException if looking ahead encounters EOF, throw EndOfFile
*/
public abstract int LT(int i) throws EndOfFileException;
/**
* Consume the next token available, regardless of the type.
*
* @return The token that was consumed and removed from our buffer.
* @throws EndOfFileException If there is no token to consume.
*/
public abstract IToken consume() throws EndOfFileException;
/**
* Consume the next token available only if the type is as specified.
*
* @param type The type of token that you are expecting.
* @return the token that was consumed and removed from our buffer.
* @throws BacktrackException If LT(1) != type
*/
public abstract IToken consume(int type) throws EndOfFileException,
BacktrackException;
/**
* Mark our place in the buffer so that we could return to it should we have to.
*
* @return The current token.
* @throws EndOfFileException If there are no more tokens.
*/
public abstract IToken mark() throws EndOfFileException;
/**
* Rollback to a previous point, reseting the queue of tokens.
*
* @param mark The point that we wish to restore to.
*
*/
public abstract void backup(IToken mark);
/**
* @param string
* @param e
*/
public abstract void logException(String string, Exception e);
/**
* @param scope
* @param b
* @param kind
* @return
*/
public IASTTypeId typeId(IASTScope scope, boolean b, CompletionKind kind) throws EndOfFileException, BacktrackException;
/**
* @param scope
* @param kind
* @return
*/
public IASTExpression unaryExpression(IASTScope scope, CompletionKind kind) throws EndOfFileException, BacktrackException;
/**
* @return
*/
public IToken getLastToken();
}

View file

@ -21,18 +21,22 @@ import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.parser.ParserFactory;
import org.eclipse.cdt.core.parser.ParserFactoryError;
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.extension.ExtensionDialect;
import org.eclipse.cdt.core.parser.extension.IParserExtensionFactory;
/**
* @author jcamelon
*/
public class InternalParserUtil extends ParserFactory {
private static IParserExtensionFactory extensionFactory = new ParserExtensionFactory( ExtensionDialect.GCC );
public static IExpressionParser createExpressionParser( IScanner scanner, ParserLanguage language, IParserLogService log ) throws ParserFactoryError
{
if( scanner == null ) throw new ParserFactoryError( ParserFactoryError.Kind.NULL_SCANNER );
if( language == null ) throw new ParserFactoryError( ParserFactoryError.Kind.NULL_LANGUAGE );
IParserLogService logService = ( log == null ) ? createDefaultLogService() : log;
return new ExpressionParser( scanner, language, logService );
return new ExpressionParser( scanner, language, logService, extensionFactory.createParserExtension() );
}
/**

View file

@ -56,6 +56,7 @@ import org.eclipse.cdt.core.parser.ast.IASTUsingDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTUsingDirective;
import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier.ClassNameType;
import org.eclipse.cdt.core.parser.ast.IASTCompletionNode.CompletionKind;
import org.eclipse.cdt.core.parser.extension.IParserExtension;
import org.eclipse.cdt.internal.core.parser.token.KeywordSets;
import org.eclipse.cdt.internal.core.parser.token.TokenDuple;
import org.eclipse.cdt.internal.core.parser.token.KeywordSets.Key;
@ -69,28 +70,23 @@ import org.eclipse.cdt.internal.core.parser.util.TraceUtil;
*
* @author jcamelon
*/
public abstract class Parser extends ExpressionParser implements IParser
public abstract class Parser extends ExpressionParser implements IParser
{
private static final List EMPTY_LIST = new ArrayList();
protected ISourceElementRequestor requestor = null;
/**
* This is the standard cosntructor that we expect the Parser to be instantiated
* with.
*
* @param s IScanner instance that has been initialized to the code input
* @param c IParserCallback instance that will receive callbacks as we parse
* @param quick Are we asking for a high level parse or not?
*/
public Parser(
IScanner scanner,
ISourceElementRequestor callback,
ParserLanguage language,
IParserLogService log )
IParserLogService log, IParserExtension extension )
{
super( scanner, language, log );
super( scanner, language, log, extension );
requestor = callback;
}
@ -979,7 +975,7 @@ public abstract class Parser extends ExpressionParser implements IParser
sdw.isTypeNamed(),
sdw.isComplex(),
sdw.isImaginary(),
sdw.isGloballyQualified()));
sdw.isGloballyQualified(), sdw.getExtensionParameters()));
}
catch (Exception e1)
{
@ -1221,7 +1217,7 @@ public abstract class Parser extends ExpressionParser implements IParser
sdw.isTypeNamed(),
sdw.isComplex(),
sdw.isImaginary(),
sdw.isGloballyQualified()));
sdw.isGloballyQualified(), null));
}
catch (ASTSemanticException e)
{
@ -1247,7 +1243,7 @@ public abstract class Parser extends ExpressionParser implements IParser
/**
* This class represents the state and strategy for parsing declarationSpecifierSequences
*/
private class Flags
public class Flags
{
private boolean encounteredTypename = false;
// have we encountered a typeName yet?
@ -1663,11 +1659,25 @@ public abstract class Parser extends ExpressionParser implements IParser
break;
}
default :
if( extension.canHandleDeclSpecifierSequence( LT(1)))
{
IParserExtension.IDeclSpecifierExtensionResult declSpecExtResult = extension.handleDeclSpecifierSequence( this, flags, sdw, kind );
if( declSpecExtResult != null )
{
flags = declSpecExtResult.getFlags();
if( typeNameBegin == null )
typeNameBegin = declSpecExtResult.getFirstToken();
typeNameEnd = declSpecExtResult.getLastToken();
break;
}
break declSpecifiers;
}
break declSpecifiers;
}
}
if (typeNameBegin != null)
sdw.setTypeName(new TokenDuple(typeNameBegin, typeNameEnd));
return;
}
/**
* Parse an elaborated type specifier.

View file

@ -12,13 +12,12 @@ package org.eclipse.cdt.internal.core.parser;
import org.eclipse.cdt.core.parser.ParserFactoryError;
import org.eclipse.cdt.core.parser.ParserMode;
import org.eclipse.cdt.core.parser.ast.extension.IASTExtensionFactory;
import org.eclipse.cdt.core.parser.extension.ExtensionDialect;
import org.eclipse.cdt.core.parser.extension.IASTFactoryExtension;
import org.eclipse.cdt.core.parser.extension.IParserExtension;
import org.eclipse.cdt.core.parser.extension.IParserExtensionFactory;
import org.eclipse.cdt.core.parser.extension.IScannerExtension;
import org.eclipse.cdt.internal.core.parser.ast.complete.extension.CompleteParseASTExtensionFactory;
import org.eclipse.cdt.internal.core.parser.ast.quick.extension.QuickParseASTExtensionFactory;
import org.eclipse.cdt.internal.core.parser.ast.GCCASTExtension;
import org.eclipse.cdt.internal.core.parser.scanner.GCCScannerExtension;
/**
@ -26,7 +25,6 @@ import org.eclipse.cdt.internal.core.parser.scanner.GCCScannerExtension;
*/
public class ParserExtensionFactory implements IParserExtensionFactory {
private final ExtensionDialect dialect;
/**
@ -46,24 +44,22 @@ public class ParserExtensionFactory implements IParserExtensionFactory {
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.extension.IParserExtensionFactory#createASTExtensionFactory()
* @see org.eclipse.cdt.core.parser.extension.IParserExtensionFactory#createParserExtension()
*/
public IASTExtensionFactory createASTExtensionFactory(ParserMode mode) throws ParserFactoryError {
public IParserExtension createParserExtension() throws ParserFactoryError
{
if( dialect == ExtensionDialect.GCC )
{
if( mode == ParserMode.QUICK_PARSE || mode == ParserMode.EXPRESSION_PARSE )
return new QuickParseASTExtensionFactory();
return new CompleteParseASTExtensionFactory();
}
return new GCCParserExtension();
throw new ParserFactoryError( ParserFactoryError.Kind.BAD_DIALECT );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.extension.IParserExtensionFactory#createParserExtension()
* @see org.eclipse.cdt.core.parser.extension.IParserExtensionFactory#createASTExtension(org.eclipse.cdt.core.parser.ParserMode)
*/
public IParserExtension createParserExtension() throws ParserFactoryError
{ // TODO Auto-generated method stub
return null;
public IASTFactoryExtension createASTExtension(ParserMode mode) {
if( dialect == ExtensionDialect.GCC )
return new GCCASTExtension( mode );
throw new ParserFactoryError( ParserFactoryError.Kind.BAD_DIALECT );
}
}

View file

@ -23,6 +23,7 @@ import org.eclipse.cdt.core.parser.ParseError.ParseErrorKind;
import org.eclipse.cdt.core.parser.ast.IASTCompletionNode;
import org.eclipse.cdt.core.parser.ast.IASTNode;
import org.eclipse.cdt.core.parser.ast.IASTScope;
import org.eclipse.cdt.core.parser.extension.IParserExtension;
/**
* @author jcamelon
@ -36,8 +37,8 @@ public class QuickParser extends Parser {
* @param language
* @param log
*/
public QuickParser(IScanner scanner, ISourceElementRequestor callback, ParserLanguage language, IParserLogService log) {
super(scanner, callback, language, log);
public QuickParser(IScanner scanner, ISourceElementRequestor callback, ParserLanguage language, IParserLogService log, IParserExtension extension) {
super(scanner, callback, language, log, extension);
}
protected void handleFunctionBody(IASTScope scope) throws BacktrackException, EndOfFileException

View file

@ -23,6 +23,7 @@ import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.ast.IASTCompletionNode;
import org.eclipse.cdt.core.parser.ast.IASTNode;
import org.eclipse.cdt.core.parser.ast.IASTScope;
import org.eclipse.cdt.core.parser.extension.IParserExtension;
import org.eclipse.cdt.internal.core.parser.token.OffsetDuple;
import org.eclipse.cdt.internal.core.parser.token.TokenDuple;
import org.eclipse.cdt.internal.core.parser.util.TraceUtil;
@ -79,8 +80,8 @@ public class SelectionParser extends ContextualParser {
* @param language
* @param log
*/
public SelectionParser(IScanner scanner, ISourceElementRequestor callback, ParserLanguage language, IParserLogService log) {
super(scanner, callback, language, log);
public SelectionParser(IScanner scanner, ISourceElementRequestor callback, ParserLanguage language, IParserLogService log, IParserExtension extension ) {
super(scanner, callback, language, log,extension);
}
/* (non-Javadoc)

View file

@ -24,6 +24,7 @@ import org.eclipse.cdt.core.parser.ParseError.ParseErrorKind;
import org.eclipse.cdt.core.parser.ast.IASTCompletionNode;
import org.eclipse.cdt.core.parser.ast.IASTNode;
import org.eclipse.cdt.core.parser.ast.IASTScope;
import org.eclipse.cdt.core.parser.extension.IParserExtension;
/**
* @author jcamelon
@ -36,8 +37,8 @@ public class StructuralParser extends Parser implements IParser {
* @param language
* @param logService
*/
public StructuralParser(IScanner scanner, ISourceElementRequestor ourCallback, ParserLanguage language, IParserLogService logService) {
super(scanner, ourCallback, language, logService);
public StructuralParser(IScanner scanner, ISourceElementRequestor ourCallback, ParserLanguage language, IParserLogService logService, IParserExtension extension ) {
super(scanner, ourCallback, language, logService, extension );
setupASTFactory(scanner, language );
}

View file

@ -0,0 +1,132 @@
/**********************************************************************
* Copyright (c) 2002,2003 Rational Software Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v0.5
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v05.html
*
* Contributors:
* IBM Rational Software - Initial API and implementation */
package org.eclipse.cdt.internal.core.parser.ast;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import org.eclipse.cdt.core.parser.ITokenDuple;
import org.eclipse.cdt.core.parser.ParserMode;
import org.eclipse.cdt.core.parser.ast.IASTExpression;
import org.eclipse.cdt.core.parser.ast.IASTScope;
import org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTTypeId;
import org.eclipse.cdt.core.parser.ast.IASTExpression.IASTNewExpressionDescriptor;
import org.eclipse.cdt.core.parser.ast.IASTExpression.Kind;
import org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier.Type;
import org.eclipse.cdt.core.parser.ast.gcc.IASTGCCExpression;
import org.eclipse.cdt.core.parser.ast.gcc.IASTGCCSimpleTypeSpecifier;
import org.eclipse.cdt.core.parser.extension.IASTFactoryExtension;
import org.eclipse.cdt.internal.core.parser.ast.complete.ASTExpression;
import org.eclipse.cdt.internal.core.parser.ast.complete.ASTTypeId;
import org.eclipse.cdt.internal.core.parser.ast.complete.gcc.ASTGCCSimpleTypeSpecifier;
import org.eclipse.cdt.internal.core.parser.ast.expression.gcc.ASTGCCExpression;
import org.eclipse.cdt.internal.core.parser.pst.ISymbol;
import org.eclipse.cdt.internal.core.parser.pst.ParserSymbolTable;
import org.eclipse.cdt.internal.core.parser.pst.TypeInfo;
/**
* @author jcamelon
*
*/
public class GCCASTExtension implements IASTFactoryExtension {
private final ParserMode mode;
private static final String EMPTY_STRING = ""; //$NON-NLS-1$
private static final List EMPTY_LIST = new ArrayList( 0 );
/**
* @param mode
*/
public GCCASTExtension(ParserMode mode) {
this.mode = mode;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.extension.IASTFactoryExtension#overrideExpressionFactory()
*/
public boolean overrideCreateExpressionMethod() {
if( mode == ParserMode.EXPRESSION_PARSE )
return true;
return false;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.extension.IASTFactoryExtension#createExpression(org.eclipse.cdt.core.parser.ast.IASTScope, org.eclipse.cdt.core.parser.ast.IASTExpression.Kind, org.eclipse.cdt.core.parser.ast.IASTExpression, org.eclipse.cdt.core.parser.ast.IASTExpression, org.eclipse.cdt.core.parser.ast.IASTExpression, org.eclipse.cdt.core.parser.ast.IASTTypeId, org.eclipse.cdt.core.parser.ITokenDuple, java.lang.String, org.eclipse.cdt.core.parser.ast.IASTExpression.IASTNewExpressionDescriptor)
*/
public IASTExpression createExpression(IASTScope scope, Kind kind,
IASTExpression lhs, IASTExpression rhs,
IASTExpression thirdExpression, IASTTypeId typeId,
ITokenDuple idExpression, String literal,
IASTNewExpressionDescriptor newDescriptor)
{
return new ASTGCCExpression( kind, lhs, rhs, thirdExpression, typeId, idExpression == null ? "" : idExpression.toString(), literal, newDescriptor );
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.extension.IASTFactoryExtension#canHandleExpressionKind(org.eclipse.cdt.core.parser.ast.IASTExpression.Kind)
*/
public boolean canHandleExpressionKind(Kind kind) {
if( kind == IASTGCCExpression.Kind.UNARY_ALIGNOF_TYPEID ||
kind == IASTGCCExpression.Kind.UNARY_ALIGNOF_UNARYEXPRESSION ||
kind == IASTGCCExpression.Kind.UNARY_TYPEOF_UNARYEXPRESSION ||
kind == IASTGCCExpression.Kind.UNARY_TYPEOF_TYPEID )
return true;
return false;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.extension.IASTFactoryExtension#getExpressionResultType(org.eclipse.cdt.internal.core.parser.pst.TypeInfo, org.eclipse.cdt.core.parser.ast.IASTExpression.Kind, org.eclipse.cdt.core.parser.ast.IASTExpression, org.eclipse.cdt.core.parser.ast.IASTExpression, org.eclipse.cdt.core.parser.ast.IASTExpression, org.eclipse.cdt.core.parser.ast.IASTTypeId, org.eclipse.cdt.internal.core.parser.pst.ISymbol)
*/
public TypeInfo getExpressionResultType(Kind kind, IASTExpression lhs, IASTExpression rhs, IASTTypeId typeId) {
TypeInfo info = null;
if( kind == IASTGCCExpression.Kind.UNARY_ALIGNOF_TYPEID ||
kind == IASTGCCExpression.Kind.UNARY_ALIGNOF_UNARYEXPRESSION )
{
info = new TypeInfo();
info.setType(TypeInfo.t_int);
info.setBit(true, TypeInfo.isUnsigned);
}
else if( kind == IASTGCCExpression.Kind.UNARY_TYPEOF_TYPEID )
{
if( typeId instanceof ASTTypeId )
info = new TypeInfo( ((ASTTypeId)typeId).getTypeSymbol().getTypeInfo() );
}
else if ( kind == IASTGCCExpression.Kind.UNARY_TYPEOF_UNARYEXPRESSION )
{
if( lhs instanceof ASTExpression )
info = new TypeInfo( ((ASTExpression)lhs).getResultType().getResult() );
}
if( info != null )
return info;
return new TypeInfo();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.extension.IASTFactoryExtension#overrideCreateSimpleTypeSpecifierMethod()
*/
public boolean overrideCreateSimpleTypeSpecifierMethod(Type type) {
if( type == IASTGCCSimpleTypeSpecifier.Type.TYPEOF )
return true;
return false;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.extension.IASTFactoryExtension#createSimpleTypeSpecifier(org.eclipse.cdt.core.parser.ast.IASTScope, org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier.Type, org.eclipse.cdt.core.parser.ITokenDuple, boolean, boolean, boolean, boolean, boolean, boolean, boolean, boolean)
*/
public IASTSimpleTypeSpecifier createSimpleTypeSpecifier(ParserSymbolTable pst, IASTScope scope, Type kind, ITokenDuple typeName, boolean isShort, boolean isLong, boolean isSigned, boolean isUnsigned, boolean isTypename, boolean isComplex, boolean isImaginary, boolean isGlobal, Hashtable extensionParms) {
if( kind == IASTGCCSimpleTypeSpecifier.Type.TYPEOF )
{
ASTExpression typeOfExpression = (ASTExpression) extensionParms.get( ASTGCCSimpleTypeSpecifier.TYPEOF_EXRESSION );
ISymbol s = pst.newSymbol( EMPTY_STRING );
s.setTypeInfo( typeOfExpression.getResultType().getResult() );
return new ASTGCCSimpleTypeSpecifier( s, isTypename, ( typeName == null ? EMPTY_STRING : typeName.toString()), EMPTY_LIST, typeOfExpression );
}
return null;
}
}

View file

@ -12,6 +12,7 @@ package org.eclipse.cdt.internal.core.parser.ast.complete;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
@ -71,7 +72,7 @@ import org.eclipse.cdt.core.parser.ast.IASTExpression.IASTNewExpressionDescripto
import org.eclipse.cdt.core.parser.ast.IASTExpression.Kind;
import org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier.Type;
import org.eclipse.cdt.core.parser.ast.IASTTemplateParameter.ParamKind;
import org.eclipse.cdt.core.parser.ast.extension.IASTExtensionFactory;
import org.eclipse.cdt.core.parser.extension.IASTFactoryExtension;
import org.eclipse.cdt.internal.core.parser.ast.BaseASTFactory;
import org.eclipse.cdt.internal.core.parser.problem.IProblemFactory;
import org.eclipse.cdt.internal.core.parser.pst.ForewardDeclaredSymbolExtension;
@ -109,8 +110,8 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
protected static final String EMPTY_STRING = ""; //$NON-NLS-1$
private final static List SUBSCRIPT;
private final static IProblemFactory problemFactory = new ASTProblemFactory();
//private final IASTExtensionFactory extensionFactory;
private final IFilenameProvider fileProvider;
private final IASTFactoryExtension extension;
static
{
@ -131,12 +132,12 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
}
}
public CompleteParseASTFactory( IFilenameProvider filenameProvider, ParserLanguage language, ParserMode mode, IASTExtensionFactory factory )
public CompleteParseASTFactory( IFilenameProvider filenameProvider, ParserLanguage language, ParserMode mode, IASTFactoryExtension extension )
{
super();
pst = new ParserSymbolTable( language, mode );
fileProvider = filenameProvider;
// extensionFactory = factory;
this.extension = extension;
}
/*
@ -1282,8 +1283,16 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
String literal,
ISymbol symbol) throws ASTSemanticException{
ExpressionResult result = null;
TypeInfo info = new TypeInfo();
if( extension.canHandleExpressionKind( kind ))
{
extension.getExpressionResultType( kind, lhs, rhs, typeId );
return new ExpressionResult( info );
}
ExpressionResult result = null;
if( literal != null && !literal.equals(EMPTY_STRING) ){
info.setDefault( literal );
}
@ -1742,8 +1751,10 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
boolean isTypename,
boolean isComplex,
boolean isImaginary,
boolean isGlobal ) throws ASTSemanticException
boolean isGlobal, Hashtable extensionParms ) throws ASTSemanticException
{
if( extension.overrideCreateSimpleTypeSpecifierMethod( kind ))
return extension.createSimpleTypeSpecifier(pst, scope, kind, typeName, isShort, isLong, isSigned, isUnsigned, isTypename, isComplex, isImaginary, isGlobal, extensionParms );
TypeInfo.eType type = null;
if( kind == IASTSimpleTypeSpecifier.Type.CLASS_OR_TYPENAME )
@ -2209,7 +2220,7 @@ public class CompleteParseASTFactory extends BaseASTFactory implements IASTFacto
if( references == null )
{
references = new ArrayList();
if( nameDuple.length() != 1 )
if( nameDuple.length() > 2 ) // destructor
{
ITokenDuple leadingSegments = nameDuple.getLeadingSegments();
ISymbol test = lookupQualifiedName( ownerScope, leadingSegments, references, false );

View file

@ -1,37 +0,0 @@
/*******************************************************************************
* Copyright (c) 2000 - 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.parser.ast.complete.extension;
import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException;
import org.eclipse.cdt.core.parser.ast.extension.IASTExpressionExtension;
import org.eclipse.cdt.core.parser.ast.extension.IASTExtensionFactory;
/**
* @author jcamelon
*/
public class CompleteParseASTExtensionFactory implements IASTExtensionFactory {
/**
*
*/
public CompleteParseASTExtensionFactory() {
super();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.extension.IASTExtensionFactory#createExpressionExtension(org.eclipse.cdt.core.parser.ast.IASTExpression)
*/
public IASTExpressionExtension createExpressionExtension()
throws ASTNotImplementedException {
throw new ASTNotImplementedException();
}
}

View file

@ -0,0 +1,57 @@
/**********************************************************************
* Copyright (c) 2002,2003 Rational Software Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v0.5
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v05.html
*
* Contributors:
* IBM Rational Software - Initial API and implementation */
package org.eclipse.cdt.internal.core.parser.ast.complete.gcc;
import java.util.List;
import org.eclipse.cdt.core.parser.ast.IASTExpression;
import org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier;
import org.eclipse.cdt.core.parser.ast.gcc.IASTGCCSimpleTypeSpecifier;
import org.eclipse.cdt.internal.core.parser.ast.complete.ASTSimpleTypeSpecifier;
import org.eclipse.cdt.internal.core.parser.pst.ISymbol;
/**
* @author jcamelon
*
*/
public class ASTGCCSimpleTypeSpecifier extends ASTSimpleTypeSpecifier implements IASTGCCSimpleTypeSpecifier {
public static final String TYPEOF_EXRESSION = "TYPEOF EXPRESSION"; //$NON-NLS-1$
private final IASTExpression expression;
/**
* @param s
* @param b
* @param string
* @param references
*/
public ASTGCCSimpleTypeSpecifier(ISymbol s, boolean b, String string, List references, IASTExpression typeOfExpression ) {
super(s, b, string, references);
expression = typeOfExpression;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier#getType()
*/
public IASTSimpleTypeSpecifier.Type getType() {
if( expression != null ) return IASTGCCSimpleTypeSpecifier.Type.TYPEOF;
return super.getType();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.gcc.IASTGCCSimpleTypeSpecifier#getTypeOfExpression()
*/
public IASTExpression getTypeOfExpression() {
return expression;
}
}

View file

@ -11,7 +11,6 @@ import org.eclipse.cdt.core.parser.ast.ASTExpressionEvaluationException;
import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException;
import org.eclipse.cdt.core.parser.ast.IASTExpression;
import org.eclipse.cdt.core.parser.ast.IASTTypeId;
import org.eclipse.cdt.core.parser.ast.extension.IASTExpressionExtension;
@ -25,7 +24,6 @@ public class ASTExpression implements IASTExpression {
private final IASTTypeId typeId;
private final String literal, idExpression;
private final IASTNewExpressionDescriptor newDescriptor;
private final IASTExpressionExtension extension;
/**
* @param kind
@ -35,7 +33,7 @@ public class ASTExpression implements IASTExpression {
* @param typeId
* @param literal
*/
public ASTExpression(Kind kind, IASTExpression lhs, IASTExpression rhs, IASTExpression third, IASTTypeId typeId, String idExpression, String literal, IASTNewExpressionDescriptor newDescriptor, IASTExpressionExtension extension) {
public ASTExpression(Kind kind, IASTExpression lhs, IASTExpression rhs, IASTExpression third, IASTTypeId typeId, String idExpression, String literal, IASTNewExpressionDescriptor newDescriptor ) {
this.kind = kind;
this.lhs =lhs;
this.rhs = rhs;
@ -44,8 +42,6 @@ public class ASTExpression implements IASTExpression {
this.literal = literal;
this.newDescriptor = newDescriptor;
this.idExpression = idExpression;
this.extension = extension;
this.extension.setExpression(this);
}
/* (non-Javadoc)
@ -173,7 +169,7 @@ public class ASTExpression implements IASTExpression {
if( getExpressionKind() == IASTExpression.Kind.LOGICALOREXPRESSION )
return( ( getLHSExpression().evaluateExpression() != 0 ) || ( getRHSExpression().evaluateExpression() != 0 ) ) ? 1 : 0 ;
return extension.evaluateExpression();
throw new ASTExpressionEvaluationException();
}
/* (non-Javadoc)

View file

@ -10,6 +10,7 @@
*******************************************************************************/
package org.eclipse.cdt.internal.core.parser.ast.expression;
import java.util.Hashtable;
import java.util.List;
import org.eclipse.cdt.core.parser.IMacroDescriptor;
@ -17,7 +18,6 @@ import org.eclipse.cdt.core.parser.IToken;
import org.eclipse.cdt.core.parser.ITokenDuple;
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
import org.eclipse.cdt.core.parser.ast.ASTClassKind;
import org.eclipse.cdt.core.parser.ast.ASTExpressionEvaluationException;
import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException;
import org.eclipse.cdt.core.parser.ast.ASTPointerOperator;
import org.eclipse.cdt.core.parser.ast.ASTSemanticException;
@ -65,8 +65,7 @@ import org.eclipse.cdt.core.parser.ast.IASTExpression.IASTNewExpressionDescripto
import org.eclipse.cdt.core.parser.ast.IASTExpression.Kind;
import org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier.Type;
import org.eclipse.cdt.core.parser.ast.IASTTemplateParameter.ParamKind;
import org.eclipse.cdt.core.parser.ast.extension.IASTExpressionExtension;
import org.eclipse.cdt.core.parser.ast.extension.IASTExtensionFactory;
import org.eclipse.cdt.core.parser.extension.IASTFactoryExtension;
import org.eclipse.cdt.internal.core.parser.ast.BaseASTFactory;
/**
@ -74,13 +73,15 @@ import org.eclipse.cdt.internal.core.parser.ast.BaseASTFactory;
*/
public class ExpressionParseASTFactory extends BaseASTFactory implements IASTFactory {
private final IASTExtensionFactory extensionFactory;
private final IASTFactoryExtension extension;
/**
* @param factory
*/
public ExpressionParseASTFactory(IASTExtensionFactory factory) {
this.extensionFactory = factory;
public ExpressionParseASTFactory( IASTFactoryExtension extension ) {
this.extension = extension;
}
/*
@ -378,7 +379,8 @@ public class ExpressionParseASTFactory extends BaseASTFactory implements IASTFac
String literal,
IASTNewExpressionDescriptor newDescriptor)
throws ASTSemanticException {
try {
if( extension.overrideCreateExpressionMethod() )
return extension.createExpression(scope, kind, lhs, rhs, thirdExpression, typeId, idExpression, literal, newDescriptor );
return new ASTExpression(
kind,
lhs,
@ -387,29 +389,8 @@ public class ExpressionParseASTFactory extends BaseASTFactory implements IASTFac
typeId,
idExpression == null ? "" : idExpression.toString(), //$NON-NLS-1$
literal,
newDescriptor,
extensionFactory.createExpressionExtension());
} catch (ASTNotImplementedException e) {
return new ASTExpression(
kind,
lhs,
rhs,
thirdExpression,
typeId,
idExpression == null ? "" : idExpression.toString(), //$NON-NLS-1$
literal,
newDescriptor,
new IASTExpressionExtension() {
public void setExpression(IASTExpression expression) {
}
public int evaluateExpression()
throws ASTExpressionEvaluationException {
throw new ASTExpressionEvaluationException();
}
});
}
newDescriptor );
}
/*
@ -503,7 +484,7 @@ public class ExpressionParseASTFactory extends BaseASTFactory implements IASTFac
boolean isTypename,
boolean isComplex,
boolean isImaginary,
boolean isGlobal)
boolean isGlobal, Hashtable extensionParms)
throws ASTSemanticException {
// TODO Auto-generated method stub
return null;

View file

@ -0,0 +1,47 @@
/**********************************************************************
* Copyright (c) 2002,2003 Rational Software Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v0.5
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v05.html
*
* Contributors:
* IBM Rational Software - Initial API and implementation */
package org.eclipse.cdt.internal.core.parser.ast.expression.gcc;
import org.eclipse.cdt.core.parser.ast.ASTExpressionEvaluationException;
import org.eclipse.cdt.core.parser.ast.IASTExpression;
import org.eclipse.cdt.core.parser.ast.IASTTypeId;
import org.eclipse.cdt.internal.core.parser.ast.expression.ASTExpression;
/**
* @author jcamelon
*
*/
public class ASTGCCExpression extends ASTExpression {
/**
* @param kind
* @param lhs
* @param rhs
* @param third
* @param typeId
* @param idExpression
* @param literal
* @param newDescriptor
*/
public ASTGCCExpression(Kind kind, IASTExpression lhs, IASTExpression rhs, IASTExpression third, IASTTypeId typeId, String idExpression, String literal, IASTNewExpressionDescriptor newDescriptor) {
super(kind, lhs, rhs, third, typeId, idExpression, literal, newDescriptor);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTExpression#evaluateExpression()
*/
public int evaluateExpression() throws ASTExpressionEvaluationException {
if( getExpressionKind() == Kind.ID_EXPRESSION )
return 0;
return super.evaluateExpression();
}
}

View file

@ -10,12 +10,12 @@
***********************************************************************/
package org.eclipse.cdt.internal.core.parser.ast.quick;
import java.util.Hashtable;
import java.util.List;
import org.eclipse.cdt.core.parser.ITokenDuple;
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
import org.eclipse.cdt.core.parser.ast.ASTClassKind;
import org.eclipse.cdt.core.parser.ast.ASTExpressionEvaluationException;
import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException;
import org.eclipse.cdt.core.parser.ast.ASTPointerOperator;
import org.eclipse.cdt.core.parser.ast.IASTASMDefinition;
@ -58,8 +58,6 @@ import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier.ClassNameType;
import org.eclipse.cdt.core.parser.ast.IASTExpression.IASTNewExpressionDescriptor;
import org.eclipse.cdt.core.parser.ast.IASTExpression.Kind;
import org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier.Type;
import org.eclipse.cdt.core.parser.ast.extension.IASTExpressionExtension;
import org.eclipse.cdt.core.parser.ast.extension.IASTExtensionFactory;
import org.eclipse.cdt.internal.core.parser.ast.BaseASTFactory;
import org.eclipse.cdt.internal.core.parser.ast.expression.ASTExpression;
@ -71,12 +69,11 @@ import org.eclipse.cdt.internal.core.parser.ast.expression.ASTExpression;
public class QuickParseASTFactory extends BaseASTFactory implements IASTFactory {
private static final boolean CREATE_EXCESS_CONSTRUCTS = true;
private final IASTExtensionFactory extensionFactory;
public QuickParseASTFactory( IASTExtensionFactory extensionFactory )
public QuickParseASTFactory( )
{
super();
this.extensionFactory = extensionFactory;
}
/* (non-Javadoc)
@ -162,20 +159,7 @@ public class QuickParseASTFactory extends BaseASTFactory implements IASTFactory
*/
public IASTExpression createExpression(IASTScope scope, Kind kind, IASTExpression lhs, IASTExpression rhs, IASTExpression thirdExpression, IASTTypeId typeId, ITokenDuple idExpression, String literal, IASTNewExpressionDescriptor newDescriptor) {
if( CREATE_EXCESS_CONSTRUCTS )
{
try {
return new ASTExpression( kind, lhs, rhs, thirdExpression, typeId, idExpression == null ? "" : idExpression.toString(), literal, newDescriptor, extensionFactory.createExpressionExtension() ); //$NON-NLS-1$
} catch (ASTNotImplementedException e) {
return new ASTExpression( kind, lhs, rhs, thirdExpression, typeId, idExpression == null ? "" : idExpression.toString(), literal, newDescriptor, new IASTExpressionExtension() { //$NON-NLS-1$
public void setExpression(IASTExpression expression) {
}
public int evaluateExpression() throws ASTExpressionEvaluationException {
throw new ASTExpressionEvaluationException();
} } );
}
}
return new ASTExpression( kind, lhs, rhs, thirdExpression, typeId, idExpression == null ? "" : idExpression.toString(), literal, newDescriptor ); //$NON-NLS-1$
return null;
}
@ -208,7 +192,7 @@ public class QuickParseASTFactory extends BaseASTFactory implements IASTFactory
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.IASTFactory#createSimpleTypeSpecifier(org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier.SimpleType, org.eclipse.cdt.core.parser.ITokenDuple)
*/
public IASTSimpleTypeSpecifier createSimpleTypeSpecifier(IASTScope scope, Type kind, ITokenDuple typeName, boolean isShort, boolean isLong, boolean isSigned, boolean isUnsigned, boolean isTypename, boolean isComplex, boolean isImaginary, boolean isGlobal)
public IASTSimpleTypeSpecifier createSimpleTypeSpecifier(IASTScope scope, Type kind, ITokenDuple typeName, boolean isShort, boolean isLong, boolean isSigned, boolean isUnsigned, boolean isTypename, boolean isComplex, boolean isImaginary, boolean isGlobal, Hashtable extensionParms)
{
return new ASTSimpleTypeSpecifier( kind, typeName, isShort, isLong, isSigned, isUnsigned, isTypename, isComplex, isImaginary);
}

View file

@ -1,40 +0,0 @@
/*******************************************************************************
* Copyright (c) 2000 - 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.parser.ast.quick.extension;
import org.eclipse.cdt.core.parser.ast.ASTExpressionEvaluationException;
import org.eclipse.cdt.core.parser.ast.IASTExpression;
import org.eclipse.cdt.core.parser.ast.IASTExpression.Kind;
import org.eclipse.cdt.core.parser.ast.extension.IASTExpressionExtension;
public final class ASTExpressionExtension implements IASTExpressionExtension {
private IASTExpression expression;
/**
* @param ASTExpression
*/
public ASTExpressionExtension() {
}
public int evaluateExpression() throws ASTExpressionEvaluationException {
if( this.expression.getExpressionKind() == Kind.ID_EXPRESSION )
return 0;
throw new ASTExpressionEvaluationException();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.extension.IASTExpressionExtension#setExpression(org.eclipse.cdt.core.parser.ast.IASTExpression)
*/
public void setExpression(IASTExpression expression) {
this.expression = expression;
}
}

View file

@ -1,35 +0,0 @@
/*******************************************************************************
* Copyright (c) 2000 - 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.parser.ast.quick.extension;
import org.eclipse.cdt.core.parser.ast.extension.IASTExpressionExtension;
import org.eclipse.cdt.core.parser.ast.extension.IASTExtensionFactory;
/**
* @author jcamelon
*/
public class QuickParseASTExtensionFactory implements IASTExtensionFactory {
/**
*
*/
public QuickParseASTExtensionFactory() {
super();
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.ast.extension.IASTExtensionFactory#createExpressionExtension(org.eclipse.cdt.core.parser.ast.IASTExpression)
*/
public IASTExpressionExtension createExpressionExtension() {
return new ASTExpressionExtension();
}
}

View file

@ -11,18 +11,24 @@
package org.eclipse.cdt.internal.core.parser.scanner;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.GCCKeywords;
import org.eclipse.cdt.core.parser.IGCCToken;
import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.parser.IToken;
import org.eclipse.cdt.core.parser.Keywords;
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.ast.IASTInclusion;
import org.eclipse.cdt.core.parser.extension.IScannerExtension;
import org.eclipse.cdt.internal.core.parser.scanner.ScannerUtility.InclusionParseException;
import org.eclipse.cdt.internal.core.parser.token.TokenFactory;
import org.eclipse.cdt.internal.core.parser.util.TraceUtil;
/**
@ -31,6 +37,10 @@ import org.eclipse.cdt.internal.core.parser.util.TraceUtil;
public class GCCScannerExtension implements IScannerExtension {
protected static final String POUND_IDENT = "#ident"; //$NON-NLS-1$
protected static final String POUND_WARNING = "#warning"; //$NON-NLS-1$
protected static final String POUND_INCLUDE_NEXT = "#include_next"; //$NON-NLS-1$
private static final String __CONST__ = "__const__"; //$NON-NLS-1$
private static final String __CONST = "__const"; //$NON-NLS-1$
private static final String __INLINE__ = "__inline__"; //$NON-NLS-1$
@ -39,8 +49,9 @@ public class GCCScannerExtension implements IScannerExtension {
private static final String __RESTRICT = "__restrict"; //$NON-NLS-1$
private static final String __RESTRICT__ = "__restrict__"; //$NON-NLS-1$
private static final String __ASM__ = "__asm__"; //$NON-NLS-1$
private static final String __TYPEOF__ = "__typeof__"; //$NON-NLS-1$
private IScannerData scannerData;
private static final String __ATTRIBUTE__ = "__attribute__"; //$NON-NLS-1$
private static final String __DECLSPEC = "__declspec"; //$NON-NLS-1$
private static final List EMPTY_LIST = new ArrayList();
@ -48,6 +59,8 @@ public class GCCScannerExtension implements IScannerExtension {
private static final List simpleIdentifiersDeclSpec;
private static final List simpleIdentifiersAttribute;
private ParserLanguage language;
static
{
simpleIdentifiersDeclSpec = new ArrayList( 1 );
@ -59,7 +72,7 @@ public class GCCScannerExtension implements IScannerExtension {
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.IScannerExtension#initializeMacroValue(java.lang.String)
*/
public String initializeMacroValue(String original) {
public String initializeMacroValue(IScannerData scannerData, String original) {
if( original == null || original.trim().equals( "") ) //$NON-NLS-1$
return "1"; //$NON-NLS-1$
return original;
@ -68,14 +81,9 @@ public class GCCScannerExtension implements IScannerExtension {
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.IScannerExtension#setupBuiltInMacros()
*/
public void setupBuiltInMacros(ParserLanguage language) {
if( scannerData.getScanner().getDefinition( __ATTRIBUTE__) == null )
scannerData.getScanner().addDefinition( __ATTRIBUTE__, new FunctionMacroDescriptor( __ATTRIBUTE__, simpleIdentifiersDeclSpec, EMPTY_LIST, "" )); //$NON-NLS-1$ $NON-NLS-2$
if( scannerData.getScanner().getDefinition( __DECLSPEC) == null )
scannerData.getScanner().addDefinition( __DECLSPEC, new FunctionMacroDescriptor( __ATTRIBUTE__, simpleIdentifiersDeclSpec, EMPTY_LIST, "" )); //$NON-NLS-1$ $NON-NLS-2$
public void setupBuiltInMacros(IScannerData scannerData, ParserLanguage language) {
this.language = language;
if( language == ParserLanguage.CPP )
if( scannerData.getScanner().getDefinition( IScanner.__CPLUSPLUS ) == null )
scannerData.getScanner().addDefinition( IScanner.__CPLUSPLUS, new ObjectMacroDescriptor( IScanner.__CPLUSPLUS, "1")); //$NON-NLS-1$
@ -85,50 +93,45 @@ public class GCCScannerExtension implements IScannerExtension {
if( scannerData.getScanner().getDefinition( IScanner.__STDC_VERSION__) == null )
scannerData.getScanner().addDefinition( IScanner.__STDC_VERSION__, new ObjectMacroDescriptor( IScanner.__STDC_VERSION__, "199001L")); //$NON-NLS-1$
setupAlternativeKeyword(__CONST__, Keywords.CONST);
setupAlternativeKeyword(__CONST, Keywords.CONST);
setupAlternativeKeyword(__INLINE__, Keywords.INLINE);
setupAlternativeKeyword(__SIGNED__, Keywords.SIGNED);
setupAlternativeKeyword(__VOLATILE__, Keywords.VOLATILE);
if( language == ParserLanguage.C )
{
setupAlternativeKeyword( __RESTRICT, Keywords.RESTRICT);
setupAlternativeKeyword( __RESTRICT__, Keywords.RESTRICT);
}
else
setupAlternativeKeyword( __ASM__, Keywords.ASM );
//TODO - these macros should not be visible as macros in the scanner's definition list
//need to make a public/private table i think
if( scannerData.getScanner().getDefinition( __ATTRIBUTE__) == null )
scannerData.getScanner().addDefinition( __ATTRIBUTE__, new FunctionMacroDescriptor( __ATTRIBUTE__, simpleIdentifiersDeclSpec, EMPTY_LIST, "" )); //$NON-NLS-1$ $NON-NLS-2$
if( scannerData.getScanner().getDefinition( __DECLSPEC) == null )
scannerData.getScanner().addDefinition( __DECLSPEC, new FunctionMacroDescriptor( __ATTRIBUTE__, simpleIdentifiersDeclSpec, EMPTY_LIST, "" )); //$NON-NLS-1$ $NON-NLS-2$
setupAlternativeKeyword(scannerData, __CONST__, Keywords.CONST);
setupAlternativeKeyword(scannerData, __CONST, Keywords.CONST);
setupAlternativeKeyword(scannerData, __INLINE__, Keywords.INLINE);
setupAlternativeKeyword(scannerData, __SIGNED__, Keywords.SIGNED);
setupAlternativeKeyword(scannerData, __VOLATILE__, Keywords.VOLATILE);
setupAlternativeKeyword( scannerData, __RESTRICT, Keywords.RESTRICT);
setupAlternativeKeyword( scannerData, __RESTRICT__, Keywords.RESTRICT);
setupAlternativeKeyword( scannerData, __TYPEOF__, GCCKeywords.TYPEOF );
if( language == ParserLanguage.CPP )
setupAlternativeKeyword( scannerData, __ASM__, Keywords.ASM );
}
/**
* @param scannerData TODO
*
*/
protected void setupAlternativeKeyword(String keyword, String mapping) {
protected void setupAlternativeKeyword(IScannerData scannerData, String keyword, String mapping) {
// alternate keyword forms
// TODO - make this more efficient - update TokenFactory to avoid a context push for these token to token cases
if( scannerData.getScanner().getDefinition( keyword ) == null )
scannerData.getScanner().addDefinition( keyword, new ObjectMacroDescriptor( __CONST__, mapping )); //$NON-NLS-1$
}
public void setScannerData(IScannerData scannerData) {
this.scannerData = scannerData;
}
public Object clone( ) {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
return null;
}
}
private static final Set directives;
static
{
directives = new HashSet();
directives.add( "#include_next" ); //$NON-NLS-1$
directives.add( "#warning"); //$NON-NLS-1$
directives.add( "#ident"); //$NON-NLS-1$
directives.add( POUND_INCLUDE_NEXT );
directives.add( POUND_WARNING);
directives.add( POUND_IDENT);
}
/* (non-Javadoc)
@ -141,8 +144,8 @@ public class GCCScannerExtension implements IScannerExtension {
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.extension.IScannerExtension#handlePreprocessorDirective(java.lang.String, java.lang.String)
*/
public void handlePreprocessorDirective(String directive, String restOfLine) {
if( directive.equals("#include_next") ) //$NON-NLS-1$
public void handlePreprocessorDirective(IScannerData scannerData, String directive, String restOfLine) {
if( directive.equals(POUND_INCLUDE_NEXT) )
{
TraceUtil.outputTrace(scannerData.getLogService(), "GCCScannerExtension handling #include_next directive", null, null, null, null); //$NON-NLS-1$
// figure out the name of the current file and its path
@ -191,7 +194,7 @@ public class GCCScannerExtension implements IScannerExtension {
}
}
else if( directive.equals( "#warning") || directive.equals("#ident")) //$NON-NLS-1$ //$NON-NLS-2$
else if( directive.equals( POUND_WARNING) || directive.equals(POUND_IDENT))
return; // good enough -- the rest of the line has been consumed
}
@ -220,4 +223,39 @@ public class GCCScannerExtension implements IScannerExtension {
Character.isUnicodeIdentifierPart( (char)c);
}
private static final Map additionalCPPKeywords;
private static final Map additionalCKeywords;
static
{
additionalCKeywords = new HashMap();
additionalCKeywords.put( GCCKeywords.__ALIGNOF__, new Integer( IGCCToken.t___alignof__ ));
additionalCKeywords.put( GCCKeywords.TYPEOF, new Integer( IGCCToken.t_typeof ));
additionalCPPKeywords = new HashMap(additionalCKeywords);
additionalCPPKeywords.put( Keywords.RESTRICT, new Integer( IToken.t_restrict ));
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.extension.IScannerExtension#isExtensionKeyword()
*/
public boolean isExtensionKeyword(String tokenImage) {
if( language == ParserLanguage.CPP )
return ( additionalCPPKeywords.get( tokenImage ) != null );
else if( language == ParserLanguage.C )
return ( additionalCKeywords.get( tokenImage ) != null );
return false;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.extension.IScannerExtension#createExtensionToken()
*/
public IToken createExtensionToken(String image, IScannerData scannerData) {
Integer get = null;
if( language == ParserLanguage.CPP )
get = (Integer) additionalCPPKeywords.get( image );
else if( language == ParserLanguage.C )
get = (Integer) additionalCKeywords.get( image );
if( get == null ) return null;
return TokenFactory.createToken(get.intValue(),scannerData);
}
}

View file

@ -116,8 +116,6 @@ public class Scanner implements IScanner {
scannerData = new ScannerData( this, log, requestor, mode, filename, reader, language, new ScannerInfo( definitions, incs ), new ContextStack( this, log ), null );
scannerExtension = extension;
if( scannerExtension instanceof GCCScannerExtension )
((GCCScannerExtension)scannerExtension).setScannerData( scannerData );
scannerData.setDefinitions( definitions );
scannerData.setIncludePathNames( includePaths );
@ -129,9 +127,6 @@ public class Scanner implements IScanner {
scannerData = new ScannerData( this, log, requestor, parserMode, filename, reader, language, info, new ContextStack( this, log ), workingCopies );
scannerExtension = extension;
if( scannerExtension instanceof GCCScannerExtension )
((GCCScannerExtension)scannerExtension).setScannerData( scannerData );
scannerData.setASTFactory( ParserFactory.createASTFactory( this, scannerData.getParserMode(), language ) );
TraceUtil.outputTrace(log, "Scanner constructed with the following configuration:"); //$NON-NLS-1$
@ -148,7 +143,7 @@ public class Scanner implements IScanner {
Object value = m.get( symbolName );
if( value instanceof String )
{
addDefinition( symbolName, scannerExtension.initializeMacroValue((String) value));
addDefinition( symbolName, scannerExtension.initializeMacroValue(scannerData, (String) value));
TraceUtil.outputTrace(log, "\t\tNAME = ", symbolName, " VALUE = ", value.toString() ); //$NON-NLS-1$ //$NON-NLS-2$
++numberOfSymbolsLogged;
@ -182,7 +177,7 @@ public class Scanner implements IScanner {
*/
protected void setupBuiltInMacros() {
scannerExtension.setupBuiltInMacros(scannerData.getLanguage());
scannerExtension.setupBuiltInMacros(scannerData, scannerData.getLanguage());
if( getDefinition(__STDC__) == null )
addDefinition( __STDC__, new ObjectMacroDescriptor( __STDC__, "1") ); //$NON-NLS-1$
@ -469,8 +464,7 @@ public class Scanner implements IScanner {
}
protected IToken newToken(int t, String i) {
IToken theToken = TokenFactory.createToken( t, i, scannerData );
setCurrentToken(theToken);
setCurrentToken(TokenFactory.createToken( t, i, scannerData ));
return currentToken;
}
@ -1183,7 +1177,7 @@ public class Scanner implements IScanner {
Object directive = ppDirectives.get(token);
if (directive == null) {
if( scannerExtension.canHandlePreprocessorDirective( token ) )
scannerExtension.handlePreprocessorDirective( token, getRestOfPreprocessorLine() );
scannerExtension.handlePreprocessorDirective( scannerData, token, getRestOfPreprocessorLine() );
else
{
if( passOnToClient )
@ -1540,9 +1534,22 @@ public class Scanner implements IScanner {
if (tokenTypeObject != null)
return newConstantToken(((Integer) tokenTypeObject).intValue());
else
{
if( scannerExtension.isExtensionKeyword( ident ) )
return newExtensionToken( scannerExtension.createExtensionToken(ident, scannerData ));
return newToken(IToken.tIDENTIFIER, ident);
}
}
/**
* @param token
* @return
*/
protected IToken newExtensionToken(IToken token) {
setCurrentToken( token );
return currentToken;
}
/**
* @param c
* @return
@ -2840,7 +2847,7 @@ public class Scanner implements IScanner {
scannerData.getParserMode(),
scannerData.getLanguage(),
NULL_LOG_SERVICE,
(IScannerExtension)scannerExtension.clone() );
scannerExtension );
tokenizer.setThrowExceptionOnBadCharacterRead(false);
Vector parameterValues = new Vector();

View file

@ -130,7 +130,7 @@ public class ScannerUtility {
private static final IParserLogService NULL_LOG_SERVICE = new NullLogService();
private static final InclusionParseException INCLUSION_PARSE_EXCEPTION = new InclusionParseException();
static InclusionDirective parseInclusionDirective( IScannerData scannerData, IScannerExtension scannerExtension, String includeLine, int baseOffset ) throws InclusionParseException
static InclusionDirective parseInclusionDirective( IScannerData scannerData, IScannerExtension extension, String includeLine, int baseOffset ) throws InclusionParseException
{
try
{
@ -145,7 +145,7 @@ public class ScannerUtility {
scannerData.getDefinitions(), scannerData.getIncludePathNames(),
NULL_REQUESTOR,
scannerData.getParserMode(),
scannerData.getLanguage(), NULL_LOG_SERVICE, (IScannerExtension)(scannerExtension.clone()) );
scannerData.getLanguage(), NULL_LOG_SERVICE, extension );
helperScanner.setForInclusion( true );
IToken t = null;