1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-22 06:02:11 +02:00

cleaning up the architecture of the LR parsers

This commit is contained in:
Mike Kucera 2009-02-04 21:58:18 +00:00
parent b1f0b681d3
commit c9b3182198
85 changed files with 21758 additions and 21477 deletions

View file

@ -11,7 +11,7 @@
%options la=2 %options la=2
%options package=org.eclipse.cdt.internal.core.dom.lrparser.c99 %options package=org.eclipse.cdt.internal.core.dom.lrparser.c99
%options template=FixedBtParserTemplateD.g %options template=LRSecondaryParserTemplate.g
-- All we need to do is import the main parser and redefine the start symbol. -- All we need to do is import the main parser and redefine the start symbol.

View file

@ -11,7 +11,7 @@
%options la=2 %options la=2
%options package=org.eclipse.cdt.internal.core.dom.lrparser.c99 %options package=org.eclipse.cdt.internal.core.dom.lrparser.c99
%options template=FixedBtParserTemplateD.g %options template=LRSecondaryParserTemplate.g
$Import $Import
C99Grammar.g C99Grammar.g

View file

@ -11,19 +11,15 @@
%options la=2 %options la=2
%options package=org.eclipse.cdt.internal.core.dom.lrparser.c99 %options package=org.eclipse.cdt.internal.core.dom.lrparser.c99
%options template=FixedBtParserTemplateD.g %options template=LRParserTemplate.g
-- This file is needed because LPG won't allow redefinition of the -- This file is needed because LPG won't allow redefinition of the
-- start symbol, so C99Grammar.g cannot define a start symbol. -- start symbol, so C99Grammar.g cannot define the start symbol.
$Import $Import
C99Grammar.g C99Grammar.g
$End $End
$Define
$ast_class /. IASTTranslationUnit ./
$End
$Start $Start
translation_unit translation_unit
$End $End

View file

@ -11,7 +11,7 @@
%options la=2 %options la=2
%options package=org.eclipse.cdt.internal.core.dom.lrparser.c99 %options package=org.eclipse.cdt.internal.core.dom.lrparser.c99
%options template=FixedBtParserTemplateD.g %options template=LRSecondaryParserTemplate.g
$Import $Import

View file

@ -11,7 +11,7 @@
%options la=2 %options la=2
%options package=org.eclipse.cdt.internal.core.dom.lrparser.cpp %options package=org.eclipse.cdt.internal.core.dom.lrparser.cpp
%options template=FixedBtParserTemplateD.g %options template=LRSecondaryParserTemplate.g
-- All we need to do is import the main parser and redefine the start symbol. -- All we need to do is import the main parser and redefine the start symbol.

View file

@ -11,7 +11,7 @@
%options la=2 %options la=2
%options package=org.eclipse.cdt.internal.core.dom.lrparser.cpp %options package=org.eclipse.cdt.internal.core.dom.lrparser.cpp
%options template=FixedBtParserTemplateD.g %options template=LRSecondaryParserTemplate.g
$Import $Import
CPPGrammar.g CPPGrammar.g

View file

@ -11,7 +11,7 @@
%options la=2 %options la=2
%options package=org.eclipse.cdt.internal.core.dom.lrparser.cpp %options package=org.eclipse.cdt.internal.core.dom.lrparser.cpp
%options template=FixedBtParserTemplateD.g %options template=LRSecondaryParserTemplate.g
$Import $Import
CPPGrammar.g CPPGrammar.g

View file

@ -11,7 +11,7 @@
%options la=2 %options la=2
%options package=org.eclipse.cdt.internal.core.dom.lrparser.cpp %options package=org.eclipse.cdt.internal.core.dom.lrparser.cpp
%options template=FixedBtParserTemplateD.g %options template=LRParserTemplate.g
-- This file is needed because LPG won't allow redefinition of the -- This file is needed because LPG won't allow redefinition of the
@ -21,10 +21,6 @@ $Import
CPPGrammar.g CPPGrammar.g
$End $End
$Define
$ast_class /. IASTTranslationUnit ./
$End
$Start $Start
translation_unit translation_unit
$End $End

View file

@ -11,7 +11,7 @@
%options la=2 %options la=2
%options package=org.eclipse.cdt.internal.core.dom.lrparser.cpp %options package=org.eclipse.cdt.internal.core.dom.lrparser.cpp
%options template=FixedBtParserTemplateD.g %options template=LRSecondaryParserTemplate.g
$Import $Import

View file

@ -11,7 +11,7 @@
%options la=2 %options la=2
%options package=org.eclipse.cdt.internal.core.dom.lrparser.cpp %options package=org.eclipse.cdt.internal.core.dom.lrparser.cpp
%options template=FixedBtParserTemplateD.g %options template=LRSecondaryParserTemplate.g
-- This parser is a bit of a hack. -- This parser is a bit of a hack.

View file

@ -11,7 +11,7 @@
%options la=2 %options la=2
%options package=org.eclipse.cdt.internal.core.dom.lrparser.gcc %options package=org.eclipse.cdt.internal.core.dom.lrparser.gcc
%options template=FixedBtParserTemplateD.g %options template=LRParserTemplate.g
-- This file is needed because LPG won't allow redefinition of the -- This file is needed because LPG won't allow redefinition of the
@ -21,10 +21,6 @@ $Import
GCCGrammar.g GCCGrammar.g
$End $End
$Define
$ast_class /. IASTTranslationUnit ./
$End
$Start $Start
translation_unit translation_unit
$End $End

View file

@ -11,7 +11,7 @@
%options la=2 %options la=2
%options package=org.eclipse.cdt.internal.core.dom.lrparser.gcc %options package=org.eclipse.cdt.internal.core.dom.lrparser.gcc
%options template=FixedBtParserTemplateD.g %options template=LRSecondaryParserTemplate.g
$Import $Import

View file

@ -11,7 +11,7 @@
%options la=2 %options la=2
%options package=org.eclipse.cdt.internal.core.dom.lrparser.gpp %options package=org.eclipse.cdt.internal.core.dom.lrparser.gpp
%options template=FixedBtParserTemplateD.g %options template=LRParserTemplate.g
-- This file is needed because LPG won't allow redefinition of the -- This file is needed because LPG won't allow redefinition of the
@ -21,10 +21,6 @@ $Import
GPPGrammar.g GPPGrammar.g
$End $End
$Define
$ast_class /. IASTTranslationUnit ./
$End
$Start $Start
translation_unit translation_unit
$End $End

View file

@ -11,7 +11,7 @@
%options la=2 %options la=2
%options package=org.eclipse.cdt.internal.core.dom.lrparser.gpp %options package=org.eclipse.cdt.internal.core.dom.lrparser.gpp
%options template=FixedBtParserTemplateD.g %options template=LRSecondaryParserTemplate.g
$Import $Import

View file

@ -10,7 +10,7 @@
---------------------------------------------------------------------------------- ----------------------------------------------------------------------------------
-- This template is a modified version of BtParserTemplateD.g. -- This template is a modified version of BtParserTemplateD.g. for use with the LR parsers.
-- This template contains a fix for an LPG bug: -- This template contains a fix for an LPG bug:
-- http://sourceforge.net/tracker/index.php?func=detail&aid=1732851&group_id=155963&atid=797879 -- http://sourceforge.net/tracker/index.php?func=detail&aid=1732851&group_id=155963&atid=797879
@ -141,7 +141,9 @@ $End
$Headers $Headers
/. /.
public class $action_type extends PrsStream implements RuleAction$additional_interfaces public class $action_type extends PrsStream implements RuleAction, ITokenStream,
ITokenCollector, IParser<$ast_class>
$additional_interfaces
{ {
private static ParseTable prs = new $prs_type(); private static ParseTable prs = new $prs_type();
private FixedBacktrackingParser btParser; private FixedBacktrackingParser btParser;
@ -312,10 +314,10 @@ $End
$Define $Define
-- These macros allow the template and header code to be customized by an extending parser. -- These macros allow the template and header code to be customized by an extending parser.
$ast_class /. IASTNode ./ -- override with more specific node type $ast_class /. IASTTranslationUnit ./ -- override in secondary parsers
$extra_interfaces /. ./ -- can override this macro to provide additional interfaces $extra_interfaces /. ./ -- can override this macro to provide additional interfaces
$additional_interfaces /. , IParserActionTokenProvider, IParser<$ast_class> $extra_interfaces ./ $additional_interfaces /. $extra_interfaces ./
$build_action_class /. ./ -- name of the class that has the AST building callbacks $build_action_class /. ./ -- name of the class that has the AST building callbacks
$node_factory_create_expression /. ./ -- expression that will create the INodeFactory $node_factory_create_expression /. ./ -- expression that will create the INodeFactory
@ -332,10 +334,16 @@ $Globals
/. /.
import java.util.*; import java.util.*;
import org.eclipse.cdt.core.dom.ast.*; import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.ITokenCollector;
import org.eclipse.cdt.core.dom.lrparser.CPreprocessorAdapter;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser; import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser;
import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack; import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack;
import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider;
import org.eclipse.cdt.core.index.IIndex;
./ ./
$End $End
@ -344,7 +352,11 @@ $Headers
private $build_action_class action; private $build_action_class action;
private IASTCompletionNode compNode; private IASTCompletionNode compNode;
public $action_type() { // constructor
public $action_type(IScanner scanner, IDOMTokenMap tokenMap, IBuiltinBindingsProvider builtinBindingsProvider, IIndex index, Set<IParser.Options> options) {
initActions(options);
action.initializeTranslationUnit(scanner, builtinBindingsProvider, index);
CPreprocessorAdapter.runCPreprocessor(scanner, this, tokenMap);
} }
private void initActions(Set<IParser.Options> options) { private void initActions(Set<IParser.Options> options) {
@ -363,10 +375,9 @@ $Headers
} }
public $ast_class parse(Set<IParser.Options> options) { public $ast_class parse() {
// this has to be done, or... kaboom! // this has to be done, or... kaboom!
setStreamLength(getSize()); setStreamLength(getSize());
initActions(options);
final int errorRepairCount = -1; // -1 means full error handling final int errorRepairCount = -1; // -1 means full error handling
parser(null, errorRepairCount); // do the actual parse parser(null, errorRepairCount); // do the actual parse
@ -398,37 +409,4 @@ $Headers
./ ./
$End $End
$Globals
/.
import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
./
$End
$Headers
/.
private ITokenMap tokenMap = null;
public void setTokens(List<IToken> tokens) {
resetTokenStream();
addToken(new Token(null, 0, 0, 0)); // dummy token
for(IToken token : tokens) {
token.setKind(tokenMap.mapKind(token.getKind()));
addToken(token);
}
addToken(new Token(null, 0, 0, $sym_type.TK_EOF_TOKEN));
}
public $action_type(IParserActionTokenProvider parser) { // constructor
tokenMap = new TokenMap($sym_type.orderedTerminalSymbols, parser.getOrderedTerminalSymbols());
}
./
$End
--
-- E N D O F T E M P L A T E
--

View file

@ -0,0 +1,66 @@
----------------------------------------------------------------------------------
-- Copyright (c) 2006, 2009 IBM Corporation and others.
-- All rights reserved. This program and the accompanying materials
-- are made available under the terms of the Eclipse Public License v1.0
-- which accompanies this distribution, and is available at
-- http://www.eclipse.org/legal/epl_v10.html
--
-- Contributors:
-- IBM Corporation - initial API and implementation
----------------------------------------------------------------------------------
%Options programming_language=java,margin=4,backtrack
%Options table,error_maps,scopes
%options prefix=TK_,
%options action=("*.java", "/.", "./")
%options ParseTable=lpg.lpgjavaruntime.ParseTable
-- additional code needed by secondary parsers
-- path is relative to the grammar file that uses the template
$Include
../template/LRParserTemplate.g
$End
$Define
$additional_interfaces /. , ISecondaryParser<$ast_class> $extra_interfaces ./
$End
$Globals
/.
import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
import org.eclipse.cdt.core.dom.lrparser.ISecondaryParser;
./
$End
$Headers
/.
private ITokenMap tokenMap = null;
public void setTokens(List<IToken> tokens) {
resetTokenStream();
addToken(new Token(null, 0, 0, 0)); // dummy token
for(IToken token : tokens) {
token.setKind(tokenMap.mapKind(token.getKind()));
addToken(token);
}
addToken(new Token(null, 0, 0, $sym_type.TK_EOF_TOKEN));
}
public $action_type(ITokenStream stream, Set<IParser.Options> options) { // constructor for creating secondary parser
initActions(options);
tokenMap = new TokenMap($sym_type.orderedTerminalSymbols, stream.getOrderedTerminalSymbols());
}
./
$End

View file

@ -35,7 +35,7 @@ import org.eclipse.cdt.core.dom.ast.IParameter;
import org.eclipse.cdt.core.dom.ast.IPointerType; import org.eclipse.cdt.core.dom.ast.IPointerType;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack; import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack;
import org.eclipse.cdt.core.parser.util.DebugUtil; import org.eclipse.cdt.core.parser.util.DebugUtil;
import org.eclipse.cdt.internal.core.dom.lrparser.c99.C99Parsersym; import org.eclipse.cdt.internal.core.dom.lrparser.c99.C99Parsersym;
@ -87,7 +87,7 @@ import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
// provides limited access to the token stream // provides limited access to the token stream
private final IParserActionTokenProvider parser; private final ITokenStream parser;
// The symbolTable currently in use // The symbolTable currently in use
private C99SymbolTable symbolTable = C99SymbolTable.EMPTY_TABLE; private C99SymbolTable symbolTable = C99SymbolTable.EMPTY_TABLE;
@ -138,7 +138,7 @@ import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer;
} }
public C99ResolveParserAction(IParserActionTokenProvider parser) { public C99ResolveParserAction(ITokenStream parser) {
this.parser = parser; this.parser = parser;
bindingScopeStack.add(new C99Scope(EScopeKind.eGlobal)); // the global scope bindingScopeStack.add(new C99Scope(EScopeKind.eGlobal)); // the global scope
System.out.println(); System.out.println();

View file

@ -14,7 +14,7 @@ import java.util.LinkedList;
import lpg.lpgjavaruntime.IToken; import lpg.lpgjavaruntime.IToken;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.core.parser.util.DebugUtil; import org.eclipse.cdt.core.parser.util.DebugUtil;
import org.eclipse.cdt.internal.core.dom.lrparser.symboltable.TypedefSymbolTable; import org.eclipse.cdt.internal.core.dom.lrparser.symboltable.TypedefSymbolTable;
/** /**
@ -32,7 +32,7 @@ public class C99TypedefTrackerParserAction {
// provides limited access to the token stream // provides limited access to the token stream
private final IParserActionTokenProvider parser; private final ITokenStream parser;
// The symbolTable currently in use // The symbolTable currently in use
private TypedefSymbolTable symbolTable = TypedefSymbolTable.EMPTY_TABLE; private TypedefSymbolTable symbolTable = TypedefSymbolTable.EMPTY_TABLE;
@ -64,7 +64,7 @@ public class C99TypedefTrackerParserAction {
} }
public C99TypedefTrackerParserAction(IParserActionTokenProvider parser) { public C99TypedefTrackerParserAction(ITokenStream parser) {
this.parser = parser; this.parser = parser;
} }

View file

@ -15,22 +15,19 @@ import java.util.HashSet;
import java.util.Set; import java.util.Set;
import org.eclipse.cdt.core.dom.ICodeReaderFactory; import org.eclipse.cdt.core.dom.ICodeReaderFactory;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTCompletionNode; import org.eclipse.cdt.core.dom.ast.IASTCompletionNode;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage; import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage; import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage;
import org.eclipse.cdt.core.dom.parser.CLanguageKeywords; import org.eclipse.cdt.core.dom.parser.CLanguageKeywords;
import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider;
import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration; import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration;
import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.model.AbstractLanguage; import org.eclipse.cdt.core.model.AbstractLanguage;
import org.eclipse.cdt.core.model.ICLanguageKeywords; import org.eclipse.cdt.core.model.ICLanguageKeywords;
import org.eclipse.cdt.core.model.IContributedModelBuilder;
import org.eclipse.cdt.core.model.ILanguage; import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.parser.CodeReader; import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.IParserLogService; import org.eclipse.cdt.core.parser.IParserLogService;
import org.eclipse.cdt.core.parser.IScanner; import org.eclipse.cdt.core.parser.IScanner;
@ -38,9 +35,7 @@ import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.util.ASTPrinter; import org.eclipse.cdt.core.parser.util.ASTPrinter;
import org.eclipse.cdt.core.parser.util.DebugUtil; import org.eclipse.cdt.core.parser.util.DebugUtil;
import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.dom.parser.ASTTranslationUnit;
import org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor; import org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor;
import org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMLinkageFactory;
import org.eclipse.cdt.internal.core.pdom.dom.c.PDOMCLinkageFactory; import org.eclipse.cdt.internal.core.pdom.dom.c.PDOMCLinkageFactory;
@ -68,15 +63,7 @@ public abstract class BaseExtensibleLanguage extends AbstractLanguage {
* Can be overridden in subclasses to provide a different parser * Can be overridden in subclasses to provide a different parser
* for a language extension. * for a language extension.
*/ */
protected abstract IParser<IASTTranslationUnit> getParser(); protected abstract IParser<IASTTranslationUnit> getParser(IScanner scanner, IIndex index, Set<IParser.Options> options);
/**
* A token map is used to map tokens from the DOM preprocessor
* to the tokens defined by an LPG parser.
*/
protected abstract IDOMTokenMap getTokenMap();
/** /**
* Returns the ParserLanguage value that is to be used when creating * Returns the ParserLanguage value that is to be used when creating
@ -92,11 +79,6 @@ public abstract class BaseExtensibleLanguage extends AbstractLanguage {
protected abstract IScannerExtensionConfiguration getScannerExtensionConfiguration(); protected abstract IScannerExtensionConfiguration getScannerExtensionConfiguration();
/**
* Returns a bindings provider that will provide additional bindings based on the language extension.
*/
protected abstract IBuiltinBindingsProvider getBuiltinBindingsProvider();
@SuppressWarnings("nls") @SuppressWarnings("nls")
@Override @Override
@ -124,24 +106,21 @@ public abstract class BaseExtensibleLanguage extends AbstractLanguage {
IScanner preprocessor = new CPreprocessor(reader, scanInfo, pl, log, config, fileCreator); IScanner preprocessor = new CPreprocessor(reader, scanInfo, pl, log, config, fileCreator);
preprocessor.setComputeImageLocations((options & ILanguage.OPTION_NO_IMAGE_LOCATIONS) == 0); preprocessor.setComputeImageLocations((options & ILanguage.OPTION_NO_IMAGE_LOCATIONS) == 0);
// The translation unit has to be created here so that the preprocessor
// can fill in the preprocessor AST nodes. //parser.setScanner(preprocessor, getTokenMap());
//IASTTranslationUnit tu = getASTTranslationUnit(index, preprocessor); //CPreprocessorAdapter.runCPreprocessor(preprocessor, parser, getTokenMap());
IParser<IASTTranslationUnit> parser = getParser();
CPreprocessorAdapter.runCPreprocessor(preprocessor, parser, getTokenMap());
Set<IParser.Options> parserOptions = new HashSet<IParser.Options>(); Set<IParser.Options> parserOptions = new HashSet<IParser.Options>();
//if((options & OPTION_SKIP_FUNCTION_BODIES) != 0) //if((options & OPTION_SKIP_FUNCTION_BODIES) != 0)
// parserOptions.add(IParser.Options.OPTION_SKIP_FUNCTION_BODIES); // parserOptions.add(IParser.Options.OPTION_SKIP_FUNCTION_BODIES);
if((options & OPTION_SKIP_TRIVIAL_EXPRESSIONS_IN_AGGREGATE_INITIALIZERS) != 0) if((options & OPTION_SKIP_TRIVIAL_EXPRESSIONS_IN_AGGREGATE_INITIALIZERS) != 0)
parserOptions.add(IParser.Options.OPTION_SKIP_TRIVIAL_EXPRESSIONS_IN_AGGREGATE_INITIALIZERS); parserOptions.add(IParser.Options.OPTION_SKIP_TRIVIAL_EXPRESSIONS_IN_AGGREGATE_INITIALIZERS);
if(!parserOptions.isEmpty()) if(!parserOptions.isEmpty())
parserOptions = EnumSet.copyOf(parserOptions); parserOptions = EnumSet.copyOf(parserOptions);
IASTTranslationUnit tu = parser.parse(parserOptions); IParser<IASTTranslationUnit> parser = getParser(preprocessor, index, parserOptions);
IASTTranslationUnit tu = parser.parse();
tu.setIsHeaderUnit((options & OPTION_IS_SOURCE_UNIT) == 0); // the TU is marked as either a source file or a header file tu.setIsHeaderUnit((options & OPTION_IS_SOURCE_UNIT) == 0); // the TU is marked as either a source file or a header file
setUpTranslationUnit(tu, preprocessor, index);
if(DEBUG_PRINT_AST) { if(DEBUG_PRINT_AST) {
System.out.println("Base Extensible Language AST:"); System.out.println("Base Extensible Language AST:");
@ -152,43 +131,6 @@ public abstract class BaseExtensibleLanguage extends AbstractLanguage {
} }
private void setUpTranslationUnit(IASTTranslationUnit tu, IScanner preprocessor, IIndex index) throws CoreException {
tu.setIndex(index);
// add built-in names to the scope
IBuiltinBindingsProvider builtinBindingsProvider = getBuiltinBindingsProvider();
if (builtinBindingsProvider != null) {
IScope tuScope = tu.getScope();
IBinding[] bindings = builtinBindingsProvider.getBuiltinBindings(tuScope);
try {
for (IBinding binding : bindings) {
ASTInternal.addBinding(tuScope, binding);
}
} catch (DOMException e) {
throw new CoreException(LRParserPlugin.createStatus(e));
}
}
if(tu instanceof ASTTranslationUnit) {
((ASTTranslationUnit)tu).setLocationResolver(preprocessor.getLocationResolver());
}
for(IASTNode node : tu.getAllPreprocessorStatements()) {
node.setParent(tu);
}
for(IASTNode node : tu.getComments()) {
node.setParent(tu);
}
for(IASTNode node : tu.getMacroDefinitions()) {
node.setParent(tu);
}
for(IASTNode node : tu.getMacroExpansions()) {
node.setParent(tu);
}
}
public IASTTranslationUnit getASTTranslationUnit(CodeReader reader, public IASTTranslationUnit getASTTranslationUnit(CodeReader reader,
IScannerInfo scanInfo, ICodeReaderFactory fileCreator, IScannerInfo scanInfo, ICodeReaderFactory fileCreator,
IIndex index, IParserLogService log) throws CoreException { IIndex index, IParserLogService log) throws CoreException {
@ -220,14 +162,9 @@ public abstract class BaseExtensibleLanguage extends AbstractLanguage {
IScanner preprocessor = new CPreprocessor(reader, scanInfo, pl, log, config, fileCreator); IScanner preprocessor = new CPreprocessor(reader, scanInfo, pl, log, config, fileCreator);
preprocessor.setContentAssistMode(offset); preprocessor.setContentAssistMode(offset);
IParser<IASTTranslationUnit> parser = getParser();
CPreprocessorAdapter.runCPreprocessor(preprocessor, parser, getTokenMap());
// the parser will fill in the rest of the AST
Set<IParser.Options> parserOptions = EnumSet.of(IParser.Options.OPTION_SKIP_TRIVIAL_EXPRESSIONS_IN_AGGREGATE_INITIALIZERS); Set<IParser.Options> parserOptions = EnumSet.of(IParser.Options.OPTION_SKIP_TRIVIAL_EXPRESSIONS_IN_AGGREGATE_INITIALIZERS);
IASTTranslationUnit tu = parser.parse(parserOptions); IParser<IASTTranslationUnit> parser = getParser(preprocessor, index, parserOptions);
setUpTranslationUnit(tu, preprocessor, index); parser.parse();
IASTCompletionNode completionNode = parser.getCompletionNode(); IASTCompletionNode completionNode = parser.getCompletionNode();
if(DEBUG_PRINT_AST) { if(DEBUG_PRINT_AST) {
@ -283,4 +220,8 @@ public abstract class BaseExtensibleLanguage extends AbstractLanguage {
return super.getAdapter(adapter); return super.getAdapter(adapter);
} }
public IContributedModelBuilder createModelBuilder(@SuppressWarnings("unused") ITranslationUnit tu) {
return null;
}
} }

View file

@ -21,8 +21,10 @@ import org.eclipse.cdt.core.parser.OffsetLimitReachedException;
* Adapts the CPreprocessor from the CDT core for use with LPG based parsers. * Adapts the CPreprocessor from the CDT core for use with LPG based parsers.
* *
* @author Mike Kucera * @author Mike Kucera
* @noreference
* TODO move into an internal package
*/ */
class CPreprocessorAdapter { public class CPreprocessorAdapter {
/** /**
* During content assist the preprocessor may return a completion token * During content assist the preprocessor may return a completion token

View file

@ -11,7 +11,6 @@
package org.eclipse.cdt.core.dom.lrparser; package org.eclipse.cdt.core.dom.lrparser;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.Set;
import org.eclipse.cdt.core.dom.ast.IASTCompletionNode; import org.eclipse.cdt.core.dom.ast.IASTCompletionNode;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
@ -23,7 +22,7 @@ import org.eclipse.cdt.core.model.ILanguage;
* *
* @author Mike Kucera * @author Mike Kucera
*/ */
public interface IParser<N extends IASTNode> extends ITokenCollector { public interface IParser<N extends IASTNode> {
/** /**
* Options used by implementations of IParser. Some of the options * Options used by implementations of IParser. Some of the options
@ -69,7 +68,7 @@ public interface IParser<N extends IASTNode> extends ITokenCollector {
* @throws NullPointerException if either parameter is null * @throws NullPointerException if either parameter is null
* @see EnumSet * @see EnumSet
*/ */
public N parse(Set<Options> options); public N parse();
/** /**

View file

@ -0,0 +1,37 @@
/*******************************************************************************
* Copyright (c) 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.core.dom.lrparser;
import java.util.List;
import lpg.lpgjavaruntime.IToken;
import org.eclipse.cdt.core.dom.ast.IASTNode;
public interface ISecondaryParser<N extends IASTNode> extends IParser<N> {
/**
* Set the list of tokens that will be parsed.
*
* The given list does not need to contain dummy and EOF tokens,
* these will be added automatically.
*
* This method causes any tokens already contained in the parser
* to be removed.
*
* This method is mainly used by secondary parsers that are called
* from a main parser.
*
* @throws NullPointerException if tokens is null
*/
public void setTokens(List<IToken> tokens);
}

View file

@ -10,8 +10,6 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.dom.lrparser; package org.eclipse.cdt.core.dom.lrparser;
import java.util.List;
import lpg.lpgjavaruntime.IToken; import lpg.lpgjavaruntime.IToken;
/** /**
@ -33,20 +31,5 @@ public interface ITokenCollector {
* @throws NullPointerException if token is null * @throws NullPointerException if token is null
*/ */
public void addToken(IToken token); public void addToken(IToken token);
/**
* Set the list of tokens that will be parsed.
*
* The given list does not need to contain dummy and EOF tokens,
* these will be added automatically.
*
* This method causes any tokens already contained in the parser
* to be removed.
*
* This method is mainly used by secondary parsers that are called
* from a main parser.
*
* @throws NullPointerException if tokens is null
*/
public void setTokens(List<IToken> tokens);
} }

View file

@ -21,7 +21,6 @@ public class LRParserPlugin extends Plugin {
public static final String PLUGIN_ID = "org.eclipse.cdt.core.lrparser"; //$NON-NLS-1$ public static final String PLUGIN_ID = "org.eclipse.cdt.core.lrparser"; //$NON-NLS-1$
@SuppressWarnings("unused")
private static LRParserPlugin plugin; private static LRParserPlugin plugin;
@ -43,17 +42,52 @@ public class LRParserPlugin extends Plugin {
} }
/** /**
* @noreference This method is not intended to be referenced by clients. * @noreference
*/ */
public static IStatus createStatus(String msg, Throwable e) { public static IStatus createStatus(String msg, Throwable e) {
return new Status(IStatus.ERROR, PLUGIN_ID, IStatus.ERROR, msg, e); return new Status(IStatus.ERROR, PLUGIN_ID, IStatus.ERROR, msg, e);
} }
/** /**
* @noreference This method is not intended to be referenced by clients. * @noreference
*/ */
public static IStatus createStatus(Throwable e) { public static IStatus createStatus(Throwable e) {
return createStatus(e.getMessage(), e); return createStatus(e.getMessage(), e);
} }
/**
* @noreference
*/
public static void log(IStatus status) {
plugin.getLog().log(status);
}
/**
* @noreference
*/
public static void logError(Throwable exception, String message) {
log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.OK, message, exception));
}
/**
* @noreference
*/
public static void logError(Throwable exception) {
logError(exception, exception.getMessage());
}
/**
* @noreference
*/
public static void logError(String message) {
log(new Status(IStatus.ERROR, PLUGIN_ID, message));
}
/**
* @noreference
*/
public static void logInfo(String message) {
log(new Status(IStatus.INFO, PLUGIN_ID, message));
}
} }

View file

@ -20,7 +20,7 @@ import org.eclipse.cdt.core.dom.ast.IASTCompletionNode;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.ISecondaryParser;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
@SuppressWarnings("restriction") @SuppressWarnings("restriction")
@ -41,7 +41,7 @@ public abstract class AbstractParserAction {
/** Provides an interface to the token stream */ /** Provides an interface to the token stream */
protected final IParserActionTokenProvider parser; protected final ITokenStream stream;
/** Stack that holds the intermediate nodes as the AST is being built */ /** Stack that holds the intermediate nodes as the AST is being built */
protected final ScopedStack<Object> astStack; protected final ScopedStack<Object> astStack;
@ -70,21 +70,21 @@ public abstract class AbstractParserAction {
* @param tu Root node of the AST, its list of declarations should be empty. * @param tu Root node of the AST, its list of declarations should be empty.
* @throws NullPointerException if any of the parameters are null * @throws NullPointerException if any of the parameters are null
*/ */
public AbstractParserAction(IParserActionTokenProvider parser, ScopedStack<Object> astStack) { public AbstractParserAction(ITokenStream parser, ScopedStack<Object> astStack) {
if(parser == null) if(parser == null)
throw new NullPointerException("parser is null"); //$NON-NLS-1$ throw new NullPointerException("parser is null"); //$NON-NLS-1$
if(astStack == null) if(astStack == null)
throw new NullPointerException("astStack is null"); //$NON-NLS-1$ throw new NullPointerException("astStack is null"); //$NON-NLS-1$
this.parser = parser; this.stream = parser;
this.astStack = astStack; this.astStack = astStack;
} }
protected void setOffsetAndLength(IASTNode node) { protected void setOffsetAndLength(IASTNode node) {
int ruleOffset = parser.getLeftIToken().getStartOffset(); int ruleOffset = stream.getLeftIToken().getStartOffset();
int ruleLength = parser.getRightIToken().getEndOffset() - ruleOffset; int ruleLength = stream.getRightIToken().getEndOffset() - ruleOffset;
((ASTNode)node).setOffsetAndLength(ruleOffset, ruleLength < 0 ? 0 : ruleLength); ((ASTNode)node).setOffsetAndLength(ruleOffset, ruleLength < 0 ? 0 : ruleLength);
} }
@ -143,15 +143,15 @@ public abstract class AbstractParserAction {
* Runs the given parser on the given token list. * Runs the given parser on the given token list.
* *
*/ */
protected <N extends IASTNode> N runSecondaryParser(IParser<N> secondaryParser) { protected <N extends IASTNode> N runSecondaryParser(ISecondaryParser<N> secondaryParser) {
return runSecondaryParser(secondaryParser, parser.getRuleTokens()); return runSecondaryParser(secondaryParser, stream.getRuleTokens());
} }
/** /**
* Runs the given parser on the tokens that make up the current rule. * Runs the given parser on the tokens that make up the current rule.
*/ */
protected <N extends IASTNode> N runSecondaryParser(IParser<N> secondaryParser, List<IToken> tokens) { protected <N extends IASTNode> N runSecondaryParser(ISecondaryParser<N> secondaryParser, List<IToken> tokens) {
// the secondary parser will alter the token kinds, which will need to be undone // the secondary parser will alter the token kinds, which will need to be undone
int[] savedKinds = new int[tokens.size()]; int[] savedKinds = new int[tokens.size()];
@ -160,7 +160,7 @@ public abstract class AbstractParserAction {
savedKinds[i++] = token.getKind(); savedKinds[i++] = token.getKind();
secondaryParser.setTokens(tokens); secondaryParser.setTokens(tokens);
N result = secondaryParser.parse(options); N result = secondaryParser.parse();
IASTCompletionNode compNode = secondaryParser.getCompletionNode(); IASTCompletionNode compNode = secondaryParser.getCompletionNode();
if(compNode != null) { if(compNode != null) {
@ -227,6 +227,6 @@ public abstract class AbstractParserAction {
* Gets the current token and places it on the stack for later consumption. * Gets the current token and places it on the stack for later consumption.
*/ */
public void consumeToken() { public void consumeToken() {
astStack.push(parser.getRightIToken()); astStack.push(stream.getRightIToken());
} }
} }

View file

@ -16,6 +16,7 @@ import java.util.List;
import lpg.lpgjavaruntime.IToken; import lpg.lpgjavaruntime.IToken;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTASMDeclaration; import org.eclipse.cdt.core.dom.ast.IASTASMDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator; import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTArrayModifier; import org.eclipse.cdt.core.dom.ast.IASTArrayModifier;
@ -62,13 +63,20 @@ import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression; import org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression;
import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression; import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.INodeFactory; import org.eclipse.cdt.core.dom.ast.INodeFactory;
import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator; import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCastExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCastExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLiteralExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLiteralExpression;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.ISecondaryParser;
import org.eclipse.cdt.core.dom.lrparser.LRParserPlugin;
import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.parser.IProblem; import org.eclipse.cdt.core.parser.IProblem;
import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.internal.core.dom.parser.ASTInternal;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.dom.parser.ASTQueries; import org.eclipse.cdt.internal.core.dom.parser.ASTQueries;
import org.eclipse.cdt.internal.core.dom.parser.ASTTranslationUnit; import org.eclipse.cdt.internal.core.dom.parser.ASTTranslationUnit;
@ -98,6 +106,7 @@ public abstract class BuildASTParserAction extends AbstractParserAction {
protected abstract boolean isIdentifierToken(IToken token); protected abstract boolean isIdentifierToken(IToken token);
protected IASTTranslationUnit tu = null;
/** /**
@ -105,7 +114,7 @@ public abstract class BuildASTParserAction extends AbstractParserAction {
* @param tu Root node of the AST, its list of declarations should be empty. * @param tu Root node of the AST, its list of declarations should be empty.
* @throws NullPointerException if any of the parameters are null * @throws NullPointerException if any of the parameters are null
*/ */
public BuildASTParserAction(IParserActionTokenProvider parser, ScopedStack<Object> astStack, INodeFactory nodeFactory, ISecondaryParserFactory parserFactory) { public BuildASTParserAction(ITokenStream parser, ScopedStack<Object> astStack, INodeFactory nodeFactory, ISecondaryParserFactory parserFactory) {
super(parser, astStack); super(parser, astStack);
if(nodeFactory == null) if(nodeFactory == null)
@ -116,20 +125,46 @@ public abstract class BuildASTParserAction extends AbstractParserAction {
this.nodeFactory = nodeFactory; this.nodeFactory = nodeFactory;
this.parserFactory = parserFactory; this.parserFactory = parserFactory;
} }
public void initializeTranslationUnit(IScanner scanner, IBuiltinBindingsProvider builtinBindingsProvider, IIndex index) {
tu = nodeFactory.newTranslationUnit();
tu.setIndex(index);
// add built-in names to the scope
if (builtinBindingsProvider != null) {
IScope tuScope = tu.getScope();
IBinding[] bindings = builtinBindingsProvider.getBuiltinBindings(tuScope);
try {
for (IBinding binding : bindings) {
ASTInternal.addBinding(tuScope, binding);
}
} catch (DOMException e) {
LRParserPlugin.logError(e);
}
}
if(tu instanceof ASTTranslationUnit) {
((ASTTranslationUnit)tu).setLocationResolver(scanner.getLocationResolver());
}
}
public void consumeTranslationUnit() { public void consumeTranslationUnit() {
// can't close the outermost scope if(tu == null)
// the outermost scope may be empty if there are no tokens in the file tu = nodeFactory.newTranslationUnit();
IASTTranslationUnit tu = nodeFactory.newTranslationUnit();
// can't close the outermost scope
for(Object o : astStack.topScope()) { for(Object o : astStack.topScope()) {
tu.addDeclaration((IASTDeclaration)o); tu.addDeclaration((IASTDeclaration)o);
} }
while(!astStack.isEmpty()) {
astStack.pop();
}
// this is the same way that the DOM parser computes the length // this is the same way that the DOM parser computes the length
IASTDeclaration[] declarations = tu.getDeclarations(); IASTDeclaration[] declarations = tu.getDeclarations();
if (declarations.length != 0) { if(declarations.length != 0) {
IASTNode d = declarations[declarations.length-1]; IASTNode d = declarations[declarations.length-1];
ParserUtil.setOffsetAndLength(tu, 0, offset(d) + length(d)); ParserUtil.setOffsetAndLength(tu, 0, offset(d) + length(d));
} }
@ -146,7 +181,7 @@ public abstract class BuildASTParserAction extends AbstractParserAction {
* *
* @see AbstractGNUSourceCodeParser#resolveAmbiguities() * @see AbstractGNUSourceCodeParser#resolveAmbiguities()
*/ */
private void resolveAmbiguityNodes(IASTTranslationUnit tu) { private static void resolveAmbiguityNodes(IASTTranslationUnit tu) {
if (tu instanceof ASTTranslationUnit) { if (tu instanceof ASTTranslationUnit) {
((ASTTranslationUnit)tu).resolveAmbiguities(); ((ASTTranslationUnit)tu).resolveAmbiguities();
} }
@ -156,7 +191,7 @@ public abstract class BuildASTParserAction extends AbstractParserAction {
* Consumes a single identifier token. * Consumes a single identifier token.
*/ */
public void consumeIdentifierName() { public void consumeIdentifierName() {
astStack.push(createName(parser.getRightIToken())); astStack.push(createName(stream.getRightIToken()));
} }
@ -173,10 +208,10 @@ public abstract class BuildASTParserAction extends AbstractParserAction {
// attempt to also parse the tokens as an expression // attempt to also parse the tokens as an expression
IASTExpressionStatement expressionStatement = null; IASTExpressionStatement expressionStatement = null;
if(decl instanceof IASTSimpleDeclaration) { if(decl instanceof IASTSimpleDeclaration) {
List<IToken> expressionTokens = parser.getRuleTokens(); List<IToken> expressionTokens = stream.getRuleTokens();
expressionTokens = expressionTokens.subList(0, expressionTokens.size()-1); // remove the semicolon at the end expressionTokens = expressionTokens.subList(0, expressionTokens.size()-1); // remove the semicolon at the end
IParser<IASTExpression> expressionParser = parserFactory.getExpressionParser(parser); ISecondaryParser<IASTExpression> expressionParser = parserFactory.getExpressionParser(stream, options);
IASTExpression expr = runSecondaryParser(expressionParser, expressionTokens); IASTExpression expr = runSecondaryParser(expressionParser, expressionTokens);
if(expr != null) { // the parse may fail if(expr != null) { // the parse may fail
@ -186,7 +221,7 @@ public abstract class BuildASTParserAction extends AbstractParserAction {
} }
List<IToken> tokens = parser.getRuleTokens(); List<IToken> tokens = stream.getRuleTokens();
IASTNode result; IASTNode result;
if(expressionStatement == null) if(expressionStatement == null)
@ -253,7 +288,7 @@ public abstract class BuildASTParserAction extends AbstractParserAction {
* @see ICPPASTLiteralExpression * @see ICPPASTLiteralExpression
*/ */
public void consumeExpressionLiteral(int kind) { public void consumeExpressionLiteral(int kind) {
IToken token = parser.getRightIToken(); IToken token = stream.getRightIToken();
String rep = token.toString(); String rep = token.toString();
// Strip the quotes from string literals, this is just to be consistent // Strip the quotes from string literals, this is just to be consistent
@ -280,7 +315,7 @@ public abstract class BuildASTParserAction extends AbstractParserAction {
public void consumeExpressionID() { public void consumeExpressionID() {
IASTName name = createName(parser.getLeftIToken()); IASTName name = createName(stream.getLeftIToken());
IASTIdExpression expr = nodeFactory.newIdExpression(name); IASTIdExpression expr = nodeFactory.newIdExpression(name);
setOffsetAndLength(expr); setOffsetAndLength(expr);
astStack.push(expr); astStack.push(expr);
@ -353,7 +388,7 @@ public abstract class BuildASTParserAction extends AbstractParserAction {
IASTExpression alternateExpr = null; IASTExpression alternateExpr = null;
if(operator == IASTCastExpression.op_cast) { // don't reparse for dynamic_cast etc as those are not ambiguous if(operator == IASTCastExpression.op_cast) { // don't reparse for dynamic_cast etc as those are not ambiguous
// try parsing as non-cast to resolve ambiguities // try parsing as non-cast to resolve ambiguities
IParser<IASTExpression> secondaryParser = parserFactory.getNoCastExpressionParser(parser); ISecondaryParser<IASTExpression> secondaryParser = parserFactory.getNoCastExpressionParser(stream, options);
alternateExpr = runSecondaryParser(secondaryParser); alternateExpr = runSecondaryParser(secondaryParser);
} }
@ -393,7 +428,7 @@ public abstract class BuildASTParserAction extends AbstractParserAction {
setOffsetAndLength(expr); setOffsetAndLength(expr);
// try parsing as an expression to resolve ambiguities // try parsing as an expression to resolve ambiguities
IParser<IASTExpression> secondaryParser = parserFactory.getSizeofExpressionParser(parser); ISecondaryParser<IASTExpression> secondaryParser = parserFactory.getSizeofExpressionParser(stream, options);
IASTExpression alternateExpr = runSecondaryParser(secondaryParser); IASTExpression alternateExpr = runSecondaryParser(secondaryParser);
if(alternateExpr == null) if(alternateExpr == null)
@ -439,7 +474,7 @@ public abstract class BuildASTParserAction extends AbstractParserAction {
*/ */
public void consumeStatementLabeled() { public void consumeStatementLabeled() {
IASTStatement body = (IASTStatement) astStack.pop(); IASTStatement body = (IASTStatement) astStack.pop();
IASTName label = createName(parser.getLeftIToken()); IASTName label = createName(stream.getLeftIToken());
IASTLabelStatement stat = nodeFactory.newLabelStatement(label, body); IASTLabelStatement stat = nodeFactory.newLabelStatement(label, body);
setOffsetAndLength(stat); setOffsetAndLength(stat);
@ -474,7 +509,7 @@ public abstract class BuildASTParserAction extends AbstractParserAction {
IASTStatement body = (IASTStatement) astStack.pop(); IASTStatement body = (IASTStatement) astStack.pop();
IASTDefaultStatement stat = nodeFactory.newDefaultStatement(); IASTDefaultStatement stat = nodeFactory.newDefaultStatement();
List<IToken> tokens = parser.getRuleTokens(); List<IToken> tokens = stream.getRuleTokens();
IToken defaultToken = tokens.get(0); IToken defaultToken = tokens.get(0);
IToken colonToken = tokens.get(1); IToken colonToken = tokens.get(1);
ParserUtil.setOffsetAndLength(stat, offset(defaultToken), offset(colonToken) - offset(defaultToken) + 1); ParserUtil.setOffsetAndLength(stat, offset(defaultToken), offset(colonToken) - offset(defaultToken) + 1);
@ -548,7 +583,7 @@ public abstract class BuildASTParserAction extends AbstractParserAction {
* jump_statement ::= goto goto_identifier ';' * jump_statement ::= goto goto_identifier ';'
*/ */
public void consumeStatementGoto() { public void consumeStatementGoto() {
IASTName name = createName(parser.getRuleTokens().get(1)); IASTName name = createName(stream.getRuleTokens().get(1));
IASTGotoStatement gotoStat = nodeFactory.newGotoStatement(name); IASTGotoStatement gotoStat = nodeFactory.newGotoStatement(name);
setOffsetAndLength(gotoStat); setOffsetAndLength(gotoStat);
astStack.push(gotoStat); astStack.push(gotoStat);
@ -599,7 +634,7 @@ public abstract class BuildASTParserAction extends AbstractParserAction {
declarator = (IASTDeclarator) astStack.pop(); declarator = (IASTDeclarator) astStack.pop();
else { else {
declarator = nodeFactory.newDeclarator(nodeFactory.newName()); declarator = nodeFactory.newDeclarator(nodeFactory.newName());
ParserUtil.setOffsetAndLength(declarator, parser.getRightIToken().getEndOffset(), 0); ParserUtil.setOffsetAndLength(declarator, stream.getRightIToken().getEndOffset(), 0);
} }
IASTDeclSpecifier declSpecifier = (IASTDeclSpecifier) astStack.pop(); IASTDeclSpecifier declSpecifier = (IASTDeclSpecifier) astStack.pop();
@ -664,7 +699,7 @@ public abstract class BuildASTParserAction extends AbstractParserAction {
* ::= 'asm' '(' 'stringlit' ')' ';' * ::= 'asm' '(' 'stringlit' ')' ';'
*/ */
public void consumeDeclarationASM() { public void consumeDeclarationASM() {
String s = parser.getRuleTokens().get(2).toString(); String s = stream.getRuleTokens().get(2).toString();
IASTASMDeclaration asm = nodeFactory.newASMDeclaration(s); IASTASMDeclaration asm = nodeFactory.newASMDeclaration(s);
setOffsetAndLength(asm); setOffsetAndLength(asm);
@ -691,7 +726,7 @@ public abstract class BuildASTParserAction extends AbstractParserAction {
*/ */
public void consumeParameterDeclarationWithoutDeclarator() { public void consumeParameterDeclarationWithoutDeclarator() {
// offsets need to be calculated differently in this case // offsets need to be calculated differently in this case
final int endOffset = parser.getRightIToken().getEndOffset(); final int endOffset = stream.getRightIToken().getEndOffset();
IASTName name = nodeFactory.newName(); IASTName name = nodeFactory.newName();
ParserUtil.setOffsetAndLength(name, endOffset, 0); ParserUtil.setOffsetAndLength(name, endOffset, 0);
@ -911,7 +946,7 @@ public abstract class BuildASTParserAction extends AbstractParserAction {
* | 'enum' enum_identifier '{' <openscope> enumerator_list_opt '}' * | 'enum' enum_identifier '{' <openscope> enumerator_list_opt '}'
*/ */
public void consumeTypeSpecifierEnumeration(boolean hasIdent) { public void consumeTypeSpecifierEnumeration(boolean hasIdent) {
IASTName name = (hasIdent) ? createName(parser.getRuleTokens().get(1)) : nodeFactory.newName(); IASTName name = (hasIdent) ? createName(stream.getRuleTokens().get(1)) : nodeFactory.newName();
IASTEnumerationSpecifier enumSpec = nodeFactory.newEnumerationSpecifier(name); IASTEnumerationSpecifier enumSpec = nodeFactory.newEnumerationSpecifier(name);
@ -928,7 +963,7 @@ public abstract class BuildASTParserAction extends AbstractParserAction {
* | enum_identifier '=' constant_expression * | enum_identifier '=' constant_expression
*/ */
public void consumeEnumerator(boolean hasInitializer) { public void consumeEnumerator(boolean hasInitializer) {
IASTName name = createName(parser.getLeftIToken()); IASTName name = createName(stream.getLeftIToken());
IASTExpression value = null; IASTExpression value = null;
if(hasInitializer) if(hasInitializer)

View file

@ -10,9 +10,11 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.dom.lrparser.action; package org.eclipse.cdt.core.dom.lrparser.action;
import java.util.Set;
import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.ISecondaryParser;
/** /**
@ -28,20 +30,20 @@ public interface ISecondaryParserFactory {
/** /**
* Get the parser that will recognize expressions. * Get the parser that will recognize expressions.
*/ */
IParser<IASTExpression> getExpressionParser(IParserActionTokenProvider parser); ISecondaryParser<IASTExpression> getExpressionParser(ITokenStream stream, Set<IParser.Options> options);
/** /**
* Expression parser that does not recognize cast expressions, * Expression parser that does not recognize cast expressions,
* used to disambiguate casts. * used to disambiguate casts.
*/ */
IParser<IASTExpression> getNoCastExpressionParser(IParserActionTokenProvider parser); ISecondaryParser<IASTExpression> getNoCastExpressionParser(ITokenStream stream, Set<IParser.Options> options);
/** /**
* Expression parser that treats all sizeof and typeid expressions * Expression parser that treats all sizeof and typeid expressions
* as unary expressions. * as unary expressions.
*/ */
IParser<IASTExpression> getSizeofExpressionParser(IParserActionTokenProvider parser); ISecondaryParser<IASTExpression> getSizeofExpressionParser(ITokenStream stream, Set<IParser.Options> options);
} }

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2006, 2008 IBM Corporation and others. * Copyright (c) 2006, 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
@ -8,7 +8,7 @@
* Contributors: * Contributors:
* IBM Corporation - initial API and implementation * IBM Corporation - initial API and implementation
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.dom.lrparser; package org.eclipse.cdt.core.dom.lrparser.action;
import java.util.List; import java.util.List;
@ -28,7 +28,7 @@ import lpg.lpgjavaruntime.IToken;
* *
* @author Mike Kucera * @author Mike Kucera
*/ */
public interface IParserActionTokenProvider { public interface ITokenStream {
/** /**
* Returns the tokens that were parsed to recognized * Returns the tokens that were parsed to recognized

View file

@ -61,8 +61,8 @@ import org.eclipse.cdt.core.dom.ast.c.ICASTTypeIdInitializerExpression;
import org.eclipse.cdt.core.dom.ast.c.ICASTTypedefNameSpecifier; import org.eclipse.cdt.core.dom.ast.c.ICASTTypedefNameSpecifier;
import org.eclipse.cdt.core.dom.ast.c.ICNodeFactory; import org.eclipse.cdt.core.dom.ast.c.ICNodeFactory;
import org.eclipse.cdt.core.dom.ast.gnu.c.ICASTKnRFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.gnu.c.ICASTKnRFunctionDeclarator;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
import org.eclipse.cdt.core.dom.lrparser.action.BuildASTParserAction; import org.eclipse.cdt.core.dom.lrparser.action.BuildASTParserAction;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.core.dom.lrparser.action.ISecondaryParserFactory; import org.eclipse.cdt.core.dom.lrparser.action.ISecondaryParserFactory;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap; import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.ParserUtil; import org.eclipse.cdt.core.dom.lrparser.action.ParserUtil;
@ -94,7 +94,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
* @param orderedTerminalSymbols When an instance of this class is created for a parser * @param orderedTerminalSymbols When an instance of this class is created for a parser
* that parsers token kinds will be mapped back to the base C99 parser's token kinds. * that parsers token kinds will be mapped back to the base C99 parser's token kinds.
*/ */
public C99BuildASTParserAction(IParserActionTokenProvider parser, ScopedStack<Object> astStack, ICNodeFactory nodeFactory, ISecondaryParserFactory parserFactory) { public C99BuildASTParserAction(ITokenStream parser, ScopedStack<Object> astStack, ICNodeFactory nodeFactory, ISecondaryParserFactory parserFactory) {
super(parser, astStack, nodeFactory, parserFactory); super(parser, astStack, nodeFactory, parserFactory);
this.nodeFactory = nodeFactory; this.nodeFactory = nodeFactory;
@ -135,7 +135,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
* postfix_expression ::= postfix_expression '->' ident * postfix_expression ::= postfix_expression '->' ident
*/ */
public void consumeExpressionFieldReference(boolean isPointerDereference) { public void consumeExpressionFieldReference(boolean isPointerDereference) {
IASTName name = createName(parser.getRightIToken()); IASTName name = createName(stream.getRightIToken());
IASTExpression owner = (IASTExpression) astStack.pop(); IASTExpression owner = (IASTExpression) astStack.pop();
IASTFieldReference expr = nodeFactory.newFieldReference(name, owner); IASTFieldReference expr = nodeFactory.newFieldReference(name, owner);
expr.setIsPointerDereference(isPointerDereference); expr.setIsPointerDereference(isPointerDereference);
@ -289,7 +289,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
IASTName[] names = astStack.topScope().toArray(new IASTName[0]); IASTName[] names = astStack.topScope().toArray(new IASTName[0]);
declarator.setParameterNames(names); declarator.setParameterNames(names);
astStack.closeScope(); astStack.closeScope();
int endOffset = endOffset(parser.getRightIToken()); int endOffset = endOffset(stream.getRightIToken());
addFunctionModifier(declarator, endOffset); addFunctionModifier(declarator, endOffset);
} }
@ -300,7 +300,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
* | identifier_list ',' 'identifier' * | identifier_list ',' 'identifier'
*/ */
public void consumeIdentifierKnR() { public void consumeIdentifierKnR() {
IASTName name = createName(parser.getRightIToken()); IASTName name = createName(stream.getRightIToken());
astStack.push(name); astStack.push(name);
} }
@ -313,7 +313,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
*/ */
public void consumePointer() { public void consumePointer() {
IASTPointer pointer = nodeFactory.newPointer(); IASTPointer pointer = nodeFactory.newPointer();
IToken star = parser.getRightIToken(); IToken star = stream.getRightIToken();
ParserUtil.setOffsetAndLength(pointer, star); ParserUtil.setOffsetAndLength(pointer, star);
astStack.push(pointer); astStack.push(pointer);
} }
@ -362,7 +362,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
} }
if(hasDeclarator) { if(hasDeclarator) {
addFunctionModifier(declarator, endOffset(parser.getRightIToken())); addFunctionModifier(declarator, endOffset(stream.getRightIToken()));
} }
else { else {
setOffsetAndLength(declarator); setOffsetAndLength(declarator);
@ -402,7 +402,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
* designator ::= '.' 'identifier' * designator ::= '.' 'identifier'
*/ */
public void consumeDesignatorField() { public void consumeDesignatorField() {
IASTName name = createName(parser.getRightIToken()); IASTName name = createName(stream.getRightIToken());
ICASTFieldDesignator designator = nodeFactory.newFieldDesignator(name); ICASTFieldDesignator designator = nodeFactory.newFieldDesignator(name);
setOffsetAndLength(designator); setOffsetAndLength(designator);
astStack.push(designator); astStack.push(designator);
@ -476,7 +476,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
List<Object> declarators = (hasDeclaratorList) ? astStack.closeScope() : Collections.emptyList(); List<Object> declarators = (hasDeclaratorList) ? astStack.closeScope() : Collections.emptyList();
IASTDeclSpecifier declSpecifier = (IASTDeclSpecifier) astStack.pop(); IASTDeclSpecifier declSpecifier = (IASTDeclSpecifier) astStack.pop();
List<IToken> ruleTokens = parser.getRuleTokens(); List<IToken> ruleTokens = stream.getRuleTokens();
if(ruleTokens.size() == 1 && baseKind(ruleTokens.get(0)) == TK_EndOfCompletion) if(ruleTokens.size() == 1 && baseKind(ruleTokens.get(0)) == TK_EndOfCompletion)
return; // do not generate nodes for extra EOC tokens return; // do not generate nodes for extra EOC tokens
@ -498,7 +498,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
*/ */
public void consumeDeclarationEmpty() { public void consumeDeclarationEmpty() {
// Don't generate declaration nodes for extra EOC tokens // Don't generate declaration nodes for extra EOC tokens
if(baseKind(parser.getLeftIToken()) == C99Parsersym.TK_EndOfCompletion) if(baseKind(stream.getLeftIToken()) == C99Parsersym.TK_EndOfCompletion)
return; return;
IASTDeclSpecifier declSpecifier = nodeFactory.newSimpleDeclSpecifier(); IASTDeclSpecifier declSpecifier = nodeFactory.newSimpleDeclSpecifier();
@ -535,12 +535,12 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
public void consumeTypeSpecifierComposite(boolean hasName) { public void consumeTypeSpecifierComposite(boolean hasName) {
int key = 0; int key = 0;
switch(baseKind(parser.getLeftIToken())) { switch(baseKind(stream.getLeftIToken())) {
case TK_struct: key = IASTCompositeTypeSpecifier.k_struct; case TK_struct: key = IASTCompositeTypeSpecifier.k_struct;
case TK_union: key = IASTCompositeTypeSpecifier.k_union; case TK_union: key = IASTCompositeTypeSpecifier.k_union;
} }
IASTName name = (hasName) ? createName(parser.getRuleTokens().get(1)) : nodeFactory.newName(); IASTName name = (hasName) ? createName(stream.getRuleTokens().get(1)) : nodeFactory.newName();
ICASTCompositeTypeSpecifier typeSpec = nodeFactory.newCompositeTypeSpecifier(key, name); ICASTCompositeTypeSpecifier typeSpec = nodeFactory.newCompositeTypeSpecifier(key, name);
@ -560,7 +560,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
* enum_specifier ::= 'enum' enum_identifier * enum_specifier ::= 'enum' enum_identifier
*/ */
public void consumeTypeSpecifierElaborated(int kind) { public void consumeTypeSpecifierElaborated(int kind) {
IASTName name = createName(parser.getRuleTokens().get(1)); IASTName name = createName(stream.getRuleTokens().get(1));
IASTElaboratedTypeSpecifier typeSpec = nodeFactory.newElaboratedTypeSpecifier(kind, name); IASTElaboratedTypeSpecifier typeSpec = nodeFactory.newElaboratedTypeSpecifier(kind, name);
setOffsetAndLength(typeSpec); setOffsetAndLength(typeSpec);
astStack.push(typeSpec); astStack.push(typeSpec);
@ -604,7 +604,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
// bug 234463, fix for content assist to work in this case // bug 234463, fix for content assist to work in this case
int TK_EOC = TK_EndOfCompletion; // TODO: change this in the grammar file int TK_EOC = TK_EndOfCompletion; // TODO: change this in the grammar file
List<IToken> tokens = parser.getRuleTokens(); List<IToken> tokens = stream.getRuleTokens();
if(matchTokens(tokens, tokenMap, if(matchTokens(tokens, tokenMap,
TK_for, TK_LeftParen, TK_Completion, TK_EOC, TK_EOC, TK_EOC, TK_EOC)) { TK_for, TK_LeftParen, TK_Completion, TK_EOC, TK_EOC, TK_EOC, TK_EOC)) {
IASTName name = createName(tokens.get(2)); IASTName name = createName(tokens.get(2));

View file

@ -10,10 +10,13 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.dom.lrparser.action.c99; package org.eclipse.cdt.core.dom.lrparser.action.c99;
import java.util.Set;
import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.ISecondaryParser;
import org.eclipse.cdt.core.dom.lrparser.action.ISecondaryParserFactory; import org.eclipse.cdt.core.dom.lrparser.action.ISecondaryParserFactory;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.internal.core.dom.lrparser.c99.C99ExpressionParser; import org.eclipse.cdt.internal.core.dom.lrparser.c99.C99ExpressionParser;
import org.eclipse.cdt.internal.core.dom.lrparser.c99.C99NoCastExpressionParser; import org.eclipse.cdt.internal.core.dom.lrparser.c99.C99NoCastExpressionParser;
import org.eclipse.cdt.internal.core.dom.lrparser.c99.C99SizeofExpressionParser; import org.eclipse.cdt.internal.core.dom.lrparser.c99.C99SizeofExpressionParser;
@ -27,15 +30,15 @@ public class C99SecondaryParserFactory implements ISecondaryParserFactory {
} }
public IParser<IASTExpression> getExpressionParser(IParserActionTokenProvider parser) { public ISecondaryParser<IASTExpression> getExpressionParser(ITokenStream stream, Set<IParser.Options> options) {
return new C99ExpressionParser(parser); return new C99ExpressionParser(stream, options);
} }
public IParser<IASTExpression> getNoCastExpressionParser(IParserActionTokenProvider parser) { public ISecondaryParser<IASTExpression> getNoCastExpressionParser(ITokenStream stream, Set<IParser.Options> options) {
return new C99NoCastExpressionParser(parser); return new C99NoCastExpressionParser(stream, options);
} }
public IParser<IASTExpression> getSizeofExpressionParser(IParserActionTokenProvider parser) { public ISecondaryParser<IASTExpression> getSizeofExpressionParser(ITokenStream stream, Set<IParser.Options> options) {
return new C99SizeofExpressionParser(parser); return new C99SizeofExpressionParser(stream, options);
} }
} }

View file

@ -88,10 +88,10 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDirective;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVisibilityLabel; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVisibilityLabel;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNodeFactory; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNodeFactory;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.ISecondaryParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
import org.eclipse.cdt.core.dom.lrparser.LPGTokenAdapter; import org.eclipse.cdt.core.dom.lrparser.LPGTokenAdapter;
import org.eclipse.cdt.core.dom.lrparser.action.BuildASTParserAction; import org.eclipse.cdt.core.dom.lrparser.action.BuildASTParserAction;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap; import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.ParserUtil; import org.eclipse.cdt.core.dom.lrparser.action.ParserUtil;
import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack; import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack;
@ -104,7 +104,6 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguousDeclarator;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguousExpression; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguousExpression;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguousStatement; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguousStatement;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguousTemplateArgument; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguousTemplateArgument;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTQualifiedName;
import org.eclipse.cdt.internal.core.dom.parser.cpp.OverloadableOperator; import org.eclipse.cdt.internal.core.dom.parser.cpp.OverloadableOperator;
/** /**
@ -134,7 +133,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
* @param orderedTerminalSymbols When an instance of this class is created for a parser * @param orderedTerminalSymbols When an instance of this class is created for a parser
* that parsers token kinds will be mapped back to the base C99 parser's token kinds. * that parsers token kinds will be mapped back to the base C99 parser's token kinds.
*/ */
public CPPBuildASTParserAction(IParserActionTokenProvider parser, ScopedStack<Object> astStack, ICPPNodeFactory nodeFactory, ICPPSecondaryParserFactory parserFactory) { public CPPBuildASTParserAction(ITokenStream parser, ScopedStack<Object> astStack, ICPPNodeFactory nodeFactory, ICPPSecondaryParserFactory parserFactory) {
super(parser, astStack, nodeFactory, parserFactory); super(parser, astStack, nodeFactory, parserFactory);
this.nodeFactory = nodeFactory; this.nodeFactory = nodeFactory;
@ -408,7 +407,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
*/ */
public void consumeTemplateArgumentTypeId() { public void consumeTemplateArgumentTypeId() {
// TODO is this necessary? It should be able to tell if it looks like an id expression // TODO is this necessary? It should be able to tell if it looks like an id expression
IParser<IASTExpression> secondaryParser = parserFactory.getExpressionParser(parser); ISecondaryParser<IASTExpression> secondaryParser = parserFactory.getExpressionParser(stream, options);
IASTExpression result = runSecondaryParser(secondaryParser); IASTExpression result = runSecondaryParser(secondaryParser);
// The grammar rule allows assignment_expression, but the ambiguity // The grammar rule allows assignment_expression, but the ambiguity
@ -459,7 +458,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
* ::= 'operator' overloadable_operator * ::= 'operator' overloadable_operator
*/ */
public void consumeOperatorName() { public void consumeOperatorName() {
List<IToken> tokens = parser.getRuleTokens(); List<IToken> tokens = stream.getRuleTokens();
tokens = tokens.subList(1, tokens.size()); tokens = tokens.subList(1, tokens.size());
OverloadableOperator operator = getOverloadableOperator(tokens); OverloadableOperator operator = getOverloadableOperator(tokens);
@ -515,7 +514,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
* ::= '~' identifier_token * ::= '~' identifier_token
*/ */
public void consumeDestructorName() { public void consumeDestructorName() {
char[] chars = ("~" + parser.getRightIToken()).toCharArray(); //$NON-NLS-1$ char[] chars = ("~" + stream.getRightIToken()).toCharArray(); //$NON-NLS-1$
IASTName name = nodeFactory.newName(chars); IASTName name = nodeFactory.newName(chars);
setOffsetAndLength(name); setOffsetAndLength(name);
@ -535,7 +534,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
IASTName newName = nodeFactory.newName(newChars); IASTName newName = nodeFactory.newName(newChars);
int offset = offset(parser.getLeftIToken()); int offset = offset(stream.getLeftIToken());
int length = offset - endOffset(oldName); int length = offset - endOffset(oldName);
ParserUtil.setOffsetAndLength(newName, offset, length); ParserUtil.setOffsetAndLength(newName, offset, length);
@ -627,7 +626,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
// bug 234463, fix for content assist to work in this case // bug 234463, fix for content assist to work in this case
int TK_EOC = TK_EndOfCompletion; // TODO: change this in the grammar file int TK_EOC = TK_EndOfCompletion; // TODO: change this in the grammar file
List<IToken> tokens = parser.getRuleTokens(); List<IToken> tokens = stream.getRuleTokens();
if(matchTokens(tokens, tokenMap, if(matchTokens(tokens, tokenMap,
TK_for, TK_LeftParen, TK_Completion, TK_EOC, TK_EOC, TK_EOC, TK_EOC)) { TK_for, TK_LeftParen, TK_Completion, TK_EOC, TK_EOC, TK_EOC, TK_EOC)) {
IASTName name = createName(tokens.get(2)); IASTName name = createName(tokens.get(2));
@ -763,13 +762,6 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
ParserUtil.setOffsetAndLength(qualifiedName, startOffset, endOffset - startOffset); ParserUtil.setOffsetAndLength(qualifiedName, startOffset, endOffset - startOffset);
for(IASTName name : reverseIterable(names)) for(IASTName name : reverseIterable(names))
qualifiedName.addName(name); qualifiedName.addName(name);
if(qualifiedName instanceof CPPASTQualifiedName) {
// compute the signature, find the tokens that make up the name
List<IToken> nameTokens = ParserUtil.tokenOffsetSubList(parser.getRuleTokens(), startOffset, endOffset);
String signature = createStringRepresentation(nameTokens);
((CPPASTQualifiedName)qualifiedName).setSignature(signature);
}
// there must be a dummy name in the AST after the last double colon, this happens with pointer to member names // there must be a dummy name in the AST after the last double colon, this happens with pointer to member names
if(endsWithColonColon) { if(endsWithColonColon) {
@ -780,39 +772,9 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
return qualifiedName; return qualifiedName;
} }
private String createStringRepresentation(List<IToken> nameTokens) {
StringBuilder sb = new StringBuilder();
IToken prev = null;
for(IToken t : nameTokens) {
if(needSpaceBetween(prev, t))
sb.append(' ');
sb.append(t.toString());
prev = t;
}
return sb.toString();
}
private boolean needSpaceBetween(IToken prev, IToken iter) {
// this logic was copied from BasicTokenDuple.createCharArrayRepresentation()
if(prev == null)
return false;
int prevKind = baseKind(prev);
int iterKind = baseKind(iter);
return prevKind != TK_ColonColon &&
prevKind != TK_identifier &&
prevKind != TK_LT &&
prevKind != TK_Tilde &&
iterKind != TK_GT &&
prevKind != TK_LeftBracket &&
iterKind != TK_RightBracket &&
iterKind != TK_ColonColon;
}
/** /**
* Consumes grammar sub-rules of the following form: * Consumes grammar sub-rules of the following form:
* *
@ -879,7 +841,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
public void consumeNamespaceAliasDefinition() { public void consumeNamespaceAliasDefinition() {
IASTName qualifiedName = subRuleQualifiedName(false); IASTName qualifiedName = subRuleQualifiedName(false);
IASTName alias = createName(parser.getRuleTokens().get(1)); IASTName alias = createName(stream.getRuleTokens().get(1));
ICPPASTNamespaceAlias namespaceAlias = nodeFactory.newNamespaceAlias(alias, qualifiedName); ICPPASTNamespaceAlias namespaceAlias = nodeFactory.newNamespaceAlias(alias, qualifiedName);
setOffsetAndLength(namespaceAlias); setOffsetAndLength(namespaceAlias);
@ -922,7 +884,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
* | 'extern' 'stringlit' <openscope-ast> declaration * | 'extern' 'stringlit' <openscope-ast> declaration
*/ */
public void consumeLinkageSpecification() { public void consumeLinkageSpecification() {
String name = parser.getRuleTokens().get(1).toString(); String name = stream.getRuleTokens().get(1).toString();
ICPPASTLinkageSpecification linkageSpec = nodeFactory.newLinkageSpecification(name); ICPPASTLinkageSpecification linkageSpec = nodeFactory.newLinkageSpecification(name);
for(Object declaration : astStack.closeScope()) for(Object declaration : astStack.closeScope())
@ -1122,7 +1084,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
} }
// the only way there could be a typename token // the only way there could be a typename token
for(IToken token : parser.getRuleTokens()) { for(IToken token : stream.getRuleTokens()) {
if(baseKind(token) == TK_typename) { if(baseKind(token) == TK_typename) {
declSpec.setIsTypename(true); declSpec.setIsTypename(true);
break; break;
@ -1142,7 +1104,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
*/ */
public void consumeTypeSpecifierElaborated(boolean hasOptionalTemplateKeyword) { public void consumeTypeSpecifierElaborated(boolean hasOptionalTemplateKeyword) {
IASTName name = subRuleQualifiedName(hasOptionalTemplateKeyword); IASTName name = subRuleQualifiedName(hasOptionalTemplateKeyword);
int kind = getElaboratedTypeSpecifier(parser.getLeftIToken()); int kind = getElaboratedTypeSpecifier(stream.getLeftIToken());
IASTElaboratedTypeSpecifier typeSpecifier = nodeFactory.newElaboratedTypeSpecifier(kind, name); IASTElaboratedTypeSpecifier typeSpecifier = nodeFactory.newElaboratedTypeSpecifier(kind, name);
@ -1172,7 +1134,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
List<Object> declarators = hasDeclaratorList ? astStack.closeScope() : Collections.emptyList(); List<Object> declarators = hasDeclaratorList ? astStack.closeScope() : Collections.emptyList();
ICPPASTDeclSpecifier declSpec = (ICPPASTDeclSpecifier) astStack.pop(); // may be null ICPPASTDeclSpecifier declSpec = (ICPPASTDeclSpecifier) astStack.pop(); // may be null
List<IToken> ruleTokens = parser.getRuleTokens(); List<IToken> ruleTokens = stream.getRuleTokens();
IToken nameToken = null; IToken nameToken = null;
@ -1184,7 +1146,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
// In the case that a single completion token is parsed then it needs // In the case that a single completion token is parsed then it needs
// to be interpreted as a named type specifier for content assist to work. // to be interpreted as a named type specifier for content assist to work.
else if(matchTokens(ruleTokens, tokenMap, TK_Completion, TK_EndOfCompletion)) { else if(matchTokens(ruleTokens, tokenMap, TK_Completion, TK_EndOfCompletion)) {
IASTName name = createName(parser.getLeftIToken()); IASTName name = createName(stream.getLeftIToken());
declSpec = nodeFactory.newTypedefNameSpecifier(name); declSpec = nodeFactory.newTypedefNameSpecifier(name);
ParserUtil.setOffsetAndLength(declSpec, offset(name), length(name)); ParserUtil.setOffsetAndLength(declSpec, offset(name), length(name));
declarators = Collections.emptyList(); // throw away the bogus declarator declarators = Collections.emptyList(); // throw away the bogus declarator
@ -1193,7 +1155,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
// can happen if implicit int is used // can happen if implicit int is used
else if(declSpec == null) { else if(declSpec == null) {
declSpec = nodeFactory.newSimpleDeclSpecifier(); declSpec = nodeFactory.newSimpleDeclSpecifier();
ParserUtil.setOffsetAndLength(declSpec, parser.getLeftIToken().getStartOffset(), 0); ParserUtil.setOffsetAndLength(declSpec, stream.getLeftIToken().getStartOffset(), 0);
} }
@ -1213,7 +1175,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
for(IToken t : ruleTokens.subList(0, ruleTokens.size()-1)) for(IToken t : ruleTokens.subList(0, ruleTokens.size()-1))
setSpecifier(declSpec, t); setSpecifier(declSpec, t);
int offset = offset(parser.getLeftIToken()); int offset = offset(stream.getLeftIToken());
int length = endOffset(ruleTokens.get(ruleTokens.size()-2)) - offset; int length = endOffset(ruleTokens.get(ruleTokens.size()-2)) - offset;
ParserUtil.setOffsetAndLength(declSpec, offset, length); ParserUtil.setOffsetAndLength(declSpec, offset, length);
@ -1253,7 +1215,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
IASTDeclarator nested = declarator.getNestedDeclarator(); IASTDeclarator nested = declarator.getNestedDeclarator();
ICPPASTSimpleDeclSpecifier simpleDeclSpec = nodeFactory.newSimpleDeclSpecifier(); // empty ICPPASTSimpleDeclSpecifier simpleDeclSpec = nodeFactory.newSimpleDeclSpecifier(); // empty
ParserUtil.setOffsetAndLength(simpleDeclSpec, parser.getLeftIToken().getStartOffset(), 0); ParserUtil.setOffsetAndLength(simpleDeclSpec, stream.getLeftIToken().getStartOffset(), 0);
if(!classNames.isEmpty() && nested != null && ParserUtil.isSameName(name, classNames.getLast())) { if(!classNames.isEmpty() && nested != null && ParserUtil.isSameName(name, classNames.getLast())) {
@ -1314,7 +1276,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
if(!(declarator instanceof IASTFunctionDeclarator)) if(!(declarator instanceof IASTFunctionDeclarator))
return; return;
IParser<IASTDeclarator> secondaryParser = parserFactory.getNoFunctionDeclaratorParser(parser); ISecondaryParser<IASTDeclarator> secondaryParser = parserFactory.getNoFunctionDeclaratorParser(stream, options);
IASTDeclarator notFunctionDeclarator = runSecondaryParser(secondaryParser); IASTDeclarator notFunctionDeclarator = runSecondaryParser(secondaryParser);
if(notFunctionDeclarator == null) if(notFunctionDeclarator == null)
@ -1405,7 +1367,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void consumeClassHead(boolean hasNestedNameSpecifier) { public void consumeClassHead(boolean hasNestedNameSpecifier) {
int key = getCompositeTypeSpecifier(parser.getLeftIToken()); int key = getCompositeTypeSpecifier(stream.getLeftIToken());
List<Object> baseSpecifiers = astStack.closeScope(); List<Object> baseSpecifiers = astStack.closeScope();
// may be null, but if it is then hasNestedNameSpecifier == false // may be null, but if it is then hasNestedNameSpecifier == false
IASTName className = (IASTName) astStack.pop(); IASTName className = (IASTName) astStack.pop();
@ -1491,7 +1453,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
int endOffset = endOffset(nestedNames.getFirst()); // temporary int endOffset = endOffset(nestedNames.getFirst()); // temporary
// find the last double colon by searching for it // find the last double colon by searching for it
for(IToken t : reverseIterable(parser.getRuleTokens())) { for(IToken t : reverseIterable(stream.getRuleTokens())) {
if(baseKind(t) == TK_ColonColon) { if(baseKind(t) == TK_ColonColon) {
endOffset = endOffset(t); endOffset = endOffset(t);
break; break;
@ -1556,7 +1518,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
} }
if(hasDeclarator) { if(hasDeclarator) {
int endOffset = endOffset(parser.getRightIToken()); int endOffset = endOffset(stream.getRightIToken());
addFunctionModifier(declarator, endOffset); addFunctionModifier(declarator, endOffset);
} }
else { else {
@ -1571,7 +1533,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
*/ */
public void consumeAbstractDeclaratorEmpty() { public void consumeAbstractDeclaratorEmpty() {
IASTName name = nodeFactory.newName(); IASTName name = nodeFactory.newName();
ParserUtil.setOffsetAndLength(name, offset(parser.getLeftIToken())+1, 0); ParserUtil.setOffsetAndLength(name, offset(stream.getLeftIToken())+1, 0);
IASTDeclarator declarator = nodeFactory.newDeclarator(name); IASTDeclarator declarator = nodeFactory.newDeclarator(name);
setOffsetAndLength(declarator); setOffsetAndLength(declarator);
astStack.push(declarator); astStack.push(declarator);
@ -1610,7 +1572,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
if(declSpec == null) { // can happen if implicit int is used if(declSpec == null) { // can happen if implicit int is used
declSpec = nodeFactory.newSimpleDeclSpecifier(); declSpec = nodeFactory.newSimpleDeclSpecifier();
ParserUtil.setOffsetAndLength(declSpec, parser.getLeftIToken().getStartOffset(), 0); ParserUtil.setOffsetAndLength(declSpec, stream.getLeftIToken().getStartOffset(), 0);
} }
else if(disambiguateToConstructor(declSpec, declarator)) { else if(disambiguateToConstructor(declSpec, declarator)) {
declSpec = (IASTDeclSpecifier) astStack.pop(); declSpec = (IASTDeclSpecifier) astStack.pop();
@ -1689,7 +1651,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
if(name == null) if(name == null)
name = nodeFactory.newName(); name = nodeFactory.newName();
int type = getTemplateParameterType(parser.getLeftIToken()); int type = getTemplateParameterType(stream.getLeftIToken());
ICPPASTSimpleTypeTemplateParameter templateParameter = nodeFactory.newSimpleTypeTemplateParameter(type, name, typeId); ICPPASTSimpleTypeTemplateParameter templateParameter = nodeFactory.newSimpleTypeTemplateParameter(type, name, typeId);
@ -1723,7 +1685,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
* Yes its a hack. * Yes its a hack.
*/ */
public void consumeTemplateParamterDeclaration() { public void consumeTemplateParamterDeclaration() {
IParser<ICPPASTTemplateParameter> typeParameterParser = parserFactory.getTemplateTypeParameterParser(parser); ISecondaryParser<ICPPASTTemplateParameter> typeParameterParser = parserFactory.getTemplateTypeParameterParser(stream, options);
IASTNode alternate = runSecondaryParser(typeParameterParser); IASTNode alternate = runSecondaryParser(typeParameterParser);
if(alternate == null) if(alternate == null)

View file

@ -10,11 +10,14 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.dom.lrparser.action.cpp; package org.eclipse.cdt.core.dom.lrparser.action.cpp;
import java.util.Set;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.ISecondaryParser;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPExpressionParser; import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPExpressionParser;
import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPNoCastExpressionParser; import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPNoCastExpressionParser;
import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPNoFunctionDeclaratorParser; import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPNoFunctionDeclaratorParser;
@ -31,24 +34,24 @@ public class CPPSecondaryParserFactory implements ICPPSecondaryParserFactory {
} }
public IParser<ICPPASTTemplateParameter> getTemplateTypeParameterParser(IParserActionTokenProvider parser) { public ISecondaryParser<ICPPASTTemplateParameter> getTemplateTypeParameterParser(ITokenStream stream, Set<IParser.Options> options) {
return new CPPTemplateTypeParameterParser(parser); return new CPPTemplateTypeParameterParser(stream, options);
} }
public IParser<IASTDeclarator> getNoFunctionDeclaratorParser(IParserActionTokenProvider parser) { public ISecondaryParser<IASTDeclarator> getNoFunctionDeclaratorParser(ITokenStream stream, Set<IParser.Options> options) {
return new CPPNoFunctionDeclaratorParser(parser); return new CPPNoFunctionDeclaratorParser(stream, options);
} }
public IParser<IASTExpression> getExpressionParser(IParserActionTokenProvider parser) { public ISecondaryParser<IASTExpression> getExpressionParser(ITokenStream stream, Set<IParser.Options> options) {
return new CPPExpressionParser(parser); return new CPPExpressionParser(stream, options);
} }
public IParser<IASTExpression> getNoCastExpressionParser(IParserActionTokenProvider parser) { public ISecondaryParser<IASTExpression> getNoCastExpressionParser(ITokenStream stream, Set<IParser.Options> options) {
return new CPPNoCastExpressionParser(parser); return new CPPNoCastExpressionParser(stream, options);
} }
public IParser<IASTExpression> getSizeofExpressionParser(IParserActionTokenProvider parser) { public ISecondaryParser<IASTExpression> getSizeofExpressionParser(ITokenStream stream, Set<IParser.Options> options) {
return new CPPSizeofExpressionParser(parser); return new CPPSizeofExpressionParser(stream, options);
} }
} }

View file

@ -10,11 +10,14 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.dom.lrparser.action.cpp; package org.eclipse.cdt.core.dom.lrparser.action.cpp;
import java.util.Set;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.ISecondaryParser;
import org.eclipse.cdt.core.dom.lrparser.action.ISecondaryParserFactory; import org.eclipse.cdt.core.dom.lrparser.action.ISecondaryParserFactory;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
/** /**
@ -24,8 +27,8 @@ import org.eclipse.cdt.core.dom.lrparser.action.ISecondaryParserFactory;
*/ */
public interface ICPPSecondaryParserFactory extends ISecondaryParserFactory { public interface ICPPSecondaryParserFactory extends ISecondaryParserFactory {
IParser<ICPPASTTemplateParameter> getTemplateTypeParameterParser(IParserActionTokenProvider parser); ISecondaryParser<ICPPASTTemplateParameter> getTemplateTypeParameterParser(ITokenStream stream, Set<IParser.Options> options);
IParser<IASTDeclarator> getNoFunctionDeclaratorParser(IParserActionTokenProvider parser); ISecondaryParser<IASTDeclarator> getNoFunctionDeclaratorParser(ITokenStream stream, Set<IParser.Options> options);
} }

View file

@ -20,7 +20,7 @@ import org.eclipse.cdt.core.dom.ast.c.ICASTFieldDesignator;
import org.eclipse.cdt.core.dom.ast.c.ICASTSimpleDeclSpecifier; import org.eclipse.cdt.core.dom.ast.c.ICASTSimpleDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.c.ICNodeFactory; import org.eclipse.cdt.core.dom.ast.c.ICNodeFactory;
import org.eclipse.cdt.core.dom.ast.gnu.c.IGCCASTArrayRangeDesignator; import org.eclipse.cdt.core.dom.ast.gnu.c.IGCCASTArrayRangeDesignator;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack; import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack;
import org.eclipse.cdt.core.dom.lrparser.action.c99.C99BuildASTParserAction; import org.eclipse.cdt.core.dom.lrparser.action.c99.C99BuildASTParserAction;
@ -30,7 +30,7 @@ public class GCCBuildASTParserAction extends GNUBuildASTParserAction {
private C99BuildASTParserAction baseAction; private C99BuildASTParserAction baseAction;
public GCCBuildASTParserAction(IParserActionTokenProvider parser, ScopedStack<Object> astStack, ICNodeFactory nodeFactory) { public GCCBuildASTParserAction(ITokenStream parser, ScopedStack<Object> astStack, ICNodeFactory nodeFactory) {
super(parser, astStack, nodeFactory); super(parser, astStack, nodeFactory);
this.nodeFactory = nodeFactory; this.nodeFactory = nodeFactory;
} }
@ -45,7 +45,7 @@ public class GCCBuildASTParserAction extends GNUBuildASTParserAction {
* ::= identifier_token ':' * ::= identifier_token ':'
*/ */
public void consumeDesignatorField() { public void consumeDesignatorField() {
IASTName name = createName(parser.getLeftIToken()); IASTName name = createName(stream.getLeftIToken());
ICASTFieldDesignator designator = nodeFactory.newFieldDesignator(name); ICASTFieldDesignator designator = nodeFactory.newFieldDesignator(name);
setOffsetAndLength(designator); setOffsetAndLength(designator);
astStack.push(designator); astStack.push(designator);

View file

@ -10,10 +10,13 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.dom.lrparser.action.gnu; package org.eclipse.cdt.core.dom.lrparser.action.gnu;
import java.util.Set;
import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.ISecondaryParser;
import org.eclipse.cdt.core.dom.lrparser.action.ISecondaryParserFactory; import org.eclipse.cdt.core.dom.lrparser.action.ISecondaryParserFactory;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.internal.core.dom.lrparser.c99.C99ExpressionParser; import org.eclipse.cdt.internal.core.dom.lrparser.c99.C99ExpressionParser;
import org.eclipse.cdt.internal.core.dom.lrparser.c99.C99NoCastExpressionParser; import org.eclipse.cdt.internal.core.dom.lrparser.c99.C99NoCastExpressionParser;
import org.eclipse.cdt.internal.core.dom.lrparser.gcc.GCCSizeofExpressionParser; import org.eclipse.cdt.internal.core.dom.lrparser.gcc.GCCSizeofExpressionParser;
@ -27,15 +30,15 @@ public class GCCSecondaryParserFactory implements ISecondaryParserFactory {
} }
public IParser<IASTExpression> getExpressionParser(IParserActionTokenProvider parser) { public ISecondaryParser<IASTExpression> getExpressionParser(ITokenStream stream, Set<IParser.Options> options) {
return new C99ExpressionParser(parser); return new C99ExpressionParser(stream, options);
} }
public IParser<IASTExpression> getNoCastExpressionParser(IParserActionTokenProvider parser) { public ISecondaryParser<IASTExpression> getNoCastExpressionParser(ITokenStream stream, Set<IParser.Options> options) {
return new C99NoCastExpressionParser(parser); return new C99NoCastExpressionParser(stream, options);
} }
public IParser<IASTExpression> getSizeofExpressionParser(IParserActionTokenProvider parser) { public ISecondaryParser<IASTExpression> getSizeofExpressionParser(ITokenStream stream, Set<IParser.Options> options) {
return new GCCSizeofExpressionParser(parser); return new GCCSizeofExpressionParser(stream, options);
} }
} }

View file

@ -19,8 +19,8 @@ import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.INodeFactory; import org.eclipse.cdt.core.dom.ast.INodeFactory;
import org.eclipse.cdt.core.dom.ast.gnu.IGNUASTCompoundStatementExpression; import org.eclipse.cdt.core.dom.ast.gnu.IGNUASTCompoundStatementExpression;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
import org.eclipse.cdt.core.dom.lrparser.action.AbstractParserAction; import org.eclipse.cdt.core.dom.lrparser.action.AbstractParserAction;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack; import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap; import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
import org.eclipse.cdt.internal.core.dom.lrparser.gcc.GCCParsersym; import org.eclipse.cdt.internal.core.dom.lrparser.gcc.GCCParsersym;
@ -31,7 +31,7 @@ public class GNUBuildASTParserAction extends AbstractParserAction {
private final TokenMap tokenMap; private final TokenMap tokenMap;
public GNUBuildASTParserAction(IParserActionTokenProvider parser, ScopedStack<Object> astStack, INodeFactory nodeFactory) { public GNUBuildASTParserAction(ITokenStream parser, ScopedStack<Object> astStack, INodeFactory nodeFactory) {
super(parser, astStack); super(parser, astStack);
this.nodeFactory = nodeFactory; this.nodeFactory = nodeFactory;
@ -64,7 +64,7 @@ public class GNUBuildASTParserAction extends AbstractParserAction {
* *
*/ */
public void consumeDeclarationASM() { public void consumeDeclarationASM() {
List<IToken> tokens = parser.getRuleTokens(); List<IToken> tokens = stream.getRuleTokens();
int firstToken = 2; int firstToken = 2;
if(tokenMap.mapKind(tokens.get(1).getKind()) == GCCParsersym.TK_volatile) if(tokenMap.mapKind(tokens.get(1).getKind()) == GCCParsersym.TK_volatile)

View file

@ -20,7 +20,7 @@ import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleDeclSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNodeFactory; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNodeFactory;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPASTSimpleDeclSpecifier; import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPASTSimpleDeclSpecifier;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack; import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack;
import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPBuildASTParserAction; import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPBuildASTParserAction;
import org.eclipse.cdt.internal.core.dom.lrparser.gpp.GPPParsersym; import org.eclipse.cdt.internal.core.dom.lrparser.gpp.GPPParsersym;
@ -32,7 +32,7 @@ public class GPPBuildASTParserAction extends GNUBuildASTParserAction {
private CPPBuildASTParserAction baseAction; private CPPBuildASTParserAction baseAction;
public GPPBuildASTParserAction(IParserActionTokenProvider parser, ScopedStack<Object> astStack, ICPPNodeFactory nodeFactory) { public GPPBuildASTParserAction(ITokenStream parser, ScopedStack<Object> astStack, ICPPNodeFactory nodeFactory) {
super(parser, astStack, nodeFactory); super(parser, astStack, nodeFactory);
this.nodeFactory = nodeFactory; this.nodeFactory = nodeFactory;
} }

View file

@ -10,11 +10,14 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.dom.lrparser.action.gnu; package org.eclipse.cdt.core.dom.lrparser.action.gnu;
import java.util.Set;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.ISecondaryParser;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.core.dom.lrparser.action.cpp.ICPPSecondaryParserFactory; import org.eclipse.cdt.core.dom.lrparser.action.cpp.ICPPSecondaryParserFactory;
import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPExpressionParser; import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPExpressionParser;
import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPNoCastExpressionParser; import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPNoCastExpressionParser;
@ -32,24 +35,24 @@ public class GPPSecondaryParserFactory implements ICPPSecondaryParserFactory {
} }
public IParser<ICPPASTTemplateParameter> getTemplateTypeParameterParser(IParserActionTokenProvider parser) { public ISecondaryParser<ICPPASTTemplateParameter> getTemplateTypeParameterParser(ITokenStream stream, Set<IParser.Options> options) {
return new CPPTemplateTypeParameterParser(parser); return new CPPTemplateTypeParameterParser(stream, options);
} }
public IParser<IASTDeclarator> getNoFunctionDeclaratorParser(IParserActionTokenProvider parser) { public ISecondaryParser<IASTDeclarator> getNoFunctionDeclaratorParser(ITokenStream stream, Set<IParser.Options> options) {
return new CPPNoFunctionDeclaratorParser(parser); return new CPPNoFunctionDeclaratorParser(stream, options);
} }
public IParser<IASTExpression> getExpressionParser(IParserActionTokenProvider parser) { public ISecondaryParser<IASTExpression> getExpressionParser(ITokenStream stream, Set<IParser.Options> options) {
return new CPPExpressionParser(parser); return new CPPExpressionParser(stream, options);
} }
public IParser<IASTExpression> getNoCastExpressionParser(IParserActionTokenProvider parser) { public ISecondaryParser<IASTExpression> getNoCastExpressionParser(ITokenStream stream, Set<IParser.Options> options) {
return new CPPNoCastExpressionParser(parser); return new CPPNoCastExpressionParser(stream, options);
} }
public IParser<IASTExpression> getSizeofExpressionParser(IParserActionTokenProvider parser) { public ISecondaryParser<IASTExpression> getSizeofExpressionParser(ITokenStream stream, Set<IParser.Options> options) {
return new GPPSizeofExpressionParser(parser); return new GPPSizeofExpressionParser(stream, options);
} }
} }

View file

@ -10,17 +10,19 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.dom.lrparser.c99; package org.eclipse.cdt.core.dom.lrparser.c99;
import java.util.Set;
import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.lrparser.BaseExtensibleLanguage; import org.eclipse.cdt.core.dom.lrparser.BaseExtensibleLanguage;
import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.ScannerExtensionConfiguration; import org.eclipse.cdt.core.dom.lrparser.ScannerExtensionConfiguration;
import org.eclipse.cdt.core.dom.lrparser.IParser.Options;
import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider; import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider;
import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration; import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.c.ANSICParserExtensionConfiguration; import org.eclipse.cdt.core.dom.parser.c.ANSICParserExtensionConfiguration;
import org.eclipse.cdt.core.model.IContributedModelBuilder; import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.internal.core.dom.lrparser.c99.C99Parser; import org.eclipse.cdt.internal.core.dom.lrparser.c99.C99Parser;
@ -40,24 +42,16 @@ public class C99Language extends BaseExtensibleLanguage {
return DEFAULT; return DEFAULT;
} }
@Override @Override
protected IParser<IASTTranslationUnit> getParser() { protected IParser<IASTTranslationUnit> getParser(IScanner scanner, IIndex index, Set<Options> options) {
return new C99Parser(); return new C99Parser(scanner, DOMToC99TokenMap.DEFAULT_MAP, getBuiltinBindingsProvider(), index, options);
}
@Override
protected IDOMTokenMap getTokenMap() {
return DOMToC99TokenMap.DEFAULT_MAP;
} }
@Override @Override
protected IScannerExtensionConfiguration getScannerExtensionConfiguration() { protected IScannerExtensionConfiguration getScannerExtensionConfiguration() {
return ScannerExtensionConfiguration.createC(); return ScannerExtensionConfiguration.createC();
} }
public IContributedModelBuilder createModelBuilder(@SuppressWarnings("unused") ITranslationUnit tu) {
return null;
}
public String getId() { public String getId() {
return ID; return ID;
@ -72,8 +66,7 @@ public class C99Language extends BaseExtensibleLanguage {
return ParserLanguage.C; return ParserLanguage.C;
} }
@Override private IBuiltinBindingsProvider getBuiltinBindingsProvider() {
protected IBuiltinBindingsProvider getBuiltinBindingsProvider() {
return new ANSICParserExtensionConfiguration().getBuiltinBindingsProvider(); return new ANSICParserExtensionConfiguration().getBuiltinBindingsProvider();
} }

View file

@ -10,17 +10,18 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.dom.lrparser.cpp; package org.eclipse.cdt.core.dom.lrparser.cpp;
import java.util.Set;
import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.lrparser.BaseExtensibleLanguage; import org.eclipse.cdt.core.dom.lrparser.BaseExtensibleLanguage;
import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.ScannerExtensionConfiguration; import org.eclipse.cdt.core.dom.lrparser.ScannerExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider; import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider;
import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration; import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.cpp.ANSICPPParserExtensionConfiguration; import org.eclipse.cdt.core.dom.parser.cpp.ANSICPPParserExtensionConfiguration;
import org.eclipse.cdt.core.model.IContributedModelBuilder; import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParser; import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParser;
@ -40,13 +41,8 @@ public class ISOCPPLanguage extends BaseExtensibleLanguage {
} }
@Override @Override
protected IParser<IASTTranslationUnit> getParser() { protected IParser<IASTTranslationUnit> getParser(IScanner scanner, IIndex index, Set<IParser.Options> options) {
return new CPPParser(); return new CPPParser(scanner, DOMToISOCPPTokenMap.DEFAULT_MAP, getBuiltinBindingsProvider(), index, options);
}
@Override
protected IDOMTokenMap getTokenMap() {
return DOMToISOCPPTokenMap.DEFAULT_MAP;
} }
@Override @Override
@ -54,10 +50,6 @@ public class ISOCPPLanguage extends BaseExtensibleLanguage {
return ScannerExtensionConfiguration.createCPP(); return ScannerExtensionConfiguration.createCPP();
} }
public IContributedModelBuilder createModelBuilder(@SuppressWarnings("unused") ITranslationUnit tu) {
return null;
}
public String getId() { public String getId() {
return ID; return ID;
} }
@ -71,7 +63,6 @@ public class ISOCPPLanguage extends BaseExtensibleLanguage {
return ParserLanguage.CPP; return ParserLanguage.CPP;
} }
@Override
protected IBuiltinBindingsProvider getBuiltinBindingsProvider() { protected IBuiltinBindingsProvider getBuiltinBindingsProvider() {
return new ANSICPPParserExtensionConfiguration().getBuiltinBindingsProvider(); return new ANSICPPParserExtensionConfiguration().getBuiltinBindingsProvider();
} }

View file

@ -10,17 +10,18 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.dom.lrparser.gnu; package org.eclipse.cdt.core.dom.lrparser.gnu;
import java.util.Set;
import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.lrparser.BaseExtensibleLanguage; import org.eclipse.cdt.core.dom.lrparser.BaseExtensibleLanguage;
import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider; import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider;
import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration; import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.c.GCCParserExtensionConfiguration; import org.eclipse.cdt.core.dom.parser.c.GCCParserExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.c.GCCScannerExtensionConfiguration; import org.eclipse.cdt.core.dom.parser.c.GCCScannerExtensionConfiguration;
import org.eclipse.cdt.core.model.IContributedModelBuilder; import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.internal.core.dom.lrparser.gcc.GCCParser; import org.eclipse.cdt.internal.core.dom.lrparser.gcc.GCCParser;
@ -40,23 +41,14 @@ public class GCCLanguage extends BaseExtensibleLanguage {
} }
@Override @Override
protected IParser<IASTTranslationUnit> getParser() { protected IParser<IASTTranslationUnit> getParser(IScanner scanner, IIndex index, Set<IParser.Options> options) {
return new GCCParser(); return new GCCParser(scanner, DOMToGCCTokenMap.DEFAULT_MAP, getBuiltinBindingsProvider(), index, options);
}
@Override
protected IDOMTokenMap getTokenMap() {
return DOMToGCCTokenMap.DEFAULT_MAP;
} }
@Override @Override
protected IScannerExtensionConfiguration getScannerExtensionConfiguration() { protected IScannerExtensionConfiguration getScannerExtensionConfiguration() {
return GCCScannerExtensionConfiguration.getInstance(); return GCCScannerExtensionConfiguration.getInstance();
} }
public IContributedModelBuilder createModelBuilder(@SuppressWarnings("unused") ITranslationUnit tu) {
return null;
}
public String getId() { public String getId() {
return ID; return ID;
@ -71,7 +63,6 @@ public class GCCLanguage extends BaseExtensibleLanguage {
return ParserLanguage.C; return ParserLanguage.C;
} }
@Override
protected IBuiltinBindingsProvider getBuiltinBindingsProvider() { protected IBuiltinBindingsProvider getBuiltinBindingsProvider() {
return new GCCParserExtensionConfiguration().getBuiltinBindingsProvider(); return new GCCParserExtensionConfiguration().getBuiltinBindingsProvider();
} }

View file

@ -10,17 +10,18 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.dom.lrparser.gnu; package org.eclipse.cdt.core.dom.lrparser.gnu;
import java.util.Set;
import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.lrparser.BaseExtensibleLanguage; import org.eclipse.cdt.core.dom.lrparser.BaseExtensibleLanguage;
import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider; import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider;
import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration; import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.cpp.GPPParserExtensionConfiguration; import org.eclipse.cdt.core.dom.parser.cpp.GPPParserExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.cpp.GPPScannerExtensionConfiguration; import org.eclipse.cdt.core.dom.parser.cpp.GPPScannerExtensionConfiguration;
import org.eclipse.cdt.core.model.IContributedModelBuilder; import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.internal.core.dom.lrparser.gpp.GPPParser; import org.eclipse.cdt.internal.core.dom.lrparser.gpp.GPPParser;
@ -40,23 +41,14 @@ public class GPPLanguage extends BaseExtensibleLanguage {
} }
@Override @Override
protected IParser<IASTTranslationUnit> getParser() { protected IParser<IASTTranslationUnit> getParser(IScanner scanner, IIndex index, Set<IParser.Options> options) {
return new GPPParser(); return new GPPParser(scanner, DOMToGPPTokenMap.DEFAULT_MAP, getBuiltinBindingsProvider(), index, options);
}
@Override
protected IDOMTokenMap getTokenMap() {
return DOMToGPPTokenMap.DEFAULT_MAP;
} }
@Override @Override
protected IScannerExtensionConfiguration getScannerExtensionConfiguration() { protected IScannerExtensionConfiguration getScannerExtensionConfiguration() {
return GPPScannerExtensionConfiguration.getInstance(); return GPPScannerExtensionConfiguration.getInstance();
} }
public IContributedModelBuilder createModelBuilder(@SuppressWarnings("unused") ITranslationUnit tu) {
return null;
}
public String getId() { public String getId() {
return ID; return ID;
@ -71,7 +63,6 @@ public class GPPLanguage extends BaseExtensibleLanguage {
return ParserLanguage.CPP; return ParserLanguage.CPP;
} }
@Override
protected IBuiltinBindingsProvider getBuiltinBindingsProvider() { protected IBuiltinBindingsProvider getBuiltinBindingsProvider() {
return new GPPParserExtensionConfiguration().getBuiltinBindingsProvider(); return new GPPParserExtensionConfiguration().getBuiltinBindingsProvider();
} }

View file

@ -17,20 +17,29 @@ import lpg.lpgjavaruntime.*;
import java.util.*; import java.util.*;
import org.eclipse.cdt.core.dom.ast.*; import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.CPreprocessorAdapter;
import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.ITokenCollector;
import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser; import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser;
import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack; import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack;
import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap; import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap; import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
import org.eclipse.cdt.core.dom.lrparser.ISecondaryParser;
import org.eclipse.cdt.core.dom.ast.cpp.*; import org.eclipse.cdt.core.dom.ast.cpp.*;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNodeFactory; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNodeFactory;
import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPBuildASTParserAction; import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPBuildASTParserAction;
import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPSecondaryParserFactory; import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPSecondaryParserFactory;
public class CPPExpressionParser extends PrsStream implements RuleAction , IParserActionTokenProvider, IParser< IASTExpression > public class CPPExpressionParser extends PrsStream implements RuleAction, ITokenStream,
ITokenCollector, IParser< IASTExpression >
, ISecondaryParser< IASTExpression >
{ {
private static ParseTable prs = new CPPExpressionParserprs(); private static ParseTable prs = new CPPExpressionParserprs();
private FixedBacktrackingParser btParser; private FixedBacktrackingParser btParser;
@ -168,7 +177,11 @@ public class CPPExpressionParser extends PrsStream implements RuleAction , IPars
private CPPBuildASTParserAction action; private CPPBuildASTParserAction action;
private IASTCompletionNode compNode; private IASTCompletionNode compNode;
public CPPExpressionParser() { // constructor
public CPPExpressionParser(IScanner scanner, IDOMTokenMap tokenMap, IBuiltinBindingsProvider builtinBindingsProvider, IIndex index, Set<IParser.Options> options) {
initActions(options);
action.initializeTranslationUnit(scanner, builtinBindingsProvider, index);
CPreprocessorAdapter.runCPreprocessor(scanner, this, tokenMap);
} }
private void initActions(Set<IParser.Options> options) { private void initActions(Set<IParser.Options> options) {
@ -187,10 +200,9 @@ public void addToken(IToken token) {
} }
public IASTExpression parse(Set<IParser.Options> options) { public IASTExpression parse() {
// this has to be done, or... kaboom! // this has to be done, or... kaboom!
setStreamLength(getSize()); setStreamLength(getSize());
initActions(options);
final int errorRepairCount = -1; // -1 means full error handling final int errorRepairCount = -1; // -1 means full error handling
parser(null, errorRepairCount); // do the actual parse parser(null, errorRepairCount); // do the actual parse
@ -233,12 +245,12 @@ public void setTokens(List<IToken> tokens) {
addToken(new Token(null, 0, 0, CPPExpressionParsersym.TK_EOF_TOKEN)); addToken(new Token(null, 0, 0, CPPExpressionParsersym.TK_EOF_TOKEN));
} }
public CPPExpressionParser(IParserActionTokenProvider parser) { // constructor public CPPExpressionParser(ITokenStream parser, Set<IParser.Options> options) { // constructor for creating secondary parser
initActions(options);
tokenMap = new TokenMap(CPPExpressionParsersym.orderedTerminalSymbols, parser.getOrderedTerminalSymbols()); tokenMap = new TokenMap(CPPExpressionParsersym.orderedTerminalSymbols, parser.getOrderedTerminalSymbols());
} }
public void ruleAction(int ruleNumber) public void ruleAction(int ruleNumber)
{ {
switch (ruleNumber) switch (ruleNumber)
@ -1421,19 +1433,19 @@ public CPPExpressionParser(IParserActionTokenProvider parser) { // constructor
} }
// //
// Rule 328: ptr_operator ::= pointer_hook * <openscope-ast> cv_qualifier_seq_opt // Rule 328: ptr_operator ::= pointer_hook * pointer_hook <openscope-ast> cv_qualifier_seq_opt
// //
case 328: { action. consumePointer(); break; case 328: { action. consumePointer(); break;
} }
// //
// Rule 329: ptr_operator ::= pointer_hook & // Rule 329: ptr_operator ::= pointer_hook & pointer_hook
// //
case 329: { action. consumeReferenceOperator(); break; case 329: { action. consumeReferenceOperator(); break;
} }
// //
// Rule 330: ptr_operator ::= dcolon_opt nested_name_specifier pointer_hook * <openscope-ast> cv_qualifier_seq_opt // Rule 330: ptr_operator ::= dcolon_opt nested_name_specifier pointer_hook * pointer_hook <openscope-ast> cv_qualifier_seq_opt
// //
case 330: { action. consumePointerToMember(); break; case 330: { action. consumePointerToMember(); break;
} }

View file

@ -17,20 +17,29 @@ import lpg.lpgjavaruntime.*;
import java.util.*; import java.util.*;
import org.eclipse.cdt.core.dom.ast.*; import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.CPreprocessorAdapter;
import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.ITokenCollector;
import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser; import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser;
import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack; import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack;
import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap; import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap; import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
import org.eclipse.cdt.core.dom.lrparser.ISecondaryParser;
import org.eclipse.cdt.core.dom.ast.cpp.*; import org.eclipse.cdt.core.dom.ast.cpp.*;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNodeFactory; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNodeFactory;
import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPBuildASTParserAction; import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPBuildASTParserAction;
import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPSecondaryParserFactory; import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPSecondaryParserFactory;
public class CPPNoCastExpressionParser extends PrsStream implements RuleAction , IParserActionTokenProvider, IParser< IASTExpression > public class CPPNoCastExpressionParser extends PrsStream implements RuleAction, ITokenStream,
ITokenCollector, IParser< IASTExpression >
, ISecondaryParser< IASTExpression >
{ {
private static ParseTable prs = new CPPNoCastExpressionParserprs(); private static ParseTable prs = new CPPNoCastExpressionParserprs();
private FixedBacktrackingParser btParser; private FixedBacktrackingParser btParser;
@ -168,7 +177,11 @@ public class CPPNoCastExpressionParser extends PrsStream implements RuleAction ,
private CPPBuildASTParserAction action; private CPPBuildASTParserAction action;
private IASTCompletionNode compNode; private IASTCompletionNode compNode;
public CPPNoCastExpressionParser() { // constructor
public CPPNoCastExpressionParser(IScanner scanner, IDOMTokenMap tokenMap, IBuiltinBindingsProvider builtinBindingsProvider, IIndex index, Set<IParser.Options> options) {
initActions(options);
action.initializeTranslationUnit(scanner, builtinBindingsProvider, index);
CPreprocessorAdapter.runCPreprocessor(scanner, this, tokenMap);
} }
private void initActions(Set<IParser.Options> options) { private void initActions(Set<IParser.Options> options) {
@ -187,10 +200,9 @@ public void addToken(IToken token) {
} }
public IASTExpression parse(Set<IParser.Options> options) { public IASTExpression parse() {
// this has to be done, or... kaboom! // this has to be done, or... kaboom!
setStreamLength(getSize()); setStreamLength(getSize());
initActions(options);
final int errorRepairCount = -1; // -1 means full error handling final int errorRepairCount = -1; // -1 means full error handling
parser(null, errorRepairCount); // do the actual parse parser(null, errorRepairCount); // do the actual parse
@ -233,12 +245,12 @@ public void setTokens(List<IToken> tokens) {
addToken(new Token(null, 0, 0, CPPNoCastExpressionParsersym.TK_EOF_TOKEN)); addToken(new Token(null, 0, 0, CPPNoCastExpressionParsersym.TK_EOF_TOKEN));
} }
public CPPNoCastExpressionParser(IParserActionTokenProvider parser) { // constructor public CPPNoCastExpressionParser(ITokenStream parser, Set<IParser.Options> options) { // constructor for creating secondary parser
initActions(options);
tokenMap = new TokenMap(CPPNoCastExpressionParsersym.orderedTerminalSymbols, parser.getOrderedTerminalSymbols()); tokenMap = new TokenMap(CPPNoCastExpressionParsersym.orderedTerminalSymbols, parser.getOrderedTerminalSymbols());
} }
public void ruleAction(int ruleNumber) public void ruleAction(int ruleNumber)
{ {
switch (ruleNumber) switch (ruleNumber)
@ -1415,19 +1427,19 @@ public CPPNoCastExpressionParser(IParserActionTokenProvider parser) { // constr
} }
// //
// Rule 327: ptr_operator ::= pointer_hook * <openscope-ast> cv_qualifier_seq_opt // Rule 327: ptr_operator ::= pointer_hook * pointer_hook <openscope-ast> cv_qualifier_seq_opt
// //
case 327: { action. consumePointer(); break; case 327: { action. consumePointer(); break;
} }
// //
// Rule 328: ptr_operator ::= pointer_hook & // Rule 328: ptr_operator ::= pointer_hook & pointer_hook
// //
case 328: { action. consumeReferenceOperator(); break; case 328: { action. consumeReferenceOperator(); break;
} }
// //
// Rule 329: ptr_operator ::= dcolon_opt nested_name_specifier pointer_hook * <openscope-ast> cv_qualifier_seq_opt // Rule 329: ptr_operator ::= dcolon_opt nested_name_specifier pointer_hook * pointer_hook <openscope-ast> cv_qualifier_seq_opt
// //
case 329: { action. consumePointerToMember(); break; case 329: { action. consumePointerToMember(); break;
} }

View file

@ -17,20 +17,29 @@ import lpg.lpgjavaruntime.*;
import java.util.*; import java.util.*;
import org.eclipse.cdt.core.dom.ast.*; import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.CPreprocessorAdapter;
import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.ITokenCollector;
import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser; import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser;
import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack; import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack;
import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap; import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap; import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
import org.eclipse.cdt.core.dom.lrparser.ISecondaryParser;
import org.eclipse.cdt.core.dom.ast.cpp.*; import org.eclipse.cdt.core.dom.ast.cpp.*;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNodeFactory; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNodeFactory;
import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPBuildASTParserAction; import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPBuildASTParserAction;
import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPSecondaryParserFactory; import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPSecondaryParserFactory;
public class CPPNoFunctionDeclaratorParser extends PrsStream implements RuleAction , IParserActionTokenProvider, IParser< IASTDeclarator > public class CPPNoFunctionDeclaratorParser extends PrsStream implements RuleAction, ITokenStream,
ITokenCollector, IParser< IASTDeclarator >
, ISecondaryParser< IASTDeclarator >
{ {
private static ParseTable prs = new CPPNoFunctionDeclaratorParserprs(); private static ParseTable prs = new CPPNoFunctionDeclaratorParserprs();
private FixedBacktrackingParser btParser; private FixedBacktrackingParser btParser;
@ -168,7 +177,11 @@ public class CPPNoFunctionDeclaratorParser extends PrsStream implements RuleActi
private CPPBuildASTParserAction action; private CPPBuildASTParserAction action;
private IASTCompletionNode compNode; private IASTCompletionNode compNode;
public CPPNoFunctionDeclaratorParser() { // constructor
public CPPNoFunctionDeclaratorParser(IScanner scanner, IDOMTokenMap tokenMap, IBuiltinBindingsProvider builtinBindingsProvider, IIndex index, Set<IParser.Options> options) {
initActions(options);
action.initializeTranslationUnit(scanner, builtinBindingsProvider, index);
CPreprocessorAdapter.runCPreprocessor(scanner, this, tokenMap);
} }
private void initActions(Set<IParser.Options> options) { private void initActions(Set<IParser.Options> options) {
@ -187,10 +200,9 @@ public void addToken(IToken token) {
} }
public IASTDeclarator parse(Set<IParser.Options> options) { public IASTDeclarator parse() {
// this has to be done, or... kaboom! // this has to be done, or... kaboom!
setStreamLength(getSize()); setStreamLength(getSize());
initActions(options);
final int errorRepairCount = -1; // -1 means full error handling final int errorRepairCount = -1; // -1 means full error handling
parser(null, errorRepairCount); // do the actual parse parser(null, errorRepairCount); // do the actual parse
@ -233,12 +245,12 @@ public void setTokens(List<IToken> tokens) {
addToken(new Token(null, 0, 0, CPPNoFunctionDeclaratorParsersym.TK_EOF_TOKEN)); addToken(new Token(null, 0, 0, CPPNoFunctionDeclaratorParsersym.TK_EOF_TOKEN));
} }
public CPPNoFunctionDeclaratorParser(IParserActionTokenProvider parser) { // constructor public CPPNoFunctionDeclaratorParser(ITokenStream parser, Set<IParser.Options> options) { // constructor for creating secondary parser
initActions(options);
tokenMap = new TokenMap(CPPNoFunctionDeclaratorParsersym.orderedTerminalSymbols, parser.getOrderedTerminalSymbols()); tokenMap = new TokenMap(CPPNoFunctionDeclaratorParsersym.orderedTerminalSymbols, parser.getOrderedTerminalSymbols());
} }
public void ruleAction(int ruleNumber) public void ruleAction(int ruleNumber)
{ {
switch (ruleNumber) switch (ruleNumber)
@ -1415,19 +1427,19 @@ public CPPNoFunctionDeclaratorParser(IParserActionTokenProvider parser) { // co
} }
// //
// Rule 326: ptr_operator ::= pointer_hook * <openscope-ast> cv_qualifier_seq_opt // Rule 326: ptr_operator ::= pointer_hook * pointer_hook <openscope-ast> cv_qualifier_seq_opt
// //
case 326: { action. consumePointer(); break; case 326: { action. consumePointer(); break;
} }
// //
// Rule 327: ptr_operator ::= pointer_hook & // Rule 327: ptr_operator ::= pointer_hook & pointer_hook
// //
case 327: { action. consumeReferenceOperator(); break; case 327: { action. consumeReferenceOperator(); break;
} }
// //
// Rule 328: ptr_operator ::= dcolon_opt nested_name_specifier pointer_hook * <openscope-ast> cv_qualifier_seq_opt // Rule 328: ptr_operator ::= dcolon_opt nested_name_specifier pointer_hook * pointer_hook <openscope-ast> cv_qualifier_seq_opt
// //
case 328: { action. consumePointerToMember(); break; case 328: { action. consumePointerToMember(); break;
} }

View file

@ -17,20 +17,25 @@ import lpg.lpgjavaruntime.*;
import java.util.*; import java.util.*;
import org.eclipse.cdt.core.dom.ast.*; import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.CPreprocessorAdapter;
import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.ITokenCollector;
import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser; import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack; import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack;
import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap; import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap; import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.dom.ast.cpp.*; import org.eclipse.cdt.core.dom.ast.cpp.*;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNodeFactory; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNodeFactory;
import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPBuildASTParserAction; import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPBuildASTParserAction;
import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPSecondaryParserFactory; import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPSecondaryParserFactory;
public class CPPParser extends PrsStream implements RuleAction , IParserActionTokenProvider, IParser< IASTTranslationUnit > public class CPPParser extends PrsStream implements RuleAction, ITokenStream,
ITokenCollector, IParser< IASTTranslationUnit >
{ {
private static ParseTable prs = new CPPParserprs(); private static ParseTable prs = new CPPParserprs();
private FixedBacktrackingParser btParser; private FixedBacktrackingParser btParser;
@ -168,7 +173,11 @@ public class CPPParser extends PrsStream implements RuleAction , IParserActionTo
private CPPBuildASTParserAction action; private CPPBuildASTParserAction action;
private IASTCompletionNode compNode; private IASTCompletionNode compNode;
public CPPParser() { // constructor
public CPPParser(IScanner scanner, IDOMTokenMap tokenMap, IBuiltinBindingsProvider builtinBindingsProvider, IIndex index, Set<IParser.Options> options) {
initActions(options);
action.initializeTranslationUnit(scanner, builtinBindingsProvider, index);
CPreprocessorAdapter.runCPreprocessor(scanner, this, tokenMap);
} }
private void initActions(Set<IParser.Options> options) { private void initActions(Set<IParser.Options> options) {
@ -187,17 +196,16 @@ public void addToken(IToken token) {
} }
public IASTTranslationUnit parse(Set<IParser.Options> options) { public IASTTranslationUnit parse() {
// this has to be done, or... kaboom! // this has to be done, or... kaboom!
setStreamLength(getSize()); setStreamLength(getSize());
initActions(options);
final int errorRepairCount = -1; // -1 means full error handling final int errorRepairCount = -1; // -1 means full error handling
parser(null, errorRepairCount); // do the actual parse parser(null, errorRepairCount); // do the actual parse
super.resetTokenStream(); // allow tokens to be garbage collected super.resetTokenStream(); // allow tokens to be garbage collected
compNode = action.getASTCompletionNode(); // the completion node may be null compNode = action.getASTCompletionNode(); // the completion node may be null
return ( IASTTranslationUnit ) action.getParseResult(); return ( IASTTranslationUnit ) action.getParseResult();
} }
@ -220,25 +228,6 @@ public String getName() {
} }
private ITokenMap tokenMap = null;
public void setTokens(List<IToken> tokens) {
resetTokenStream();
addToken(new Token(null, 0, 0, 0)); // dummy token
for(IToken token : tokens) {
token.setKind(tokenMap.mapKind(token.getKind()));
addToken(token);
}
addToken(new Token(null, 0, 0, CPPParsersym.TK_EOF_TOKEN));
}
public CPPParser(IParserActionTokenProvider parser) { // constructor
tokenMap = new TokenMap(CPPParsersym.orderedTerminalSymbols, parser.getOrderedTerminalSymbols());
}
public void ruleAction(int ruleNumber) public void ruleAction(int ruleNumber)
{ {
switch (ruleNumber) switch (ruleNumber)
@ -1421,19 +1410,19 @@ public CPPParser(IParserActionTokenProvider parser) { // constructor
} }
// //
// Rule 328: ptr_operator ::= pointer_hook * <openscope-ast> cv_qualifier_seq_opt // Rule 328: ptr_operator ::= pointer_hook * pointer_hook <openscope-ast> cv_qualifier_seq_opt
// //
case 328: { action. consumePointer(); break; case 328: { action. consumePointer(); break;
} }
// //
// Rule 329: ptr_operator ::= pointer_hook & // Rule 329: ptr_operator ::= pointer_hook & pointer_hook
// //
case 329: { action. consumeReferenceOperator(); break; case 329: { action. consumeReferenceOperator(); break;
} }
// //
// Rule 330: ptr_operator ::= dcolon_opt nested_name_specifier pointer_hook * <openscope-ast> cv_qualifier_seq_opt // Rule 330: ptr_operator ::= dcolon_opt nested_name_specifier pointer_hook * pointer_hook <openscope-ast> cv_qualifier_seq_opt
// //
case 330: { action. consumePointerToMember(); break; case 330: { action. consumePointerToMember(); break;
} }

View file

@ -17,20 +17,29 @@ import lpg.lpgjavaruntime.*;
import java.util.*; import java.util.*;
import org.eclipse.cdt.core.dom.ast.*; import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.CPreprocessorAdapter;
import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.ITokenCollector;
import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser; import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser;
import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack; import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack;
import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap; import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap; import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
import org.eclipse.cdt.core.dom.lrparser.ISecondaryParser;
import org.eclipse.cdt.core.dom.ast.cpp.*; import org.eclipse.cdt.core.dom.ast.cpp.*;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNodeFactory; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNodeFactory;
import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPBuildASTParserAction; import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPBuildASTParserAction;
import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPSecondaryParserFactory; import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPSecondaryParserFactory;
public class CPPSizeofExpressionParser extends PrsStream implements RuleAction , IParserActionTokenProvider, IParser< IASTExpression > public class CPPSizeofExpressionParser extends PrsStream implements RuleAction, ITokenStream,
ITokenCollector, IParser< IASTExpression >
, ISecondaryParser< IASTExpression >
{ {
private static ParseTable prs = new CPPSizeofExpressionParserprs(); private static ParseTable prs = new CPPSizeofExpressionParserprs();
private FixedBacktrackingParser btParser; private FixedBacktrackingParser btParser;
@ -168,7 +177,11 @@ public class CPPSizeofExpressionParser extends PrsStream implements RuleAction ,
private CPPBuildASTParserAction action; private CPPBuildASTParserAction action;
private IASTCompletionNode compNode; private IASTCompletionNode compNode;
public CPPSizeofExpressionParser() { // constructor
public CPPSizeofExpressionParser(IScanner scanner, IDOMTokenMap tokenMap, IBuiltinBindingsProvider builtinBindingsProvider, IIndex index, Set<IParser.Options> options) {
initActions(options);
action.initializeTranslationUnit(scanner, builtinBindingsProvider, index);
CPreprocessorAdapter.runCPreprocessor(scanner, this, tokenMap);
} }
private void initActions(Set<IParser.Options> options) { private void initActions(Set<IParser.Options> options) {
@ -187,10 +200,9 @@ public void addToken(IToken token) {
} }
public IASTExpression parse(Set<IParser.Options> options) { public IASTExpression parse() {
// this has to be done, or... kaboom! // this has to be done, or... kaboom!
setStreamLength(getSize()); setStreamLength(getSize());
initActions(options);
final int errorRepairCount = -1; // -1 means full error handling final int errorRepairCount = -1; // -1 means full error handling
parser(null, errorRepairCount); // do the actual parse parser(null, errorRepairCount); // do the actual parse
@ -233,12 +245,12 @@ public void setTokens(List<IToken> tokens) {
addToken(new Token(null, 0, 0, CPPSizeofExpressionParsersym.TK_EOF_TOKEN)); addToken(new Token(null, 0, 0, CPPSizeofExpressionParsersym.TK_EOF_TOKEN));
} }
public CPPSizeofExpressionParser(IParserActionTokenProvider parser) { // constructor public CPPSizeofExpressionParser(ITokenStream parser, Set<IParser.Options> options) { // constructor for creating secondary parser
initActions(options);
tokenMap = new TokenMap(CPPSizeofExpressionParsersym.orderedTerminalSymbols, parser.getOrderedTerminalSymbols()); tokenMap = new TokenMap(CPPSizeofExpressionParsersym.orderedTerminalSymbols, parser.getOrderedTerminalSymbols());
} }
public void ruleAction(int ruleNumber) public void ruleAction(int ruleNumber)
{ {
switch (ruleNumber) switch (ruleNumber)
@ -1409,19 +1421,19 @@ public CPPSizeofExpressionParser(IParserActionTokenProvider parser) { // constr
} }
// //
// Rule 326: ptr_operator ::= pointer_hook * <openscope-ast> cv_qualifier_seq_opt // Rule 326: ptr_operator ::= pointer_hook * pointer_hook <openscope-ast> cv_qualifier_seq_opt
// //
case 326: { action. consumePointer(); break; case 326: { action. consumePointer(); break;
} }
// //
// Rule 327: ptr_operator ::= pointer_hook & // Rule 327: ptr_operator ::= pointer_hook & pointer_hook
// //
case 327: { action. consumeReferenceOperator(); break; case 327: { action. consumeReferenceOperator(); break;
} }
// //
// Rule 328: ptr_operator ::= dcolon_opt nested_name_specifier pointer_hook * <openscope-ast> cv_qualifier_seq_opt // Rule 328: ptr_operator ::= dcolon_opt nested_name_specifier pointer_hook * pointer_hook <openscope-ast> cv_qualifier_seq_opt
// //
case 328: { action. consumePointerToMember(); break; case 328: { action. consumePointerToMember(); break;
} }

View file

@ -17,13 +17,20 @@ import lpg.lpgjavaruntime.*;
import java.util.*; import java.util.*;
import org.eclipse.cdt.core.dom.ast.*; import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.CPreprocessorAdapter;
import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.ITokenCollector;
import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser; import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser;
import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack; import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack;
import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap; import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap; import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
import org.eclipse.cdt.core.dom.lrparser.ISecondaryParser;
import org.eclipse.cdt.core.dom.ast.cpp.*; import org.eclipse.cdt.core.dom.ast.cpp.*;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNodeFactory; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNodeFactory;
@ -32,7 +39,9 @@ import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPSecondaryParserFactory;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter;
public class CPPTemplateTypeParameterParser extends PrsStream implements RuleAction , IParserActionTokenProvider, IParser< ICPPASTTemplateParameter > public class CPPTemplateTypeParameterParser extends PrsStream implements RuleAction, ITokenStream,
ITokenCollector, IParser< ICPPASTTemplateParameter >
, ISecondaryParser< ICPPASTTemplateParameter >
{ {
private static ParseTable prs = new CPPTemplateTypeParameterParserprs(); private static ParseTable prs = new CPPTemplateTypeParameterParserprs();
private FixedBacktrackingParser btParser; private FixedBacktrackingParser btParser;
@ -170,7 +179,11 @@ public class CPPTemplateTypeParameterParser extends PrsStream implements RuleAct
private CPPBuildASTParserAction action; private CPPBuildASTParserAction action;
private IASTCompletionNode compNode; private IASTCompletionNode compNode;
public CPPTemplateTypeParameterParser() { // constructor
public CPPTemplateTypeParameterParser(IScanner scanner, IDOMTokenMap tokenMap, IBuiltinBindingsProvider builtinBindingsProvider, IIndex index, Set<IParser.Options> options) {
initActions(options);
action.initializeTranslationUnit(scanner, builtinBindingsProvider, index);
CPreprocessorAdapter.runCPreprocessor(scanner, this, tokenMap);
} }
private void initActions(Set<IParser.Options> options) { private void initActions(Set<IParser.Options> options) {
@ -189,10 +202,9 @@ public void addToken(IToken token) {
} }
public ICPPASTTemplateParameter parse(Set<IParser.Options> options) { public ICPPASTTemplateParameter parse() {
// this has to be done, or... kaboom! // this has to be done, or... kaboom!
setStreamLength(getSize()); setStreamLength(getSize());
initActions(options);
final int errorRepairCount = -1; // -1 means full error handling final int errorRepairCount = -1; // -1 means full error handling
parser(null, errorRepairCount); // do the actual parse parser(null, errorRepairCount); // do the actual parse
@ -235,12 +247,12 @@ public void setTokens(List<IToken> tokens) {
addToken(new Token(null, 0, 0, CPPTemplateTypeParameterParsersym.TK_EOF_TOKEN)); addToken(new Token(null, 0, 0, CPPTemplateTypeParameterParsersym.TK_EOF_TOKEN));
} }
public CPPTemplateTypeParameterParser(IParserActionTokenProvider parser) { // constructor public CPPTemplateTypeParameterParser(ITokenStream parser, Set<IParser.Options> options) { // constructor for creating secondary parser
initActions(options);
tokenMap = new TokenMap(CPPTemplateTypeParameterParsersym.orderedTerminalSymbols, parser.getOrderedTerminalSymbols()); tokenMap = new TokenMap(CPPTemplateTypeParameterParsersym.orderedTerminalSymbols, parser.getOrderedTerminalSymbols());
} }
public void ruleAction(int ruleNumber) public void ruleAction(int ruleNumber)
{ {
switch (ruleNumber) switch (ruleNumber)
@ -1423,19 +1435,19 @@ public CPPTemplateTypeParameterParser(IParserActionTokenProvider parser) { // c
} }
// //
// Rule 328: ptr_operator ::= pointer_hook * <openscope-ast> cv_qualifier_seq_opt // Rule 328: ptr_operator ::= pointer_hook * pointer_hook <openscope-ast> cv_qualifier_seq_opt
// //
case 328: { action. consumePointer(); break; case 328: { action. consumePointer(); break;
} }
// //
// Rule 329: ptr_operator ::= pointer_hook & // Rule 329: ptr_operator ::= pointer_hook & pointer_hook
// //
case 329: { action. consumeReferenceOperator(); break; case 329: { action. consumeReferenceOperator(); break;
} }
// //
// Rule 330: ptr_operator ::= dcolon_opt nested_name_specifier pointer_hook * <openscope-ast> cv_qualifier_seq_opt // Rule 330: ptr_operator ::= dcolon_opt nested_name_specifier pointer_hook * pointer_hook <openscope-ast> cv_qualifier_seq_opt
// //
case 330: { action. consumePointerToMember(); break; case 330: { action. consumePointerToMember(); break;
} }

View file

@ -17,13 +17,16 @@ import lpg.lpgjavaruntime.*;
import java.util.*; import java.util.*;
import org.eclipse.cdt.core.dom.ast.*; import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.CPreprocessorAdapter;
import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.ITokenCollector;
import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser; import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack; import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack;
import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap; import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap; import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.internal.core.dom.parser.c.CNodeFactory; import org.eclipse.cdt.internal.core.dom.parser.c.CNodeFactory;
import org.eclipse.cdt.core.dom.lrparser.action.c99.C99BuildASTParserAction; import org.eclipse.cdt.core.dom.lrparser.action.c99.C99BuildASTParserAction;
@ -32,7 +35,9 @@ import org.eclipse.cdt.core.dom.lrparser.action.c99.C99SecondaryParserFactory;
import org.eclipse.cdt.core.dom.lrparser.action.gnu.GCCBuildASTParserAction; import org.eclipse.cdt.core.dom.lrparser.action.gnu.GCCBuildASTParserAction;
import org.eclipse.cdt.core.dom.lrparser.action.gnu.GCCSecondaryParserFactory; import org.eclipse.cdt.core.dom.lrparser.action.gnu.GCCSecondaryParserFactory;
public class GCCParser extends PrsStream implements RuleAction , IParserActionTokenProvider, IParser< IASTTranslationUnit > public class GCCParser extends PrsStream implements RuleAction, ITokenStream,
ITokenCollector, IParser< IASTTranslationUnit >
{ {
private static ParseTable prs = new GCCParserprs(); private static ParseTable prs = new GCCParserprs();
private FixedBacktrackingParser btParser; private FixedBacktrackingParser btParser;
@ -170,7 +175,11 @@ public class GCCParser extends PrsStream implements RuleAction , IParserActionTo
private C99BuildASTParserAction action; private C99BuildASTParserAction action;
private IASTCompletionNode compNode; private IASTCompletionNode compNode;
public GCCParser() { // constructor
public GCCParser(IScanner scanner, IDOMTokenMap tokenMap, IBuiltinBindingsProvider builtinBindingsProvider, IIndex index, Set<IParser.Options> options) {
initActions(options);
action.initializeTranslationUnit(scanner, builtinBindingsProvider, index);
CPreprocessorAdapter.runCPreprocessor(scanner, this, tokenMap);
} }
private void initActions(Set<IParser.Options> options) { private void initActions(Set<IParser.Options> options) {
@ -194,17 +203,16 @@ public void addToken(IToken token) {
} }
public IASTTranslationUnit parse(Set<IParser.Options> options) { public IASTTranslationUnit parse() {
// this has to be done, or... kaboom! // this has to be done, or... kaboom!
setStreamLength(getSize()); setStreamLength(getSize());
initActions(options);
final int errorRepairCount = -1; // -1 means full error handling final int errorRepairCount = -1; // -1 means full error handling
parser(null, errorRepairCount); // do the actual parse parser(null, errorRepairCount); // do the actual parse
super.resetTokenStream(); // allow tokens to be garbage collected super.resetTokenStream(); // allow tokens to be garbage collected
compNode = action.getASTCompletionNode(); // the completion node may be null compNode = action.getASTCompletionNode(); // the completion node may be null
return ( IASTTranslationUnit ) action.getParseResult(); return ( IASTTranslationUnit ) action.getParseResult();
} }
@ -227,25 +235,6 @@ public String getName() {
} }
private ITokenMap tokenMap = null;
public void setTokens(List<IToken> tokens) {
resetTokenStream();
addToken(new Token(null, 0, 0, 0)); // dummy token
for(IToken token : tokens) {
token.setKind(tokenMap.mapKind(token.getKind()));
addToken(token);
}
addToken(new Token(null, 0, 0, GCCParsersym.TK_EOF_TOKEN));
}
public GCCParser(IParserActionTokenProvider parser) { // constructor
tokenMap = new TokenMap(GCCParsersym.orderedTerminalSymbols, parser.getOrderedTerminalSymbols());
}
private GCCBuildASTParserAction gnuAction; private GCCBuildASTParserAction gnuAction;
public void ruleAction(int ruleNumber) public void ruleAction(int ruleNumber)

View file

@ -17,13 +17,20 @@ import lpg.lpgjavaruntime.*;
import java.util.*; import java.util.*;
import org.eclipse.cdt.core.dom.ast.*; import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.CPreprocessorAdapter;
import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.ITokenCollector;
import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser; import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser;
import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack; import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack;
import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap; import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap; import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
import org.eclipse.cdt.core.dom.lrparser.ISecondaryParser;
import org.eclipse.cdt.internal.core.dom.parser.c.CNodeFactory; import org.eclipse.cdt.internal.core.dom.parser.c.CNodeFactory;
import org.eclipse.cdt.core.dom.lrparser.action.c99.C99BuildASTParserAction; import org.eclipse.cdt.core.dom.lrparser.action.c99.C99BuildASTParserAction;
@ -32,7 +39,9 @@ import org.eclipse.cdt.core.dom.lrparser.action.c99.C99SecondaryParserFactory;
import org.eclipse.cdt.core.dom.lrparser.action.gnu.GCCBuildASTParserAction; import org.eclipse.cdt.core.dom.lrparser.action.gnu.GCCBuildASTParserAction;
import org.eclipse.cdt.core.dom.lrparser.action.gnu.GCCSecondaryParserFactory; import org.eclipse.cdt.core.dom.lrparser.action.gnu.GCCSecondaryParserFactory;
public class GCCSizeofExpressionParser extends PrsStream implements RuleAction , IParserActionTokenProvider, IParser< IASTExpression > public class GCCSizeofExpressionParser extends PrsStream implements RuleAction, ITokenStream,
ITokenCollector, IParser< IASTExpression >
, ISecondaryParser< IASTExpression >
{ {
private static ParseTable prs = new GCCSizeofExpressionParserprs(); private static ParseTable prs = new GCCSizeofExpressionParserprs();
private FixedBacktrackingParser btParser; private FixedBacktrackingParser btParser;
@ -170,7 +179,11 @@ public class GCCSizeofExpressionParser extends PrsStream implements RuleAction ,
private C99BuildASTParserAction action; private C99BuildASTParserAction action;
private IASTCompletionNode compNode; private IASTCompletionNode compNode;
public GCCSizeofExpressionParser() { // constructor
public GCCSizeofExpressionParser(IScanner scanner, IDOMTokenMap tokenMap, IBuiltinBindingsProvider builtinBindingsProvider, IIndex index, Set<IParser.Options> options) {
initActions(options);
action.initializeTranslationUnit(scanner, builtinBindingsProvider, index);
CPreprocessorAdapter.runCPreprocessor(scanner, this, tokenMap);
} }
private void initActions(Set<IParser.Options> options) { private void initActions(Set<IParser.Options> options) {
@ -194,10 +207,9 @@ public void addToken(IToken token) {
} }
public IASTExpression parse(Set<IParser.Options> options) { public IASTExpression parse() {
// this has to be done, or... kaboom! // this has to be done, or... kaboom!
setStreamLength(getSize()); setStreamLength(getSize());
initActions(options);
final int errorRepairCount = -1; // -1 means full error handling final int errorRepairCount = -1; // -1 means full error handling
parser(null, errorRepairCount); // do the actual parse parser(null, errorRepairCount); // do the actual parse
@ -240,12 +252,12 @@ public void setTokens(List<IToken> tokens) {
addToken(new Token(null, 0, 0, GCCSizeofExpressionParsersym.TK_EOF_TOKEN)); addToken(new Token(null, 0, 0, GCCSizeofExpressionParsersym.TK_EOF_TOKEN));
} }
public GCCSizeofExpressionParser(IParserActionTokenProvider parser) { // constructor public GCCSizeofExpressionParser(ITokenStream parser, Set<IParser.Options> options) { // constructor for creating secondary parser
initActions(options);
tokenMap = new TokenMap(GCCSizeofExpressionParsersym.orderedTerminalSymbols, parser.getOrderedTerminalSymbols()); tokenMap = new TokenMap(GCCSizeofExpressionParsersym.orderedTerminalSymbols, parser.getOrderedTerminalSymbols());
} }
private GCCBuildASTParserAction gnuAction; private GCCBuildASTParserAction gnuAction;
public void ruleAction(int ruleNumber) public void ruleAction(int ruleNumber)

View file

@ -17,13 +17,16 @@ import lpg.lpgjavaruntime.*;
import java.util.*; import java.util.*;
import org.eclipse.cdt.core.dom.ast.*; import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.CPreprocessorAdapter;
import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.ITokenCollector;
import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser; import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack; import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack;
import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap; import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap; import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.dom.ast.cpp.*; import org.eclipse.cdt.core.dom.ast.cpp.*;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNodeFactory; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNodeFactory;
@ -33,7 +36,9 @@ import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPSecondaryParserFactory;
import org.eclipse.cdt.core.dom.lrparser.action.gnu.GPPBuildASTParserAction; import org.eclipse.cdt.core.dom.lrparser.action.gnu.GPPBuildASTParserAction;
import org.eclipse.cdt.core.dom.lrparser.action.gnu.GPPSecondaryParserFactory; import org.eclipse.cdt.core.dom.lrparser.action.gnu.GPPSecondaryParserFactory;
public class GPPParser extends PrsStream implements RuleAction , IParserActionTokenProvider, IParser< IASTTranslationUnit > public class GPPParser extends PrsStream implements RuleAction, ITokenStream,
ITokenCollector, IParser< IASTTranslationUnit >
{ {
private static ParseTable prs = new GPPParserprs(); private static ParseTable prs = new GPPParserprs();
private FixedBacktrackingParser btParser; private FixedBacktrackingParser btParser;
@ -171,7 +176,11 @@ public class GPPParser extends PrsStream implements RuleAction , IParserActionTo
private CPPBuildASTParserAction action; private CPPBuildASTParserAction action;
private IASTCompletionNode compNode; private IASTCompletionNode compNode;
public GPPParser() { // constructor
public GPPParser(IScanner scanner, IDOMTokenMap tokenMap, IBuiltinBindingsProvider builtinBindingsProvider, IIndex index, Set<IParser.Options> options) {
initActions(options);
action.initializeTranslationUnit(scanner, builtinBindingsProvider, index);
CPreprocessorAdapter.runCPreprocessor(scanner, this, tokenMap);
} }
private void initActions(Set<IParser.Options> options) { private void initActions(Set<IParser.Options> options) {
@ -195,17 +204,16 @@ public void addToken(IToken token) {
} }
public IASTTranslationUnit parse(Set<IParser.Options> options) { public IASTTranslationUnit parse() {
// this has to be done, or... kaboom! // this has to be done, or... kaboom!
setStreamLength(getSize()); setStreamLength(getSize());
initActions(options);
final int errorRepairCount = -1; // -1 means full error handling final int errorRepairCount = -1; // -1 means full error handling
parser(null, errorRepairCount); // do the actual parse parser(null, errorRepairCount); // do the actual parse
super.resetTokenStream(); // allow tokens to be garbage collected super.resetTokenStream(); // allow tokens to be garbage collected
compNode = action.getASTCompletionNode(); // the completion node may be null compNode = action.getASTCompletionNode(); // the completion node may be null
return ( IASTTranslationUnit ) action.getParseResult(); return ( IASTTranslationUnit ) action.getParseResult();
} }
@ -228,25 +236,6 @@ public String getName() {
} }
private ITokenMap tokenMap = null;
public void setTokens(List<IToken> tokens) {
resetTokenStream();
addToken(new Token(null, 0, 0, 0)); // dummy token
for(IToken token : tokens) {
token.setKind(tokenMap.mapKind(token.getKind()));
addToken(token);
}
addToken(new Token(null, 0, 0, GPPParsersym.TK_EOF_TOKEN));
}
public GPPParser(IParserActionTokenProvider parser) { // constructor
tokenMap = new TokenMap(GPPParsersym.orderedTerminalSymbols, parser.getOrderedTerminalSymbols());
}
private GPPBuildASTParserAction gnuAction; private GPPBuildASTParserAction gnuAction;
public void ruleAction(int ruleNumber) public void ruleAction(int ruleNumber)
@ -2035,35 +2024,47 @@ private GPPBuildASTParserAction gnuAction;
// //
case 579: { action. consumeExpressionBinaryOperator(IASTBinaryExpression.op_assign); break; case 579: { action. consumeExpressionBinaryOperator(IASTBinaryExpression.op_assign); break;
} }
//
// Rule 580: typeof_type_specifier ::= typeof unary_expression
//
case 580: { action. consumeExpressionUnaryOperator(IASTUnaryExpression.op_typeof); break;
}
//
// Rule 581: typeof_type_specifier ::= typeof ( type_id )
//
case 581: { action. consumeExpressionTypeId(IASTTypeIdExpression.op_typeof); break;
}
// //
// Rule 584: declaration_specifiers ::= <openscope-ast> typeof_declaration_specifiers // Rule 585: declaration_specifiers ::= <openscope-ast> typeof_declaration_specifiers
// //
case 584: { gnuAction.consumeDeclarationSpecifiersTypeof(); break; case 585: { gnuAction.consumeDeclarationSpecifiersTypeof(); break;
} }
// //
// Rule 597: declarator ::= <openscope-ast> ptr_operator_seq attribute_or_decl_specifier_seq direct_declarator // Rule 598: declarator ::= <openscope-ast> ptr_operator_seq attribute_or_decl_specifier_seq direct_declarator
// //
case 597: { action. consumeDeclaratorWithPointer(true); break; case 598: { action. consumeDeclaratorWithPointer(true); break;
} }
// //
// Rule 599: simple_type_specifier ::= _Complex // Rule 600: simple_type_specifier ::= _Complex
//
case 599: { action. consumeToken(); break;
}
//
// Rule 600: simple_type_specifier ::= _Imaginary
// //
case 600: { action. consumeToken(); break; case 600: { action. consumeToken(); break;
} }
//
// Rule 601: simple_type_specifier ::= _Imaginary
//
case 601: { action. consumeToken(); break;
}
// //
// Rule 601: declaration_specifiers ::= <openscope-ast> simple_declaration_specifiers // Rule 602: declaration_specifiers ::= <openscope-ast> simple_declaration_specifiers
// //
case 601: { gnuAction.consumeDeclarationSpecifiersSimple(); break; case 602: { gnuAction.consumeDeclarationSpecifiersSimple(); break;
} }

View file

@ -83,12 +83,12 @@ public interface GPPParsersym {
TK_integer = 56, TK_integer = 56,
TK_floating = 57, TK_floating = 57,
TK_charconst = 58, TK_charconst = 58,
TK_stringlit = 42, TK_stringlit = 43,
TK_identifier = 1, TK_identifier = 1,
TK_Completion = 2, TK_Completion = 2,
TK_EndOfCompletion = 11, TK_EndOfCompletion = 11,
TK_Invalid = 130, TK_Invalid = 130,
TK_LeftBracket = 70, TK_LeftBracket = 69,
TK_LeftParen = 3, TK_LeftParen = 3,
TK_Dot = 127, TK_Dot = 127,
TK_DotStar = 97, TK_DotStar = 97,
@ -135,7 +135,7 @@ public interface GPPParsersym {
TK_RightBracket = 125, TK_RightBracket = 125,
TK_RightParen = 71, TK_RightParen = 71,
TK_RightBrace = 80, TK_RightBrace = 80,
TK_SemiColon = 43, TK_SemiColon = 42,
TK_LeftBrace = 72, TK_LeftBrace = 72,
TK_typeof = 27, TK_typeof = 27,
TK___alignof__ = 59, TK___alignof__ = 59,
@ -143,7 +143,7 @@ public interface GPPParsersym {
TK___declspec = 7, TK___declspec = 7,
TK_MAX = 108, TK_MAX = 108,
TK_MIN = 109, TK_MIN = 109,
TK_ERROR_TOKEN = 69, TK_ERROR_TOKEN = 70,
TK_EOF_TOKEN = 128; TK_EOF_TOKEN = 128;
public final static String orderedTerminalSymbols[] = { public final static String orderedTerminalSymbols[] = {
@ -189,8 +189,8 @@ public interface GPPParsersym {
"typedef", "typedef",
"Plus", "Plus",
"Minus", "Minus",
"stringlit",
"SemiColon", "SemiColon",
"stringlit",
"PlusPlus", "PlusPlus",
"MinusMinus", "MinusMinus",
"Bang", "Bang",
@ -216,8 +216,8 @@ public interface GPPParsersym {
"namespace", "namespace",
"throw", "throw",
"using", "using",
"ERROR_TOKEN",
"LeftBracket", "LeftBracket",
"ERROR_TOKEN",
"RightParen", "RightParen",
"LeftBrace", "LeftBrace",
"Colon", "Colon",

View file

@ -17,13 +17,20 @@ import lpg.lpgjavaruntime.*;
import java.util.*; import java.util.*;
import org.eclipse.cdt.core.dom.ast.*; import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.CPreprocessorAdapter;
import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.ITokenCollector;
import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser; import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser;
import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack; import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack;
import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap; import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap; import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
import org.eclipse.cdt.core.dom.lrparser.ISecondaryParser;
import org.eclipse.cdt.core.dom.ast.cpp.*; import org.eclipse.cdt.core.dom.ast.cpp.*;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNodeFactory; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNodeFactory;
@ -33,7 +40,9 @@ import org.eclipse.cdt.core.dom.lrparser.action.cpp.CPPSecondaryParserFactory;
import org.eclipse.cdt.core.dom.lrparser.action.gnu.GPPBuildASTParserAction; import org.eclipse.cdt.core.dom.lrparser.action.gnu.GPPBuildASTParserAction;
import org.eclipse.cdt.core.dom.lrparser.action.gnu.GPPSecondaryParserFactory; import org.eclipse.cdt.core.dom.lrparser.action.gnu.GPPSecondaryParserFactory;
public class GPPSizeofExpressionParser extends PrsStream implements RuleAction , IParserActionTokenProvider, IParser< IASTExpression > public class GPPSizeofExpressionParser extends PrsStream implements RuleAction, ITokenStream,
ITokenCollector, IParser< IASTExpression >
, ISecondaryParser< IASTExpression >
{ {
private static ParseTable prs = new GPPSizeofExpressionParserprs(); private static ParseTable prs = new GPPSizeofExpressionParserprs();
private FixedBacktrackingParser btParser; private FixedBacktrackingParser btParser;
@ -171,7 +180,11 @@ public class GPPSizeofExpressionParser extends PrsStream implements RuleAction ,
private CPPBuildASTParserAction action; private CPPBuildASTParserAction action;
private IASTCompletionNode compNode; private IASTCompletionNode compNode;
public GPPSizeofExpressionParser() { // constructor
public GPPSizeofExpressionParser(IScanner scanner, IDOMTokenMap tokenMap, IBuiltinBindingsProvider builtinBindingsProvider, IIndex index, Set<IParser.Options> options) {
initActions(options);
action.initializeTranslationUnit(scanner, builtinBindingsProvider, index);
CPreprocessorAdapter.runCPreprocessor(scanner, this, tokenMap);
} }
private void initActions(Set<IParser.Options> options) { private void initActions(Set<IParser.Options> options) {
@ -195,10 +208,9 @@ public void addToken(IToken token) {
} }
public IASTExpression parse(Set<IParser.Options> options) { public IASTExpression parse() {
// this has to be done, or... kaboom! // this has to be done, or... kaboom!
setStreamLength(getSize()); setStreamLength(getSize());
initActions(options);
final int errorRepairCount = -1; // -1 means full error handling final int errorRepairCount = -1; // -1 means full error handling
parser(null, errorRepairCount); // do the actual parse parser(null, errorRepairCount); // do the actual parse
@ -241,12 +253,12 @@ public void setTokens(List<IToken> tokens) {
addToken(new Token(null, 0, 0, GPPSizeofExpressionParsersym.TK_EOF_TOKEN)); addToken(new Token(null, 0, 0, GPPSizeofExpressionParsersym.TK_EOF_TOKEN));
} }
public GPPSizeofExpressionParser(IParserActionTokenProvider parser) { // constructor public GPPSizeofExpressionParser(ITokenStream parser, Set<IParser.Options> options) { // constructor for creating secondary parser
initActions(options);
tokenMap = new TokenMap(GPPSizeofExpressionParsersym.orderedTerminalSymbols, parser.getOrderedTerminalSymbols()); tokenMap = new TokenMap(GPPSizeofExpressionParsersym.orderedTerminalSymbols, parser.getOrderedTerminalSymbols());
} }
private GPPBuildASTParserAction gnuAction; private GPPBuildASTParserAction gnuAction;
public void ruleAction(int ruleNumber) public void ruleAction(int ruleNumber)
@ -2011,41 +2023,53 @@ private GPPBuildASTParserAction gnuAction;
// //
case 575: { action. consumeExpressionBinaryOperator(IASTBinaryExpression.op_assign); break; case 575: { action. consumeExpressionBinaryOperator(IASTBinaryExpression.op_assign); break;
} }
//
// Rule 576: typeof_type_specifier ::= typeof unary_expression
//
case 576: { action. consumeExpressionUnaryOperator(IASTUnaryExpression.op_typeof); break;
}
//
// Rule 577: typeof_type_specifier ::= typeof ( type_id )
//
case 577: { action. consumeExpressionTypeId(IASTTypeIdExpression.op_typeof); break;
}
// //
// Rule 580: declaration_specifiers ::= <openscope-ast> typeof_declaration_specifiers // Rule 581: declaration_specifiers ::= <openscope-ast> typeof_declaration_specifiers
// //
case 580: { gnuAction.consumeDeclarationSpecifiersTypeof(); break; case 581: { gnuAction.consumeDeclarationSpecifiersTypeof(); break;
} }
// //
// Rule 593: declarator ::= <openscope-ast> ptr_operator_seq attribute_or_decl_specifier_seq direct_declarator // Rule 594: declarator ::= <openscope-ast> ptr_operator_seq attribute_or_decl_specifier_seq direct_declarator
// //
case 593: { action. consumeDeclaratorWithPointer(true); break; case 594: { action. consumeDeclaratorWithPointer(true); break;
} }
// //
// Rule 595: simple_type_specifier ::= _Complex // Rule 596: simple_type_specifier ::= _Complex
//
case 595: { action. consumeToken(); break;
}
//
// Rule 596: simple_type_specifier ::= _Imaginary
// //
case 596: { action. consumeToken(); break; case 596: { action. consumeToken(); break;
} }
//
// Rule 597: simple_type_specifier ::= _Imaginary
//
case 597: { action. consumeToken(); break;
}
// //
// Rule 597: declaration_specifiers ::= <openscope-ast> simple_declaration_specifiers // Rule 598: declaration_specifiers ::= <openscope-ast> simple_declaration_specifiers
// //
case 597: { gnuAction.consumeDeclarationSpecifiersSimple(); break; case 598: { gnuAction.consumeDeclarationSpecifiersSimple(); break;
} }
// //
// Rule 599: no_sizeof_type_id_start ::= ERROR_TOKEN // Rule 600: no_sizeof_type_id_start ::= ERROR_TOKEN
// //
case 599: { action. consumeEmpty(); break; case 600: { action. consumeEmpty(); break;
} }

View file

@ -18,7 +18,7 @@ public interface GPPSizeofExpressionParsersym {
TK__Complex = 14, TK__Complex = 14,
TK__Imaginary = 15, TK__Imaginary = 15,
TK_asm = 5, TK_asm = 5,
TK_auto = 31, TK_auto = 33,
TK_bool = 16, TK_bool = 16,
TK_break = 82, TK_break = 82,
TK_case = 83, TK_case = 83,
@ -35,32 +35,32 @@ public interface GPPSizeofExpressionParsersym {
TK_dynamic_cast = 48, TK_dynamic_cast = 48,
TK_else = 129, TK_else = 129,
TK_enum = 62, TK_enum = 62,
TK_explicit = 32, TK_explicit = 34,
TK_export = 92, TK_export = 92,
TK_extern = 33, TK_extern = 35,
TK_false = 49, TK_false = 49,
TK_float = 19, TK_float = 19,
TK_for = 87, TK_for = 87,
TK_friend = 34, TK_friend = 36,
TK_goto = 88, TK_goto = 88,
TK_if = 89, TK_if = 89,
TK_inline = 35, TK_inline = 37,
TK_int = 20, TK_int = 20,
TK_long = 21, TK_long = 21,
TK_mutable = 36, TK_mutable = 38,
TK_namespace = 67, TK_namespace = 67,
TK_new = 72, TK_new = 72,
TK_operator = 9, TK_operator = 9,
TK_private = 110, TK_private = 110,
TK_protected = 111, TK_protected = 111,
TK_public = 112, TK_public = 112,
TK_register = 37, TK_register = 39,
TK_reinterpret_cast = 50, TK_reinterpret_cast = 50,
TK_return = 90, TK_return = 90,
TK_short = 22, TK_short = 22,
TK_signed = 23, TK_signed = 23,
TK_sizeof = 51, TK_sizeof = 51,
TK_static = 38, TK_static = 40,
TK_static_cast = 52, TK_static_cast = 52,
TK_struct = 63, TK_struct = 63,
TK_switch = 91, TK_switch = 91,
@ -69,7 +69,7 @@ public interface GPPSizeofExpressionParsersym {
TK_throw = 66, TK_throw = 66,
TK_try = 78, TK_try = 78,
TK_true = 54, TK_true = 54,
TK_typedef = 39, TK_typedef = 41,
TK_typeid = 55, TK_typeid = 55,
TK_typename = 13, TK_typename = 13,
TK_union = 64, TK_union = 64,
@ -83,10 +83,10 @@ public interface GPPSizeofExpressionParsersym {
TK_integer = 56, TK_integer = 56,
TK_floating = 57, TK_floating = 57,
TK_charconst = 58, TK_charconst = 58,
TK_stringlit = 43, TK_stringlit = 42,
TK_identifier = 1, TK_identifier = 1,
TK_Completion = 2, TK_Completion = 2,
TK_EndOfCompletion = 10, TK_EndOfCompletion = 11,
TK_Invalid = 130, TK_Invalid = 130,
TK_LeftBracket = 70, TK_LeftBracket = 70,
TK_LeftParen = 3, TK_LeftParen = 3,
@ -94,12 +94,12 @@ public interface GPPSizeofExpressionParsersym {
TK_DotStar = 97, TK_DotStar = 97,
TK_Arrow = 113, TK_Arrow = 113,
TK_ArrowStar = 96, TK_ArrowStar = 96,
TK_PlusPlus = 44, TK_PlusPlus = 43,
TK_MinusMinus = 45, TK_MinusMinus = 44,
TK_And = 12, TK_And = 12,
TK_Star = 11, TK_Star = 10,
TK_Plus = 40, TK_Plus = 31,
TK_Minus = 41, TK_Minus = 32,
TK_Tilde = 8, TK_Tilde = 8,
TK_Bang = 46, TK_Bang = 46,
TK_Slash = 98, TK_Slash = 98,
@ -135,7 +135,7 @@ public interface GPPSizeofExpressionParsersym {
TK_RightBracket = 125, TK_RightBracket = 125,
TK_RightParen = 73, TK_RightParen = 73,
TK_RightBrace = 80, TK_RightBrace = 80,
TK_SemiColon = 42, TK_SemiColon = 45,
TK_LeftBrace = 74, TK_LeftBrace = 74,
TK_typeof = 27, TK_typeof = 27,
TK___alignof__ = 59, TK___alignof__ = 59,
@ -157,8 +157,8 @@ public interface GPPSizeofExpressionParsersym {
"__declspec", "__declspec",
"Tilde", "Tilde",
"operator", "operator",
"EndOfCompletion",
"Star", "Star",
"EndOfCompletion",
"And", "And",
"typename", "typename",
"_Complex", "_Complex",
@ -178,6 +178,8 @@ public interface GPPSizeofExpressionParsersym {
"const", "const",
"volatile", "volatile",
"virtual", "virtual",
"Plus",
"Minus",
"auto", "auto",
"explicit", "explicit",
"extern", "extern",
@ -187,12 +189,10 @@ public interface GPPSizeofExpressionParsersym {
"register", "register",
"static", "static",
"typedef", "typedef",
"Plus",
"Minus",
"SemiColon",
"stringlit", "stringlit",
"PlusPlus", "PlusPlus",
"MinusMinus", "MinusMinus",
"SemiColon",
"Bang", "Bang",
"const_cast", "const_cast",
"dynamic_cast", "dynamic_cast",

View file

@ -11,7 +11,7 @@
%options la=2 %options la=2
%options package=org.eclipse.cdt.internal.core.dom.parser.upc %options package=org.eclipse.cdt.internal.core.dom.parser.upc
%options template=FixedBtParserTemplateD.g %options template=LRSecondaryParserTemplate.g
$Import $Import

View file

@ -11,7 +11,7 @@
%options la=2 %options la=2
%options package=org.eclipse.cdt.internal.core.dom.parser.upc %options package=org.eclipse.cdt.internal.core.dom.parser.upc
%options template=FixedBtParserTemplateD.g %options template=LRSecondaryParserTemplate.g
$Import $Import

View file

@ -11,7 +11,7 @@
%options la=2 %options la=2
%options package=org.eclipse.cdt.internal.core.dom.parser.upc %options package=org.eclipse.cdt.internal.core.dom.parser.upc
%options template=FixedBtParserTemplateD.g %options template=LRParserTemplate.g
$Import $Import

View file

@ -11,7 +11,7 @@
%options la=2 %options la=2
%options package=org.eclipse.cdt.internal.core.dom.parser.upc %options package=org.eclipse.cdt.internal.core.dom.parser.upc
%options template=FixedBtParserTemplateD.g %options template=LRSecondaryParserTemplate.g
$Import $Import

View file

@ -23,7 +23,7 @@ import org.eclipse.cdt.core.dom.ast.IASTStatement;
import org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression; import org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression;
import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression; import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
import org.eclipse.cdt.core.dom.ast.c.ICASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.c.ICASTDeclSpecifier;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.core.dom.lrparser.action.ISecondaryParserFactory; import org.eclipse.cdt.core.dom.lrparser.action.ISecondaryParserFactory;
import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack; import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack;
import org.eclipse.cdt.core.dom.lrparser.action.c99.C99BuildASTParserAction; import org.eclipse.cdt.core.dom.lrparser.action.c99.C99BuildASTParserAction;
@ -48,7 +48,7 @@ public class UPCParserAction extends C99BuildASTParserAction {
* @param parser * @param parser
* @param tu * @param tu
*/ */
public UPCParserAction(IParserActionTokenProvider parser, ScopedStack<Object> astStack, IUPCNodeFactory nodeFactory, ISecondaryParserFactory parserFactory) { public UPCParserAction(ITokenStream parser, ScopedStack<Object> astStack, IUPCNodeFactory nodeFactory, ISecondaryParserFactory parserFactory) {
super(parser, astStack, nodeFactory, parserFactory); super(parser, astStack, nodeFactory, parserFactory);
this.nodeFactory = nodeFactory; this.nodeFactory = nodeFactory;
nodeFactory.setUseC99SizeofExpressions(); nodeFactory.setUseC99SizeofExpressions();

View file

@ -11,10 +11,13 @@
package org.eclipse.cdt.core.dom.parser.upc; package org.eclipse.cdt.core.dom.parser.upc;
import java.util.Set;
import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider; import org.eclipse.cdt.core.dom.lrparser.ISecondaryParser;
import org.eclipse.cdt.core.dom.lrparser.action.ISecondaryParserFactory; import org.eclipse.cdt.core.dom.lrparser.action.ISecondaryParserFactory;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenStream;
import org.eclipse.cdt.internal.core.dom.parser.upc.UPCExpressionParser; import org.eclipse.cdt.internal.core.dom.parser.upc.UPCExpressionParser;
import org.eclipse.cdt.internal.core.dom.parser.upc.UPCNoCastExpressionParser; import org.eclipse.cdt.internal.core.dom.parser.upc.UPCNoCastExpressionParser;
import org.eclipse.cdt.internal.core.dom.parser.upc.UPCSizeofExpressionParser; import org.eclipse.cdt.internal.core.dom.parser.upc.UPCSizeofExpressionParser;
@ -27,16 +30,16 @@ public class UPCSecondaryParserFactory implements ISecondaryParserFactory{
return DEFAULT_INSTANCE; return DEFAULT_INSTANCE;
} }
public IParser<IASTExpression> getExpressionParser(IParserActionTokenProvider parser) { public ISecondaryParser<IASTExpression> getExpressionParser(ITokenStream stream, Set<IParser.Options> options) {
return new UPCExpressionParser(parser); return new UPCExpressionParser(stream, options);
} }
public IParser<IASTExpression> getNoCastExpressionParser(IParserActionTokenProvider parser) { public ISecondaryParser<IASTExpression> getNoCastExpressionParser(ITokenStream stream, Set<IParser.Options> options) {
return new UPCNoCastExpressionParser(parser); return new UPCNoCastExpressionParser(stream, options);
} }
public IParser<IASTExpression> getSizeofExpressionParser(IParserActionTokenProvider parser) { public ISecondaryParser<IASTExpression> getSizeofExpressionParser(ITokenStream stream, Set<IParser.Options> options) {
return new UPCSizeofExpressionParser(parser); return new UPCSizeofExpressionParser(stream, options);
} }
} }

View file

@ -10,20 +10,24 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.dom.upc; package org.eclipse.cdt.core.dom.upc;
import java.util.Set;
import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.ILinkage;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.lrparser.BaseExtensibleLanguage; import org.eclipse.cdt.core.dom.lrparser.BaseExtensibleLanguage;
import org.eclipse.cdt.core.dom.lrparser.IDOMTokenMap;
import org.eclipse.cdt.core.dom.lrparser.IParser; import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.ScannerExtensionConfiguration; import org.eclipse.cdt.core.dom.lrparser.ScannerExtensionConfiguration;
import org.eclipse.cdt.core.dom.lrparser.IParser.Options;
import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider; import org.eclipse.cdt.core.dom.parser.IBuiltinBindingsProvider;
import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration; import org.eclipse.cdt.core.dom.parser.IScannerExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.c.ANSICParserExtensionConfiguration; import org.eclipse.cdt.core.dom.parser.c.ANSICParserExtensionConfiguration;
import org.eclipse.cdt.core.dom.parser.upc.DOMToUPCTokenMap; import org.eclipse.cdt.core.dom.parser.upc.DOMToUPCTokenMap;
import org.eclipse.cdt.core.dom.parser.upc.UPCLanguageKeywords; import org.eclipse.cdt.core.dom.parser.upc.UPCLanguageKeywords;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.model.ICLanguageKeywords; import org.eclipse.cdt.core.model.ICLanguageKeywords;
import org.eclipse.cdt.core.model.IContributedModelBuilder; import org.eclipse.cdt.core.model.IContributedModelBuilder;
import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.internal.core.dom.parser.upc.UPCParser; import org.eclipse.cdt.internal.core.dom.parser.upc.UPCParser;
@ -44,13 +48,8 @@ public class UPCLanguage extends BaseExtensibleLanguage {
} }
@Override @Override
protected IDOMTokenMap getTokenMap() { protected IParser<IASTTranslationUnit> getParser(IScanner scanner, IIndex index, Set<Options> options) {
return new DOMToUPCTokenMap(); return new UPCParser(scanner, new DOMToUPCTokenMap(), getBuiltinBindingsProvider(), index, options);
}
@Override
public IParser<IASTTranslationUnit> getParser() {
return new UPCParser();
} }
/** /**
@ -90,7 +89,6 @@ public class UPCLanguage extends BaseExtensibleLanguage {
return ScannerExtensionConfiguration.createC(); return ScannerExtensionConfiguration.createC();
} }
@Override
protected IBuiltinBindingsProvider getBuiltinBindingsProvider() { protected IBuiltinBindingsProvider getBuiltinBindingsProvider() {
return new ANSICParserExtensionConfiguration().getBuiltinBindingsProvider(); return new ANSICParserExtensionConfiguration().getBuiltinBindingsProvider();
} }