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

added ability to "mix-in" grammar extensions and actions, support for extended gnu asm syntax

This commit is contained in:
Mike Kucera 2009-01-15 16:47:58 +00:00
parent d52e5c0f1c
commit 7f0debb02e
36 changed files with 4701 additions and 4391 deletions

View file

@ -17,8 +17,8 @@ import org.eclipse.cdt.internal.core.dom.parser.ASTAmbiguousNode;
* Visitor to resolve ast ambiguities in the right order, which is simply a depth
* first traversal.
*/
final class CASTAmbiguityResolver extends ASTVisitor {
CASTAmbiguityResolver() {
public final class CASTAmbiguityResolver extends ASTVisitor {
public CASTAmbiguityResolver() {
super(false);
shouldVisitAmbiguousNodes= true;
}

View file

@ -27,7 +27,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
/**
* Visitor to resolve ast ambiguities in the right order
*/
final class CPPASTAmbiguityResolver extends ASTVisitor {
public final class CPPASTAmbiguityResolver extends ASTVisitor {
private static class ClassContext {
ArrayList<IASTNode> fDeferredNodes;
final IASTNode fNode;
@ -44,7 +44,7 @@ final class CPPASTAmbiguityResolver extends ASTVisitor {
private ClassContext fCurrentContext;
private boolean fSkipInitializers;
CPPASTAmbiguityResolver() {
public CPPASTAmbiguityResolver() {
super(false);
shouldVisitAmbiguousNodes= true;
shouldVisitDeclarations= true;

View file

@ -9,12 +9,6 @@
-- IBM Corporation - initial API and implementation
-----------------------------------------------------------------------------------
$Include
../common.g
$End
$Terminals
-- Keywords
@ -549,7 +543,7 @@ complete_declarator
storage_class_specifier
::= storage_class_specifier_token
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
storage_class_specifier_token
@ -562,7 +556,7 @@ storage_class_specifier_token
simple_type_specifier
::= simple_type_specifier_token
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
simple_type_specifier_token
::= 'void'
@ -581,9 +575,9 @@ simple_type_specifier_token
typedef_name_in_declspec
::= 'Completion'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
| 'identifier'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
-- | 'TypedefName' -- remove identifier if this is uncommented
@ -691,7 +685,7 @@ enumerator
type_qualifier
::= type_qualifier_token
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
type_qualifier_token
@ -702,7 +696,7 @@ type_qualifier_token
function_specifier
::= 'inline'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
declarator

View file

@ -1,144 +0,0 @@
-----------------------------------------------------------------------------------
-- Copyright (c) 2006, 2008 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
-----------------------------------------------------------------------------------
$Notice
-- Copied into all files generated by LPG
/./*******************************************************************************
* Copyright (c) 2006, 2008 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
*********************************************************************************/
// This file was generated by LPG
./
$End
$Define
-- These macros allow the template and header code to be customized by an extending parser.
$ast_class /.Object./
$extra_interfaces /. ./ -- can override this macro to provide additional interfaces
$additional_interfaces /. , IParserActionTokenProvider, IParser $extra_interfaces ./
$build_action_class /. ./ -- name of the class that has the AST building callbacks
$node_factory_create_expression /. ./ -- expression that will create the node factory
$Build /. $BeginAction action. ./ -- special action just for calling methods on the builder
$EndBuild /. $EndAction ./
$End
$Globals
/.
import java.util.*;
import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser;
./
$End
$Headers
/.
private $build_action_class action;
public $action_type() { // constructor
}
private void initActions(IASTTranslationUnit tu, Set<IParser.Options> options) {
action = new $build_action_class($node_factory_create_expression, this, tu);
action.setParserOptions(options);
}
public void addToken(IToken token) {
token.setKind(mapKind(token.getKind())); // TODO does mapKind need to be called?
super.addToken(token);
}
public IASTCompletionNode parse(IASTTranslationUnit tu, Set<IParser.Options> options) {
// this has to be done, or... kaboom!
setStreamLength(getSize());
initActions(tu, options);
final int errorRepairCount = -1; // -1 means full error handling
parser(null, errorRepairCount); // do the actual parse
super.resetTokenStream(); // allow tokens to be garbage collected
// the completion node may be null
IASTCompletionNode compNode = action.getASTCompletionNode();
//action = null;
//parserAction = null;
return compNode;
}
// uncomment this method to use with backtracking parser
public List getRuleTokens() {
return Collections.unmodifiableList(getTokens().subList(getLeftSpan(), getRightSpan() + 1));
}
public IASTNode getSecondaryParseResult() {
return action.getSecondaryParseResult();
}
public String[] getOrderedTerminalSymbols() {
return $sym_type.orderedTerminalSymbols;
}
@SuppressWarnings("nls")
public String getName() {
return "$action_type";
}
./
$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(String[] mapFrom) { // constructor
tokenMap = new TokenMap($sym_type.orderedTerminalSymbols, mapFrom);
}
./
$End

View file

@ -10,11 +10,6 @@
----------------------------------------------------------------------------------
$Include
../common.g
$End
$Terminals
-- Keywords
@ -810,9 +805,9 @@ no_type_declaration_specifier
| function_specifier
| cv_qualifier
| 'friend'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
| 'typedef'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
no_type_declaration_specifiers
@ -869,24 +864,24 @@ type_name_declaration_specifiers
storage_class_specifier
::= 'auto'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
| 'register'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
| 'static'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
| 'extern'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
| 'mutable'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
function_specifier
::= 'inline'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
| 'virtual'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
| 'explicit'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
-- We have no way to disambiguate token types
@ -913,27 +908,27 @@ function_specifier
simple_type_specifier
::= 'char'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
| 'wchar_t'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
| 'bool'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
| 'short'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
| 'int'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
| 'long'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
| 'signed'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
| 'unsigned'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
| 'float'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
| 'double'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
| 'void'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
-- last two rules moved here from simple_type_specifier
@ -1162,9 +1157,9 @@ cv_qualifier_seq_opt
cv_qualifier
::= 'const'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
| 'volatile'
/. $Build consumeDeclSpecToken(); $EndBuild ./
/. $Build consumeToken(); $EndBuild ./
declarator_id_name

View file

@ -33,10 +33,17 @@ $Terminals
$End
-- Hook the extensions into the main grammar.
$Rules
declaration
::= extended_asm_declaration
no_type_declaration_specifier
::= attribute_or_decl_specifier

View file

@ -26,6 +26,28 @@ $Terminals
$End
$Globals
/.
import org.eclipse.cdt.core.dom.lrparser.action.gcc.GCCBuildASTParserAction;
./
$End
$Headers
/.
private GCCBuildASTParserAction gccAction;
./
$End
$Define
$action_initializations /.
gccAction = new GCCBuildASTParserAction($node_factory_create_expression, this, tu, astStack);
gccAction.setParserOptions(options);
./
$End
$Rules
@ -73,11 +95,8 @@ attribute_parameter
decl_specifier
::= '__declspec' '(' extended_decl_modifier_seq_opt ')'
extended_decl_modifier_seq_opt
::= extended_decl_modifier_seq
| $empty
::= '__declspec' '(' extended_decl_modifier_seq ')'
| '__declspec' '(' ')'
extended_decl_modifier_seq
::= extended_decl_modifier
@ -96,9 +115,27 @@ extended_decl_modifier
asm_label
::= 'asm' '(' 'stringlit' ')'
asm_label_opt
::= asm_label
extended_asm_declaration
::= 'asm' volatile_opt '(' extended_asm_param_seq ')' ';'
/. $BeginAction gccAction.consumeDeclarationASM(); $EndAction ./
volatile_opt ::= 'volatile' | $empty
extended_asm_param_seq
::= extended_asm_param_with_operand
| extended_asm_param_seq ':' extended_asm_param_with_operand
extended_asm_param_with_operand
::= extended_asm_param
| extended_asm_param ',' extended_asm_param
| $empty
extended_asm_param
::= 'stringlit'
| 'stringlit' '(' 'identifier' ')'
| 'stringlit' '(' '*' 'identifier' ')'
$End

View file

@ -18,8 +18,17 @@
-- to point at the directory where the CPPParser.g file is located.
$Import
../cpp/CPPParser.g
$DropRules
-- will be replaced by extended asm syntax
asm_definition
::= 'asm' '(' 'stringlit' ')' ';'
$End
$Import
../gnu/GNUExtensions.g
$End
@ -28,6 +37,10 @@ $End
$Rules
asm_definition
::= extended_asm_declaration
no_type_declaration_specifier
::= attribute_or_decl_specifier

View file

@ -9,6 +9,13 @@
-- IBM Corporation - initial API and implementation
----------------------------------------------------------------------------------
-- This template is a modified version of BtParserTemplateD.g.
-- This template contains a fix for an LPG bug:
-- http://sourceforge.net/tracker/index.php?func=detail&aid=1732851&group_id=155963&atid=797879
--
-- In a parser using this template, the following macro may be redefined:
--
@ -285,6 +292,145 @@ $Trailers
./
$End
$Notice
-- Copied into all files generated by LPG
/./*******************************************************************************
* Copyright (c) 2006, 2008 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
*********************************************************************************/
// This file was generated by LPG
./
$End
$Define
-- These macros allow the template and header code to be customized by an extending parser.
$ast_class /.Object./
$extra_interfaces /. ./ -- can override this macro to provide additional interfaces
$additional_interfaces /. , IParserActionTokenProvider, IParser $extra_interfaces ./
$build_action_class /. ./ -- name of the class that has the AST building callbacks
$node_factory_create_expression /. ./ -- expression that will create the node factory
$action_initializations /. ./
$Build /. $BeginAction action. ./ -- special action just for calling methods on the builder
$EndBuild /. $EndAction ./
$End
$Globals
/.
import java.util.*;
import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
import org.eclipse.cdt.core.dom.lrparser.lpgextensions.FixedBacktrackingParser;
import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack;
./
$End
$Headers
/.
private $build_action_class action;
private ScopedStack<Object> astStack = new ScopedStack<Object>();
public $action_type() { // constructor
}
private void initActions(IASTTranslationUnit tu, Set<IParser.Options> options) {
action = new $build_action_class($node_factory_create_expression, this, tu, astStack);
action.setParserOptions(options);
$action_initializations
}
public void addToken(IToken token) {
token.setKind(mapKind(token.getKind())); // TODO does mapKind need to be called?
super.addToken(token);
}
public IASTCompletionNode parse(IASTTranslationUnit tu, Set<IParser.Options> options) {
// this has to be done, or... kaboom!
setStreamLength(getSize());
initActions(tu, options);
final int errorRepairCount = -1; // -1 means full error handling
parser(null, errorRepairCount); // do the actual parse
super.resetTokenStream(); // allow tokens to be garbage collected
// the completion node may be null
IASTCompletionNode compNode = action.getASTCompletionNode();
//action = null;
//parserAction = null;
return compNode;
}
// uncomment this method to use with backtracking parser
public List<IToken> getRuleTokens() {
return getTokens().subList(getLeftSpan(), getRightSpan() + 1);
}
public IASTNode getSecondaryParseResult() {
return (IASTNode) astStack.pop();
}
public String[] getOrderedTerminalSymbols() {
return $sym_type.orderedTerminalSymbols;
}
@SuppressWarnings("nls")
public String getName() {
return "$action_type";
}
./
$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(String[] mapFrom) { // constructor
tokenMap = new TokenMap($sym_type.orderedTerminalSymbols, mapFrom);
}
./
$End
--
-- E N D O F T E M P L A T E
--

View file

@ -0,0 +1,232 @@
package org.eclipse.cdt.core.dom.lrparser.action;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
import lpg.lpgjavaruntime.IToken;
import org.eclipse.cdt.core.dom.ast.IASTCompletionNode;
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.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
@SuppressWarnings("restriction")
public abstract class AbstractParserAction {
/**
* Used with very simple optional rules that just say
* that some particular token or keyword is optional.
* The presence of the PLACE_HOLDER on the stack means that the keyword
* was parsed, the presence of null means the keyword wasn't parsed.
*
* @see BuildASTParserAction#consumePlaceHolder()
* @see BuildASTParserAction#consumeEmpty()
*/
protected static final Object PLACE_HOLDER = Boolean.TRUE; // any object will do
/** Provides an interface to the token stream */
protected final IParserActionTokenProvider parser;
/** Stack that holds the intermediate nodes as the AST is being built */
protected final ScopedStack<Object> astStack;
/** The completion node, only generated during a completion parse */
protected ASTCompletionNode completionNode;
/** The root node is created outside the parser because it is also needed by the preprocessor */
protected final IASTTranslationUnit tu;
/** Options that change the behavior of the parser actions */
protected Set<IParser.Options> options = EnumSet.noneOf(IParser.Options.class);
/**
* Completion tokens are represented by different kinds by different parsers.
*/
protected abstract boolean isCompletionToken(IToken token);
protected abstract IASTName createName(char[] image);
/**
* Create a new parser action.
* @param tu Root node of the AST, its list of declarations should be empty.
* @throws NullPointerException if any of the parameters are null
*/
public AbstractParserAction(IParserActionTokenProvider parser, IASTTranslationUnit tu, ScopedStack<Object> astStack) {
if(parser == null)
throw new NullPointerException("parser is null"); //$NON-NLS-1$
if(tu == null)
throw new NullPointerException("tu is null"); //$NON-NLS-1$
if(astStack == null)
throw new NullPointerException("astStack is null"); //$NON-NLS-1$
this.parser = parser;
this.tu = tu;
this.astStack = astStack;
}
protected void setOffsetAndLength(IASTNode node) {
int ruleOffset = parser.getLeftIToken().getStartOffset();
int ruleLength = parser.getRightIToken().getEndOffset() - ruleOffset;
((ASTNode)node).setOffsetAndLength(ruleOffset, ruleLength < 0 ? 0 : ruleLength);
}
/**
* Creates a IASTName node from an identifier token.
* If the token is a completion token then it is added to the completion node.
*/
protected IASTName createName(IToken token) {
IASTName name = createName(token.toString().toCharArray()); // TODO, token.toCharArray();
ParserUtil.setOffsetAndLength(name, token);
if(isCompletionToken(token))
addNameToCompletionNode(name, token.toString());
return name;
}
public void setParserOptions(Set<IParser.Options> options) {
this.options = options == null ? EnumSet.noneOf(IParser.Options.class) : options;
}
/**
* Creates a completion node if one does not yet exist and adds the
* given name to it.
*/
protected void addNameToCompletionNode(IASTName name, String prefix) {
if(completionNode == null) {
prefix = (prefix == null || prefix.length() == 0) ? null : prefix;
completionNode = newCompletionNode(prefix, tu);
}
completionNode.addName(name);
}
public ASTCompletionNode newCompletionNode(String prefix, IASTTranslationUnit tu) {
return new ASTCompletionNode((prefix == null || prefix.length() == 0) ? null : prefix, tu);
}
/**
* Used to combine completion nodes from secondary parsers into
* the main completion node.
*/
protected void addNameToCompletionNode(IASTCompletionNode node) {
if(node == null)
return;
for(IASTName name : node.getNames())
addNameToCompletionNode(name, node.getPrefix());
}
/**
* Returns the completion node if this is a completion parse, null otherwise.
*/
public IASTCompletionNode getASTCompletionNode() {
return completionNode;
}
/**
* Runs the given parser on the given token list.
*
*/
protected IASTNode runSecondaryParser(IParser secondaryParser) {
return runSecondaryParser(secondaryParser, parser.getRuleTokens());
}
/**
* Runs the given parser on the tokens that make up the current rule.
*/
protected IASTNode runSecondaryParser(IParser secondaryParser, List<IToken> tokens) {
// the secondary parser will alter the token kinds, which will need to be undone
int[] savedKinds = new int[tokens.size()];
int i = 0;
for(IToken token : tokens)
savedKinds[i++] = token.getKind();
secondaryParser.setTokens(tokens);
// need to pass tu because any new completion nodes need to be linked directly to the root
IASTCompletionNode compNode = secondaryParser.parse(tu, options);
addNameToCompletionNode(compNode);
IASTNode result = secondaryParser.getSecondaryParseResult();
// restore the token kinds
i = 0;
for(IToken token : tokens)
token.setKind(savedKinds[i++]);
return result;
}
/*************************************************************************************************************
* Basic Actions
************************************************************************************************************/
/**
* Method that is called by the special <openscope> production
* in order to create a new scope in the AST stack.
*/
public void openASTScope() {
astStack.openScope();
}
/**
* Place null on the stack.
* Usually called for optional element to indicate the element
* was not parsed.
*/
public void consumeEmpty() {
astStack.push(null);
}
/**
* Place a marker on the stack.
* Usually used for very simple optional elements to indicate
* the element was parsed. Usually the existence of an AST node
* on the stack is used instead of the marker, but for simple
* cases like an optional keyword this action is useful.
*/
public void consumePlaceHolder() {
astStack.push(PLACE_HOLDER);
}
/**
* Just pops the stack, useful if you have a rule that generates
* a node but you don't need the node.
*/
public void consumeIgnore() {
astStack.pop();
}
/**
* Gets the current token and places it on the stack for later consumption.
*/
public void consumeToken() {
astStack.push(parser.getRightIToken());
}
}

View file

@ -10,14 +10,16 @@
*******************************************************************************/
package org.eclipse.cdt.core.dom.lrparser.action;
import java.util.Arrays;
import java.util.EnumSet;
import static org.eclipse.cdt.core.dom.lrparser.action.ParserUtil.endOffset;
import static org.eclipse.cdt.core.dom.lrparser.action.ParserUtil.length;
import static org.eclipse.cdt.core.dom.lrparser.action.ParserUtil.offset;
import java.util.List;
import java.util.Set;
import lpg.lpgjavaruntime.IToken;
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTASMDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTArrayModifier;
import org.eclipse.cdt.core.dom.ast.IASTArraySubscriptExpression;
@ -25,7 +27,6 @@ import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
import org.eclipse.cdt.core.dom.ast.IASTBreakStatement;
import org.eclipse.cdt.core.dom.ast.IASTCaseStatement;
import org.eclipse.cdt.core.dom.ast.IASTCastExpression;
import org.eclipse.cdt.core.dom.ast.IASTCompletionNode;
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
import org.eclipse.cdt.core.dom.ast.IASTConditionalExpression;
import org.eclipse.cdt.core.dom.ast.IASTContinueStatement;
@ -75,56 +76,22 @@ import org.eclipse.cdt.core.parser.IProblem;
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.ASTTranslationUnit;
import org.eclipse.cdt.internal.core.dom.parser.AbstractGNUSourceCodeParser;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousExpression;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousStatement;
/**
* Parser semantic actions that are common to both C and C++.
*
* @author Mike Kucera
*/
@SuppressWarnings("restriction")
public abstract class BuildASTParserAction {
/**
* Used with very simple optional rules that just say
* that some particular token or keyword is optional.
* The presence of the PLACE_HOLDER on the stack means that the keyword
* was parsed, the presence of null means the keyword wasn't parsed.
*
* @see BuildASTParserAction#consumePlaceHolder()
* @see BuildASTParserAction#consumeEmpty()
*/
protected static final Object PLACE_HOLDER = Boolean.TRUE; // any object will do
public abstract class BuildASTParserAction extends AbstractParserAction {
/** Stack that holds the intermediate nodes as the AST is being built */
protected final ScopedStack<Object> astStack = new ScopedStack<Object>();
/** Provides an interface to the token stream */
protected final IParserActionTokenProvider parser;
/** The completion node, only generated during a completion parse */
protected ASTCompletionNode completionNode;
/** The root node is created outside the parser because it is also needed by the preprocessor */
protected final IASTTranslationUnit tu;
/** Abstract factory for creating AST node objects */
private final INodeFactory nodeFactory;
/** Options that change the behavior of the parser actions */
protected Set<IParser.Options> options = EnumSet.noneOf(IParser.Options.class);
/**
* Completion tokens are represented by different kinds by different parsers.
*/
protected abstract boolean isCompletionToken(IToken token);
/**
* Returns true if the token is an identifier.
@ -158,273 +125,16 @@ public abstract class BuildASTParserAction {
* @param tu Root node of the AST, its list of declarations should be empty.
* @throws NullPointerException if any of the parameters are null
*/
public BuildASTParserAction(INodeFactory nodeFactory, IParserActionTokenProvider parser, IASTTranslationUnit tu) {
public BuildASTParserAction(INodeFactory nodeFactory, IParserActionTokenProvider parser, IASTTranslationUnit tu, ScopedStack<Object> astStack) {
super(parser, tu, astStack);
if(nodeFactory == null)
throw new NullPointerException("nodeFactory is null"); //$NON-NLS-1$
if(parser == null)
throw new NullPointerException("parser is null"); //$NON-NLS-1$
if(tu == null)
throw new NullPointerException("tu is null"); //$NON-NLS-1$
this.nodeFactory = nodeFactory;
this.parser = parser;
this.tu = tu;
}
public void setParserOptions(Set<IParser.Options> options) {
this.options = options == null ? EnumSet.noneOf(IParser.Options.class) : options;
}
/**
* Creates a completion node if one does not yet exist and adds the
* given name to it.
*/
protected void addNameToCompletionNode(IASTName name, String prefix) {
if(completionNode == null) {
prefix = (prefix == null || prefix.length() == 0) ? null : prefix;
completionNode = newCompletionNode(prefix, tu);
}
completionNode.addName(name);
}
public ASTCompletionNode newCompletionNode(String prefix, IASTTranslationUnit tu) {
return new ASTCompletionNode((prefix == null || prefix.length() == 0) ? null : prefix, tu);
}
/**
* Used to combine completion nodes from secondary parsers into
* the main completion node.
*/
protected void addNameToCompletionNode(IASTCompletionNode node) {
if(node == null)
return;
for(IASTName name : node.getNames())
addNameToCompletionNode(name, node.getPrefix());
}
/**
* Returns the completion node if this is a completion parse, null otherwise.
*/
public IASTCompletionNode getASTCompletionNode() {
return completionNode;
}
/**
* Used to get the result of secondary parsers.
*/
public IASTNode getSecondaryParseResult() {
return (IASTNode) astStack.pop();
}
protected static int offset(IToken token) {
return token.getStartOffset();
}
protected static int offset(IASTNode node) {
return ((ASTNode)node).getOffset();
}
protected static int length(IToken token) {
return endOffset(token) - offset(token);
}
protected static int length(IASTNode node) {
return ((ASTNode)node).getLength();
}
protected static int endOffset(IASTNode node) {
return offset(node) + length(node);
}
protected static int endOffset(IToken token) {
return token.getEndOffset();
}
protected void setOffsetAndLength(IASTNode node) {
int ruleOffset = parser.getLeftIToken().getStartOffset();
int ruleLength = parser.getRightIToken().getEndOffset() - ruleOffset;
((ASTNode)node).setOffsetAndLength(ruleOffset, ruleLength < 0 ? 0 : ruleLength);
}
protected static void setOffsetAndLength(IASTNode node, IToken token) {
((ASTNode)node).setOffsetAndLength(offset(token), length(token));
}
protected static void setOffsetAndLength(IASTNode node, int offset, int length) {
((ASTNode)node).setOffsetAndLength(offset, length);
}
protected static void setOffsetAndLength(IASTNode node, IASTNode from) {
setOffsetAndLength(node, offset(from), length(from));
}
protected static boolean isSameName(IASTName name1, IASTName name2) {
return Arrays.equals(name1.getLookupKey(), name2.getLookupKey());
}
/**
* Creates a IASTName node from an identifier token.
* If the token is a completion token then it is added to the completion node.
*/
protected IASTName createName(IToken token) {
IASTName name = nodeFactory.newName(token.toString().toCharArray()); // TODO, token.toCharArray();
setOffsetAndLength(name, token);
if(isCompletionToken(token))
addNameToCompletionNode(name, token.toString());
return name;
}
/**
* Runs the given parser on the given token list.
*
*/
protected IASTNode runSecondaryParser(IParser secondaryParser) {
return runSecondaryParser(secondaryParser, parser.getRuleTokens());
}
/**
* Runs the given parser on the tokens that make up the current rule.
*/
protected IASTNode runSecondaryParser(IParser secondaryParser, List<IToken> tokens) {
// the secondary parser will alter the token kinds, which will need to be undone
int[] savedKinds = new int[tokens.size()];
int i = 0;
for(IToken token : tokens)
savedKinds[i++] = token.getKind();
secondaryParser.setTokens(tokens);
// need to pass tu because any new completion nodes need to be linked directly to the root
IASTCompletionNode compNode = secondaryParser.parse(tu, options);
addNameToCompletionNode(compNode);
IASTNode result = secondaryParser.getSecondaryParseResult();
// restore the token kinds
i = 0;
for(IToken token : tokens)
token.setKind(savedKinds[i++]);
return result;
}
/**
* Allows simple pattern match testing of lists of tokens.
*
* TODO: need to take token mapping into account
*
* @throws NullPointerException if source or pattern is null
*/
public static boolean matchTokens(List<IToken> source, ITokenMap tokenMap, Integer ... pattern) {
if(source.size() != pattern.length) // throws NPE if either parameter is null
return false;
for(int i = 0, n = pattern.length; i < n; i++) {
if(tokenMap.mapKind(source.get(i).getKind()) != pattern[i].intValue())
return false;
}
return true;
}
/**
* Finds the tokens in the given list that are between startOffset and endOffset.
* Note, the offsets have to be exact.
*/
public static List<IToken> tokenOffsetSubList(List<IToken> tokens, int startOffset, int endOffset) {
int first = 0, last = 0;
int i = 0;
for(IToken t : tokens) {
if(offset(t) == startOffset) {
first = i;
}
if(endOffset(t) == endOffset) {
last = i;
break;
}
i++;
}
return tokens.subList(first, last + 1);
}
/*************************************************************************************************************
* Start of actions.
************************************************************************************************************/
/**
* Method that is called by the special <openscope> production
* in order to create a new scope in the AST stack.
*/
public void openASTScope() {
astStack.openScope();
}
/**
* Place null on the stack.
* Usually called for optional element to indicate the element
* was not parsed.
*/
public void consumeEmpty() {
astStack.push(null);
}
/**
* Place a marker on the stack.
* Usually used for very simple optional elements to indicate
* the element was parsed. Usually the existence of an AST node
* on the stack is used instead of the marker, but for simple
* cases like an optional keyword this action is useful.
*/
public void consumePlaceHolder() {
astStack.push(PLACE_HOLDER);
}
/**
* Just pops the stack, useful if you have a rule that generates
* a node but you don't need the node.
*/
public void consumeIgnore() {
astStack.pop();
}
/**
* Gets the current token and places it on the stack for later consumption.
*/
public void consumeDeclSpecToken() {
astStack.push(parser.getRightIToken());
}
/**
* Gets the current token and places it on the stack for later consumption.
*/
public void consumeToken() {
astStack.push(parser.getRightIToken());
}
public void consumeTranslationUnit() {
// can't close the outermost scope
// the outermost scope may be empty if there are no tokens in the file
@ -436,7 +146,7 @@ public abstract class BuildASTParserAction {
IASTDeclaration[] declarations = tu.getDeclarations();
if (declarations.length != 0) {
IASTNode d = declarations[declarations.length-1];
setOffsetAndLength(tu, 0, offset(d) + length(d));
ParserUtil.setOffsetAndLength(tu, 0, offset(d) + length(d));
}
resolveAmbiguityNodes();
@ -446,29 +156,18 @@ public abstract class BuildASTParserAction {
/**
* Removes ambiguity nodes from the AST by resolving them.
* The ambiguity nodes resolve themselves when visited for the first time.
* All ambiguities must be resolved before the AST is returned.
*
* @see CPPASTAmbiguity.accept()
* @see CASTAmbiguity.accept()
*
* TODO Ambiguity resolution may be avoided in the case that no
* ambiguity nodes were created.
* @see AbstractGNUSourceCodeParser#resolveAmbiguities()
*/
private void resolveAmbiguityNodes() {
tu.accept(EMPTY_VISITOR);
tu.accept(createAmbiguityNodeVisitor());
if (tu instanceof ASTTranslationUnit) {
((ASTTranslationUnit)tu).cleanupAfterAmbiguityResolution();
}
}
/**
* When applied to the AST causes ambiguity nodes to be resolved.
*/
protected static final ASTVisitor EMPTY_VISITOR = new ASTVisitor() {
{ shouldVisitStatements = true; }
};
protected abstract ASTVisitor createAmbiguityNodeVisitor();
/**
@ -583,7 +282,7 @@ public abstract class BuildASTParserAction {
// }
IASTLiteralExpression expr = nodeFactory.newLiteralExpression(kind, rep);
setOffsetAndLength(expr, token);
ParserUtil.setOffsetAndLength(expr, token);
astStack.push(expr);
}
@ -795,7 +494,7 @@ public abstract class BuildASTParserAction {
List<IToken> tokens = parser.getRuleTokens();
IToken defaultToken = tokens.get(0);
IToken colonToken = tokens.get(1);
setOffsetAndLength(stat, offset(defaultToken), offset(colonToken) - offset(defaultToken) + 1);
ParserUtil.setOffsetAndLength(stat, offset(defaultToken), offset(colonToken) - offset(defaultToken) + 1);
IASTCompoundStatement compound = nodeFactory.newCompoundStatement();
setOffsetAndLength(compound);
@ -917,7 +616,7 @@ public abstract class BuildASTParserAction {
declarator = (IASTDeclarator) astStack.pop();
else {
declarator = nodeFactory.newDeclarator(nodeFactory.newName());
setOffsetAndLength(declarator, parser.getRightIToken().getEndOffset(), 0);
ParserUtil.setOffsetAndLength(declarator, parser.getRightIToken().getEndOffset(), 0);
}
IASTDeclSpecifier declSpecifier = (IASTDeclSpecifier) astStack.pop();
@ -976,6 +675,19 @@ public abstract class BuildASTParserAction {
setOffsetAndLength(declarator); // adjust the length to include the initializer
}
/**
* asm_definition
* ::= 'asm' '(' 'stringlit' ')' ';'
*/
public void consumeDeclarationASM() {
String s = parser.getRuleTokens().get(2).toString();
IASTASMDeclaration asm = nodeFactory.newASMDeclaration(s);
setOffsetAndLength(asm);
astStack.push(asm);
}
/**
@ -999,11 +711,11 @@ public abstract class BuildASTParserAction {
final int endOffset = parser.getRightIToken().getEndOffset();
IASTName name = nodeFactory.newName();
setOffsetAndLength(name, endOffset, 0);
ParserUtil.setOffsetAndLength(name, endOffset, 0);
// it appears that a declarator is always required in the AST here
IASTDeclarator declarator = nodeFactory.newDeclarator(name);
setOffsetAndLength(declarator, endOffset, 0);
ParserUtil.setOffsetAndLength(declarator, endOffset, 0);
IASTDeclSpecifier declSpec = (IASTDeclSpecifier) astStack.pop();
IASTParameterDeclaration declaration = nodeFactory.newParameterDeclaration(declSpec, declarator);
@ -1113,7 +825,7 @@ public abstract class BuildASTParserAction {
int offset = offset(nested);
int length = endOffset(arrayModifier) - offset;
setOffsetAndLength(declarator, offset, length);
ParserUtil.setOffsetAndLength(declarator, offset, length);
declarator.addArrayModifier(arrayModifier);
astStack.push(declarator);
@ -1133,7 +845,7 @@ public abstract class BuildASTParserAction {
int offset = offset(name);
int length = endOffset(arrayModifier) - offset;
setOffsetAndLength(decl, offset, length);
ParserUtil.setOffsetAndLength(decl, offset, length);
decl.addArrayModifier(arrayModifier);
astStack.push(decl);
@ -1155,7 +867,7 @@ public abstract class BuildASTParserAction {
declarator.setNestedDeclarator(decl);
declarator.setName(nodeFactory.newName());
int offset = offset(decl);
setOffsetAndLength(declarator, offset, endOffset - offset);
ParserUtil.setOffsetAndLength(declarator, offset, endOffset - offset);
astStack.push(declarator);
}
else {
@ -1171,7 +883,7 @@ public abstract class BuildASTParserAction {
}
int offset = offset(name); // TODO
setOffsetAndLength(declarator, offset, endOffset - offset);
ParserUtil.setOffsetAndLength(declarator, offset, endOffset - offset);
astStack.push(declarator);
}
}

View file

@ -0,0 +1,102 @@
package org.eclipse.cdt.core.dom.lrparser.action;
import java.util.Arrays;
import java.util.List;
import lpg.lpgjavaruntime.IToken;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
@SuppressWarnings("restriction")
public final class ParserUtil {
private ParserUtil() {}
public static int offset(IToken token) {
return token.getStartOffset();
}
public static int offset(IASTNode node) {
return ((ASTNode)node).getOffset();
}
public static int length(IToken token) {
return endOffset(token) - offset(token);
}
public static int length(IASTNode node) {
return ((ASTNode)node).getLength();
}
public static int endOffset(IASTNode node) {
return offset(node) + length(node);
}
public static int endOffset(IToken token) {
return token.getEndOffset();
}
public static void setOffsetAndLength(IASTNode node, IToken token) {
((ASTNode)node).setOffsetAndLength(offset(token), length(token));
}
public static void setOffsetAndLength(IASTNode node, int offset, int length) {
((ASTNode)node).setOffsetAndLength(offset, length);
}
public static void setOffsetAndLength(IASTNode node, IASTNode from) {
setOffsetAndLength(node, offset(from), length(from));
}
public static boolean isSameName(IASTName name1, IASTName name2) {
return Arrays.equals(name1.getLookupKey(), name2.getLookupKey());
}
/**
* Allows simple pattern match testing of lists of tokens.
*
* @throws NullPointerException if source or pattern is null
*/
public static boolean matchTokens(List<IToken> source, ITokenMap tokenMap, Integer ... pattern) {
if(source.size() != pattern.length) // throws NPE if either parameter is null
return false;
for(int i = 0, n = pattern.length; i < n; i++) {
if(tokenMap.mapKind(source.get(i).getKind()) != pattern[i].intValue())
return false;
}
return true;
}
/**
* Finds the tokens in the given list that are between startOffset and endOffset.
* Note, the offsets have to be exact.
*/
public static List<IToken> tokenOffsetSubList(List<IToken> tokens, int startOffset, int endOffset) {
int first = 0, last = 0;
int i = 0;
for(IToken t : tokens) {
if(offset(t) == startOffset) {
first = i;
}
if(endOffset(t) == endOffset) {
last = i;
break;
}
i++;
}
return tokens.subList(first, last + 1);
}
}

View file

@ -12,12 +12,17 @@
package org.eclipse.cdt.core.dom.lrparser.action.c99;
import static org.eclipse.cdt.internal.core.dom.lrparser.c99.C99Parsersym.*;
import static org.eclipse.cdt.core.dom.lrparser.action.ParserUtil.endOffset;
import static org.eclipse.cdt.core.dom.lrparser.action.ParserUtil.length;
import static org.eclipse.cdt.core.dom.lrparser.action.ParserUtil.offset;
import static org.eclipse.cdt.core.dom.lrparser.action.ParserUtil.matchTokens;
import java.util.Collections;
import java.util.List;
import lpg.lpgjavaruntime.IToken;
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
@ -62,15 +67,19 @@ import org.eclipse.cdt.core.dom.lrparser.IParser;
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.ITokenMap;
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.TokenMap;
import org.eclipse.cdt.core.parser.util.CollectionUtils;
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.C99Parsersym;
import org.eclipse.cdt.internal.core.dom.lrparser.c99.C99SizeofExpressionParser;
import org.eclipse.cdt.internal.core.dom.parser.ASTAmbiguousNode;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousExpression;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousStatement;
import org.eclipse.cdt.internal.core.dom.parser.c.CASTAmbiguityResolver;
import org.eclipse.cdt.internal.core.dom.parser.c.CASTAmbiguousExpression;
import org.eclipse.cdt.internal.core.dom.parser.c.CASTAmbiguousStatement;
@ -92,8 +101,9 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
* @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.
*/
public C99BuildASTParserAction(ICNodeFactory nodeFactory, IParserActionTokenProvider parser, IASTTranslationUnit tu) {
super(nodeFactory, parser, tu);
public C99BuildASTParserAction(ICNodeFactory nodeFactory, IParserActionTokenProvider parser, IASTTranslationUnit tu, ScopedStack<Object> astStack) {
super(nodeFactory, parser, tu, astStack);
this.nodeFactory = nodeFactory;
this.tokenMap = new TokenMap(C99Parsersym.orderedTerminalSymbols, parser.getOrderedTerminalSymbols());
}
@ -129,13 +139,16 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
return new C99SizeofExpressionParser(parser.getOrderedTerminalSymbols());
}
@Override
protected IASTName createName(char[] image) {
return nodeFactory.newName(image);
}
/********************************************************************
* Start of semantic actions.
********************************************************************/
/**
@ -322,7 +335,7 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
public void consumePointer() {
IASTPointer pointer = nodeFactory.newPointer();
IToken star = parser.getRightIToken();
setOffsetAndLength(pointer, star);
ParserUtil.setOffsetAndLength(pointer, star);
astStack.push(pointer);
}
@ -618,14 +631,14 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
TK_for, TK_LeftParen, TK_Completion, TK_EOC, TK_EOC, TK_EOC, TK_EOC)) {
IASTName name = createName(tokens.get(2));
IASTIdExpression idExpression = nodeFactory.newIdExpression(name);
setOffsetAndLength(idExpression, offset(name), length(name));
ParserUtil.setOffsetAndLength(idExpression, offset(name), length(name));
initializer = nodeFactory.newExpressionStatement(idExpression);
setOffsetAndLength(initializer, offset(name), length(name));
ParserUtil.setOffsetAndLength(initializer, offset(name), length(name));
}
if(node != null)
setOffsetAndLength(initializer, offset(node), length(node));
ParserUtil.setOffsetAndLength(initializer, offset(node), length(node));
IASTForStatement forStat = nodeFactory.newForStatement(initializer, expr2, expr3, body);
setOffsetAndLength(forStat);
@ -727,4 +740,11 @@ public class C99BuildASTParserAction extends BuildASTParserAction {
protected IASTAmbiguousStatement createAmbiguousStatement(IASTStatement... statements) {
return new CASTAmbiguousStatement(statements);
}
@Override
protected ASTVisitor createAmbiguityNodeVisitor() {
return new CASTAmbiguityResolver();
}
}

View file

@ -10,6 +10,10 @@
*******************************************************************************/
package org.eclipse.cdt.core.dom.lrparser.action.cpp;
import static org.eclipse.cdt.core.dom.lrparser.action.ParserUtil.endOffset;
import static org.eclipse.cdt.core.dom.lrparser.action.ParserUtil.length;
import static org.eclipse.cdt.core.dom.lrparser.action.ParserUtil.matchTokens;
import static org.eclipse.cdt.core.dom.lrparser.action.ParserUtil.offset;
import static org.eclipse.cdt.core.parser.util.CollectionUtils.findFirstAndRemove;
import static org.eclipse.cdt.core.parser.util.CollectionUtils.reverseIterable;
import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.*;
@ -21,7 +25,7 @@ import java.util.List;
import lpg.lpgjavaruntime.IToken;
import org.eclipse.cdt.core.dom.ast.IASTASMDeclaration;
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
@ -95,6 +99,8 @@ import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
import org.eclipse.cdt.core.dom.lrparser.LPGTokenAdapter;
import org.eclipse.cdt.core.dom.lrparser.action.BuildASTParserAction;
import org.eclipse.cdt.core.dom.lrparser.action.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.ParserUtil;
import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPExpressionParser;
import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPNoCastExpressionParser;
@ -105,6 +111,7 @@ import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPTemplateTypeParameterPa
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousExpression;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousStatement;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguityResolver;
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.CPPASTAmbiguousStatement;
@ -137,8 +144,9 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
* @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.
*/
public CPPBuildASTParserAction(ICPPNodeFactory nodeFactory, IParserActionTokenProvider parser, IASTTranslationUnit tu) {
super(nodeFactory, parser, tu);
public CPPBuildASTParserAction(ICPPNodeFactory nodeFactory, IParserActionTokenProvider parser, IASTTranslationUnit tu, ScopedStack<Object> astStack) {
super(nodeFactory, parser, tu, astStack);
this.nodeFactory = nodeFactory;
this.tokenMap = new TokenMap(CPPParsersym.orderedTerminalSymbols, parser.getOrderedTerminalSymbols());
}
@ -158,7 +166,11 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
return baseKind(token) == TK_identifier;
}
@Override
protected IASTName createName(char[] image) {
return nodeFactory.newName(image);
}
@Override
protected IParser getExpressionParser() {
return new CPPExpressionParser(parser.getOrderedTerminalSymbols());
@ -224,17 +236,17 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
IASTName secondName = ((IASTNamedTypeSpecifier)typeId.getDeclSpecifier()).getName();
IASTNamedTypeSpecifier newTypeSpecifier = nodeFactory.newTypedefNameSpecifier(firstName.copy());
setOffsetAndLength(newTypeSpecifier, firstName);
ParserUtil.setOffsetAndLength(newTypeSpecifier, firstName);
IASTDeclarator newDeclarator = nodeFactory.newDeclarator(nodeFactory.newName());
setOffsetAndLength(newDeclarator, endOffset(firstName), 0);
ParserUtil.setOffsetAndLength(newDeclarator, endOffset(firstName), 0);
IASTTypeId newTypeId = nodeFactory.newTypeId(newTypeSpecifier, newDeclarator);
setOffsetAndLength(newTypeId, firstName);
ParserUtil.setOffsetAndLength(newTypeId, firstName);
IASTIdExpression newInitializer = nodeFactory.newIdExpression(secondName.copy());
setOffsetAndLength(newInitializer, secondName);
ParserUtil.setOffsetAndLength(newInitializer, secondName);
ICPPASTNewExpression alternate = nodeFactory.newNewExpression(null, newInitializer, newTypeId);
setOffsetAndLength(alternate, newExpression);
ParserUtil.setOffsetAndLength(alternate, newExpression);
newExpression.setIsGlobal(hasDoubleColon);
newExpression.setIsNewTypeId(isNewTypeId);
@ -384,7 +396,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
IASTDeclSpecifier declSpec = (IASTDeclSpecifier) astStack.pop();
IASTInitializerExpression initializer = nodeFactory.newInitializerExpression(expr);
setOffsetAndLength(initializer, offset(expr), length(expr));
ParserUtil.setOffsetAndLength(initializer, offset(expr), length(expr));
declarator.setInitializer(initializer);
IASTSimpleDeclaration declaration = nodeFactory.newSimpleDeclaration(declSpec);
@ -457,10 +469,10 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
IASTName name = ((IASTIdExpression)expr).getName().copy();
IASTNamedTypeSpecifier declSpec = nodeFactory.newTypedefNameSpecifier(name);
setOffsetAndLength(declSpec, name);
ParserUtil.setOffsetAndLength(declSpec, name);
IASTDeclarator declarator = nodeFactory.newDeclarator(nodeFactory.newName());
setOffsetAndLength(declarator, endOffset(declSpec), 0);
ParserUtil.setOffsetAndLength(declarator, endOffset(declSpec), 0);
IASTTypeId typeId = nodeFactory.newTypeId(declSpec, declarator);
setOffsetAndLength(typeId);
@ -556,7 +568,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
int offset = offset(parser.getLeftIToken());
int length = offset - endOffset(oldName);
setOffsetAndLength(newName, offset, length);
ParserUtil.setOffsetAndLength(newName, offset, length);
templateId.setTemplateName(newName);
}
@ -651,9 +663,9 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
TK_for, TK_LeftParen, TK_Completion, TK_EOC, TK_EOC, TK_EOC, TK_EOC)) {
IASTName name = createName(tokens.get(2));
IASTIdExpression idExpression = nodeFactory.newIdExpression(name);
setOffsetAndLength(idExpression, offset(name), length(name));
ParserUtil.setOffsetAndLength(idExpression, offset(name), length(name));
initializer = nodeFactory.newExpressionStatement(idExpression);
setOffsetAndLength(initializer, offset(name), length(name));
ParserUtil.setOffsetAndLength(initializer, offset(name), length(name));
}
@ -779,13 +791,13 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
ICPPASTQualifiedName qualifiedName = nodeFactory.newQualifiedName();
qualifiedName.setFullyQualified(startsWithColonColon);
setOffsetAndLength(qualifiedName, startOffset, endOffset - startOffset);
ParserUtil.setOffsetAndLength(qualifiedName, startOffset, endOffset - startOffset);
for(IASTName name : reverseIterable(names))
qualifiedName.addName(name);
if(qualifiedName instanceof CPPASTQualifiedName) {
// compute the signature, find the tokens that make up the name
List<IToken> nameTokens = tokenOffsetSubList(parser.getRuleTokens(), startOffset, endOffset);
List<IToken> nameTokens = ParserUtil.tokenOffsetSubList(parser.getRuleTokens(), startOffset, endOffset);
String signature = createStringRepresentation(nameTokens);
((CPPASTQualifiedName)qualifiedName).setSignature(signature);
}
@ -793,7 +805,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
// there must be a dummy name in the AST after the last double colon, this happens with pointer to member names
if(endsWithColonColon) {
IASTName dummyName = nodeFactory.newName();
setOffsetAndLength(dummyName, endOffset, 0);
ParserUtil.setOffsetAndLength(dummyName, endOffset, 0);
qualifiedName.addName(dummyName);
}
@ -891,18 +903,6 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
}
/**
* asm_definition
* ::= 'asm' '(' 'stringlit' ')' ';'
*/
public void consumeDeclarationASM() {
String s = parser.getRuleTokens().get(2).toString();
IASTASMDeclaration asm = nodeFactory.newASMDeclaration(s);
setOffsetAndLength(asm);
astStack.push(asm);
}
/**
* namespace_alias_definition
* ::= 'namespace' 'identifier' '=' dcolon_opt nested_name_specifier_opt namespace_name ';'
@ -1213,14 +1213,14 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
else if(matchTokens(ruleTokens, tokenMap, TK_Completion, TK_EndOfCompletion)) {
IASTName name = createName(parser.getLeftIToken());
declSpec = nodeFactory.newTypedefNameSpecifier(name);
setOffsetAndLength(declSpec, offset(name), length(name));
ParserUtil.setOffsetAndLength(declSpec, offset(name), length(name));
declarators = Collections.emptyList(); // throw away the bogus declarator
}
// can happen if implicit int is used
else if(declSpec == null) {
declSpec = nodeFactory.newSimpleDeclSpecifier();
setOffsetAndLength(declSpec, parser.getLeftIToken().getStartOffset(), 0);
ParserUtil.setOffsetAndLength(declSpec, parser.getLeftIToken().getStartOffset(), 0);
}
@ -1242,11 +1242,11 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
int offset = offset(parser.getLeftIToken());
int length = endOffset(ruleTokens.get(ruleTokens.size()-2)) - offset;
setOffsetAndLength(declSpec, offset, length);
ParserUtil.setOffsetAndLength(declSpec, offset, length);
IASTName name = createName(nameToken);
IASTDeclarator declarator = nodeFactory.newDeclarator(name);
setOffsetAndLength(declarator, nameToken);
ParserUtil.setOffsetAndLength(declarator, nameToken);
declarators.add(declarator);
}
@ -1280,23 +1280,23 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
IASTDeclarator nested = declarator.getNestedDeclarator();
ICPPASTSimpleDeclSpecifier simpleDeclSpec = nodeFactory.newSimpleDeclSpecifier(); // empty
setOffsetAndLength(simpleDeclSpec, parser.getLeftIToken().getStartOffset(), 0);
ParserUtil.setOffsetAndLength(simpleDeclSpec, parser.getLeftIToken().getStartOffset(), 0);
if(!classNames.isEmpty() && nested != null && isSameName(name, classNames.getLast())) {
if(!classNames.isEmpty() && nested != null && ParserUtil.isSameName(name, classNames.getLast())) {
IASTName paramTypeName = nested.getName(); // reuse the parameter name node
IASTNamedTypeSpecifier paramName = nodeFactory.newTypedefNameSpecifier(paramTypeName);
setOffsetAndLength(paramName, paramTypeName);
ParserUtil.setOffsetAndLength(paramName, paramTypeName);
IASTDeclarator paramDeclarator = nodeFactory.newDeclarator(nodeFactory.newName());
setOffsetAndLength(paramDeclarator, offset(paramName) + length(paramName), 0);
ParserUtil.setOffsetAndLength(paramDeclarator, offset(paramName) + length(paramName), 0);
ICPPASTParameterDeclaration parameter = nodeFactory.newParameterDeclaration(paramName, paramDeclarator);
setOffsetAndLength(parameter, paramName);
ParserUtil.setOffsetAndLength(parameter, paramName);
ICPPASTFunctionDeclarator constructorDeclarator = nodeFactory.newFunctionDeclarator(name); // reuse the name node
constructorDeclarator.addParameterDeclaration(parameter);
setOffsetAndLength(constructorDeclarator, offset(simpleDeclSpec), endOffset(paramDeclarator) - offset(simpleDeclSpec) + 1);
ParserUtil.setOffsetAndLength(constructorDeclarator, offset(simpleDeclSpec), endOffset(paramDeclarator) - offset(simpleDeclSpec) + 1);
astStack.push(constructorDeclarator);
astStack.push(simpleDeclSpec);
@ -1314,11 +1314,11 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
for(IASTName n : qualifiedName.getNames())
newQualifiedName.addName(n);
setOffsetAndLength(newQualifiedName, offset(name), endOffset(qualifiedName.getLastName()) - offset(name));
ParserUtil.setOffsetAndLength(newQualifiedName, offset(name), endOffset(qualifiedName.getLastName()) - offset(name));
declarator.setName(newQualifiedName);
setOffsetAndLength(declarator, offset(name), length(declarator) + offset(declarator) - offset(name));
ParserUtil.setOffsetAndLength(declarator, offset(name), length(declarator) + offset(declarator) - offset(name));
astStack.push(declarator);
astStack.push(simpleDeclSpec);
@ -1598,7 +1598,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
*/
public void consumeAbstractDeclaratorEmpty() {
IASTName name = nodeFactory.newName();
setOffsetAndLength(name, offset(parser.getLeftIToken())+1, 0);
ParserUtil.setOffsetAndLength(name, offset(parser.getLeftIToken())+1, 0);
IASTDeclarator declarator = nodeFactory.newDeclarator(name);
setOffsetAndLength(declarator);
astStack.push(declarator);
@ -1637,7 +1637,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
if(declSpec == null) { // can happen if implicit int is used
declSpec = nodeFactory.newSimpleDeclSpecifier();
setOffsetAndLength(declSpec, parser.getLeftIToken().getStartOffset(), 0);
ParserUtil.setOffsetAndLength(declSpec, parser.getLeftIToken().getStartOffset(), 0);
}
else if(disambiguateToConstructor(declSpec, declarator)) {
declSpec = (IASTDeclSpecifier) astStack.pop();
@ -1793,4 +1793,8 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
return new CPPASTAmbiguousStatement(statements);
}
@Override
protected ASTVisitor createAmbiguityNodeVisitor() {
return new CPPASTAmbiguityResolver();
}
}

View file

@ -0,0 +1,77 @@
package org.eclipse.cdt.core.dom.lrparser.action.gcc;
import java.util.List;
import lpg.lpgjavaruntime.IToken;
import org.eclipse.cdt.core.dom.ast.IASTASMDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.INodeFactory;
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.ScopedStack;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
import org.eclipse.cdt.internal.core.dom.lrparser.gcc.GCCParsersym;
public class GCCBuildASTParserAction extends AbstractParserAction {
private final INodeFactory nodeFactory;
private final TokenMap tokenMap;
public GCCBuildASTParserAction(INodeFactory nodeFactory, IParserActionTokenProvider parser, IASTTranslationUnit tu, ScopedStack<Object> astStack) {
super(parser, tu, astStack);
this.nodeFactory = nodeFactory;
this.tokenMap = new TokenMap(GCCParsersym.orderedTerminalSymbols, parser.getOrderedTerminalSymbols());
}
@Override
protected IASTName createName(char[] image) {
return nodeFactory.newName(image);
}
@Override
protected boolean isCompletionToken(IToken token) {
return tokenMap.mapKind(token.getKind()) == GCCParsersym.TK_Completion;
}
/**
* Add support for GCC extended ASM declaration syntax.
*
*
* asm_definition -- same as in C++ but its not in C99 spec so we put it here
* ::= 'asm' '(' 'stringlit' ')' ';'
*
* extended_asm_declaration
* ::= 'asm' 'volatile' '(' extended_asm_param_seq ')' ';'
* | 'asm' '(' extended_asm_param_seq ')' ';'
*
*/
public void consumeDeclarationASM() {
List<IToken> tokens = parser.getRuleTokens();
int firstToken = 2;
if(tokenMap.mapKind(tokens.get(1).getKind()) == GCCParsersym.TK_volatile)
firstToken = 3;
StringBuilder sb = new StringBuilder();
boolean first = true;
for(IToken token : tokens.subList(firstToken, tokens.size()-2)) {
if(!first)
sb.append(' ');
sb.append(token.toString());
first = false;
}
IASTASMDeclaration asm = nodeFactory.newASMDeclaration(sb.toString());
setOffsetAndLength(asm);
astStack.push(asm);
}
}

View file

@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
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.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
@ -165,13 +166,16 @@ public class C99ExpressionParser extends PrsStream implements RuleAction , IPars
private C99BuildASTParserAction action;
private ScopedStack<Object> astStack = new ScopedStack<Object>();
public C99ExpressionParser() { // constructor
}
private void initActions(IASTTranslationUnit tu, Set<IParser.Options> options) {
action = new C99BuildASTParserAction ( CNodeFactory.getDefault() , this, tu);
action = new C99BuildASTParserAction ( CNodeFactory.getDefault() , this, tu, astStack);
action.setParserOptions(options);
}
@ -199,13 +203,12 @@ public IASTCompletionNode parse(IASTTranslationUnit tu, Set<IParser.Options> opt
}
// uncomment this method to use with backtracking parser
public List getRuleTokens() {
return Collections.unmodifiableList(getTokens().subList(getLeftSpan(), getRightSpan() + 1));
public List<IToken> getRuleTokens() {
return getTokens().subList(getLeftSpan(), getRightSpan() + 1);
}
public IASTNode getSecondaryParseResult() {
return action.getSecondaryParseResult();
return (IASTNode) astStack.pop();
}
public String[] getOrderedTerminalSymbols() {
@ -767,25 +770,25 @@ public C99ExpressionParser(String[] mapFrom) { // constructor
//
// Rule 159: storage_class_specifier ::= storage_class_specifier_token
//
case 159: { action. consumeDeclSpecToken(); break;
case 159: { action. consumeToken(); break;
}
//
// Rule 165: simple_type_specifier ::= simple_type_specifier_token
//
case 165: { action. consumeDeclSpecToken(); break;
case 165: { action. consumeToken(); break;
}
//
// Rule 178: typedef_name_in_declspec ::= Completion
//
case 178: { action. consumeDeclSpecToken(); break;
case 178: { action. consumeToken(); break;
}
//
// Rule 179: typedef_name_in_declspec ::= identifier
//
case 179: { action. consumeDeclSpecToken(); break;
case 179: { action. consumeToken(); break;
}
//
@ -875,13 +878,13 @@ public C99ExpressionParser(String[] mapFrom) { // constructor
//
// Rule 215: type_qualifier ::= type_qualifier_token
//
case 215: { action. consumeDeclSpecToken(); break;
case 215: { action. consumeToken(); break;
}
//
// Rule 219: function_specifier ::= inline
//
case 219: { action. consumeDeclSpecToken(); break;
case 219: { action. consumeToken(); break;
}
//

View file

@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
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.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
@ -165,13 +166,16 @@ public class C99NoCastExpressionParser extends PrsStream implements RuleAction ,
private C99BuildASTParserAction action;
private ScopedStack<Object> astStack = new ScopedStack<Object>();
public C99NoCastExpressionParser() { // constructor
}
private void initActions(IASTTranslationUnit tu, Set<IParser.Options> options) {
action = new C99BuildASTParserAction ( CNodeFactory.getDefault() , this, tu);
action = new C99BuildASTParserAction ( CNodeFactory.getDefault() , this, tu, astStack);
action.setParserOptions(options);
}
@ -199,13 +203,12 @@ public IASTCompletionNode parse(IASTTranslationUnit tu, Set<IParser.Options> opt
}
// uncomment this method to use with backtracking parser
public List getRuleTokens() {
return Collections.unmodifiableList(getTokens().subList(getLeftSpan(), getRightSpan() + 1));
public List<IToken> getRuleTokens() {
return getTokens().subList(getLeftSpan(), getRightSpan() + 1);
}
public IASTNode getSecondaryParseResult() {
return action.getSecondaryParseResult();
return (IASTNode) astStack.pop();
}
public String[] getOrderedTerminalSymbols() {
@ -761,25 +764,25 @@ public C99NoCastExpressionParser(String[] mapFrom) { // constructor
//
// Rule 158: storage_class_specifier ::= storage_class_specifier_token
//
case 158: { action. consumeDeclSpecToken(); break;
case 158: { action. consumeToken(); break;
}
//
// Rule 164: simple_type_specifier ::= simple_type_specifier_token
//
case 164: { action. consumeDeclSpecToken(); break;
case 164: { action. consumeToken(); break;
}
//
// Rule 177: typedef_name_in_declspec ::= Completion
//
case 177: { action. consumeDeclSpecToken(); break;
case 177: { action. consumeToken(); break;
}
//
// Rule 178: typedef_name_in_declspec ::= identifier
//
case 178: { action. consumeDeclSpecToken(); break;
case 178: { action. consumeToken(); break;
}
//
@ -869,13 +872,13 @@ public C99NoCastExpressionParser(String[] mapFrom) { // constructor
//
// Rule 214: type_qualifier ::= type_qualifier_token
//
case 214: { action. consumeDeclSpecToken(); break;
case 214: { action. consumeToken(); break;
}
//
// Rule 218: function_specifier ::= inline
//
case 218: { action. consumeDeclSpecToken(); break;
case 218: { action. consumeToken(); break;
}
//

View file

@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
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.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
@ -165,13 +166,16 @@ public class C99Parser extends PrsStream implements RuleAction , IParserActionTo
private C99BuildASTParserAction action;
private ScopedStack<Object> astStack = new ScopedStack<Object>();
public C99Parser() { // constructor
}
private void initActions(IASTTranslationUnit tu, Set<IParser.Options> options) {
action = new C99BuildASTParserAction ( CNodeFactory.getDefault() , this, tu);
action = new C99BuildASTParserAction ( CNodeFactory.getDefault() , this, tu, astStack);
action.setParserOptions(options);
}
@ -199,13 +203,12 @@ public IASTCompletionNode parse(IASTTranslationUnit tu, Set<IParser.Options> opt
}
// uncomment this method to use with backtracking parser
public List getRuleTokens() {
return Collections.unmodifiableList(getTokens().subList(getLeftSpan(), getRightSpan() + 1));
public List<IToken> getRuleTokens() {
return getTokens().subList(getLeftSpan(), getRightSpan() + 1);
}
public IASTNode getSecondaryParseResult() {
return action.getSecondaryParseResult();
return (IASTNode) astStack.pop();
}
public String[] getOrderedTerminalSymbols() {
@ -767,25 +770,25 @@ public C99Parser(String[] mapFrom) { // constructor
//
// Rule 159: storage_class_specifier ::= storage_class_specifier_token
//
case 159: { action. consumeDeclSpecToken(); break;
case 159: { action. consumeToken(); break;
}
//
// Rule 165: simple_type_specifier ::= simple_type_specifier_token
//
case 165: { action. consumeDeclSpecToken(); break;
case 165: { action. consumeToken(); break;
}
//
// Rule 178: typedef_name_in_declspec ::= Completion
//
case 178: { action. consumeDeclSpecToken(); break;
case 178: { action. consumeToken(); break;
}
//
// Rule 179: typedef_name_in_declspec ::= identifier
//
case 179: { action. consumeDeclSpecToken(); break;
case 179: { action. consumeToken(); break;
}
//
@ -875,13 +878,13 @@ public C99Parser(String[] mapFrom) { // constructor
//
// Rule 215: type_qualifier ::= type_qualifier_token
//
case 215: { action. consumeDeclSpecToken(); break;
case 215: { action. consumeToken(); break;
}
//
// Rule 219: function_specifier ::= inline
//
case 219: { action. consumeDeclSpecToken(); break;
case 219: { action. consumeToken(); break;
}
//

View file

@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
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.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
@ -165,13 +166,16 @@ public class C99SizeofExpressionParser extends PrsStream implements RuleAction ,
private C99BuildASTParserAction action;
private ScopedStack<Object> astStack = new ScopedStack<Object>();
public C99SizeofExpressionParser() { // constructor
}
private void initActions(IASTTranslationUnit tu, Set<IParser.Options> options) {
action = new C99BuildASTParserAction ( CNodeFactory.getDefault() , this, tu);
action = new C99BuildASTParserAction ( CNodeFactory.getDefault() , this, tu, astStack);
action.setParserOptions(options);
}
@ -199,13 +203,12 @@ public IASTCompletionNode parse(IASTTranslationUnit tu, Set<IParser.Options> opt
}
// uncomment this method to use with backtracking parser
public List getRuleTokens() {
return Collections.unmodifiableList(getTokens().subList(getLeftSpan(), getRightSpan() + 1));
public List<IToken> getRuleTokens() {
return getTokens().subList(getLeftSpan(), getRightSpan() + 1);
}
public IASTNode getSecondaryParseResult() {
return action.getSecondaryParseResult();
return (IASTNode) astStack.pop();
}
public String[] getOrderedTerminalSymbols() {
@ -761,25 +764,25 @@ public C99SizeofExpressionParser(String[] mapFrom) { // constructor
//
// Rule 158: storage_class_specifier ::= storage_class_specifier_token
//
case 158: { action. consumeDeclSpecToken(); break;
case 158: { action. consumeToken(); break;
}
//
// Rule 164: simple_type_specifier ::= simple_type_specifier_token
//
case 164: { action. consumeDeclSpecToken(); break;
case 164: { action. consumeToken(); break;
}
//
// Rule 177: typedef_name_in_declspec ::= Completion
//
case 177: { action. consumeDeclSpecToken(); break;
case 177: { action. consumeToken(); break;
}
//
// Rule 178: typedef_name_in_declspec ::= identifier
//
case 178: { action. consumeDeclSpecToken(); break;
case 178: { action. consumeToken(); break;
}
//
@ -869,13 +872,13 @@ public C99SizeofExpressionParser(String[] mapFrom) { // constructor
//
// Rule 214: type_qualifier ::= type_qualifier_token
//
case 214: { action. consumeDeclSpecToken(); break;
case 214: { action. consumeToken(); break;
}
//
// Rule 218: function_specifier ::= inline
//
case 218: { action. consumeDeclSpecToken(); break;
case 218: { action. consumeToken(); break;
}
//

View file

@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
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.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
@ -166,13 +167,16 @@ public class CPPExpressionParser extends PrsStream implements RuleAction , IPars
private CPPBuildASTParserAction action;
private ScopedStack<Object> astStack = new ScopedStack<Object>();
public CPPExpressionParser() { // constructor
}
private void initActions(IASTTranslationUnit tu, Set<IParser.Options> options) {
action = new CPPBuildASTParserAction ( CPPNodeFactory.getDefault() , this, tu);
action = new CPPBuildASTParserAction ( CPPNodeFactory.getDefault() , this, tu, astStack);
action.setParserOptions(options);
}
@ -200,13 +204,12 @@ public IASTCompletionNode parse(IASTTranslationUnit tu, Set<IParser.Options> opt
}
// uncomment this method to use with backtracking parser
public List getRuleTokens() {
return Collections.unmodifiableList(getTokens().subList(getLeftSpan(), getRightSpan() + 1));
public List<IToken> getRuleTokens() {
return getTokens().subList(getLeftSpan(), getRightSpan() + 1);
}
public IASTNode getSecondaryParseResult() {
return action.getSecondaryParseResult();
return (IASTNode) astStack.pop();
}
public String[] getOrderedTerminalSymbols() {
@ -1110,127 +1113,127 @@ public CPPExpressionParser(String[] mapFrom) { // constructor
//
// Rule 234: no_type_declaration_specifier ::= friend
//
case 234: { action. consumeDeclSpecToken(); break;
case 234: { action. consumeToken(); break;
}
//
// Rule 235: no_type_declaration_specifier ::= typedef
//
case 235: { action. consumeDeclSpecToken(); break;
case 235: { action. consumeToken(); break;
}
//
// Rule 255: storage_class_specifier ::= auto
//
case 255: { action. consumeDeclSpecToken(); break;
case 255: { action. consumeToken(); break;
}
//
// Rule 256: storage_class_specifier ::= register
//
case 256: { action. consumeDeclSpecToken(); break;
case 256: { action. consumeToken(); break;
}
//
// Rule 257: storage_class_specifier ::= static
//
case 257: { action. consumeDeclSpecToken(); break;
case 257: { action. consumeToken(); break;
}
//
// Rule 258: storage_class_specifier ::= extern
//
case 258: { action. consumeDeclSpecToken(); break;
case 258: { action. consumeToken(); break;
}
//
// Rule 259: storage_class_specifier ::= mutable
//
case 259: { action. consumeDeclSpecToken(); break;
case 259: { action. consumeToken(); break;
}
//
// Rule 260: function_specifier ::= inline
//
case 260: { action. consumeDeclSpecToken(); break;
case 260: { action. consumeToken(); break;
}
//
// Rule 261: function_specifier ::= virtual
//
case 261: { action. consumeDeclSpecToken(); break;
case 261: { action. consumeToken(); break;
}
//
// Rule 262: function_specifier ::= explicit
//
case 262: { action. consumeDeclSpecToken(); break;
case 262: { action. consumeToken(); break;
}
//
// Rule 263: simple_type_specifier ::= char
//
case 263: { action. consumeDeclSpecToken(); break;
case 263: { action. consumeToken(); break;
}
//
// Rule 264: simple_type_specifier ::= wchar_t
//
case 264: { action. consumeDeclSpecToken(); break;
case 264: { action. consumeToken(); break;
}
//
// Rule 265: simple_type_specifier ::= bool
//
case 265: { action. consumeDeclSpecToken(); break;
case 265: { action. consumeToken(); break;
}
//
// Rule 266: simple_type_specifier ::= short
//
case 266: { action. consumeDeclSpecToken(); break;
case 266: { action. consumeToken(); break;
}
//
// Rule 267: simple_type_specifier ::= int
//
case 267: { action. consumeDeclSpecToken(); break;
case 267: { action. consumeToken(); break;
}
//
// Rule 268: simple_type_specifier ::= long
//
case 268: { action. consumeDeclSpecToken(); break;
case 268: { action. consumeToken(); break;
}
//
// Rule 269: simple_type_specifier ::= signed
//
case 269: { action. consumeDeclSpecToken(); break;
case 269: { action. consumeToken(); break;
}
//
// Rule 270: simple_type_specifier ::= unsigned
//
case 270: { action. consumeDeclSpecToken(); break;
case 270: { action. consumeToken(); break;
}
//
// Rule 271: simple_type_specifier ::= float
//
case 271: { action. consumeDeclSpecToken(); break;
case 271: { action. consumeToken(); break;
}
//
// Rule 272: simple_type_specifier ::= double
//
case 272: { action. consumeDeclSpecToken(); break;
case 272: { action. consumeToken(); break;
}
//
// Rule 273: simple_type_specifier ::= void
//
case 273: { action. consumeDeclSpecToken(); break;
case 273: { action. consumeToken(); break;
}
//
@ -1446,13 +1449,13 @@ public CPPExpressionParser(String[] mapFrom) { // constructor
//
// Rule 338: cv_qualifier ::= const
//
case 338: { action. consumeDeclSpecToken(); break;
case 338: { action. consumeToken(); break;
}
//
// Rule 339: cv_qualifier ::= volatile
//
case 339: { action. consumeDeclSpecToken(); break;
case 339: { action. consumeToken(); break;
}
//

View file

@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
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.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
@ -166,13 +167,16 @@ public class CPPNoCastExpressionParser extends PrsStream implements RuleAction ,
private CPPBuildASTParserAction action;
private ScopedStack<Object> astStack = new ScopedStack<Object>();
public CPPNoCastExpressionParser() { // constructor
}
private void initActions(IASTTranslationUnit tu, Set<IParser.Options> options) {
action = new CPPBuildASTParserAction ( CPPNodeFactory.getDefault() , this, tu);
action = new CPPBuildASTParserAction ( CPPNodeFactory.getDefault() , this, tu, astStack);
action.setParserOptions(options);
}
@ -200,13 +204,12 @@ public IASTCompletionNode parse(IASTTranslationUnit tu, Set<IParser.Options> opt
}
// uncomment this method to use with backtracking parser
public List getRuleTokens() {
return Collections.unmodifiableList(getTokens().subList(getLeftSpan(), getRightSpan() + 1));
public List<IToken> getRuleTokens() {
return getTokens().subList(getLeftSpan(), getRightSpan() + 1);
}
public IASTNode getSecondaryParseResult() {
return action.getSecondaryParseResult();
return (IASTNode) astStack.pop();
}
public String[] getOrderedTerminalSymbols() {
@ -1104,127 +1107,127 @@ public CPPNoCastExpressionParser(String[] mapFrom) { // constructor
//
// Rule 233: no_type_declaration_specifier ::= friend
//
case 233: { action. consumeDeclSpecToken(); break;
case 233: { action. consumeToken(); break;
}
//
// Rule 234: no_type_declaration_specifier ::= typedef
//
case 234: { action. consumeDeclSpecToken(); break;
case 234: { action. consumeToken(); break;
}
//
// Rule 254: storage_class_specifier ::= auto
//
case 254: { action. consumeDeclSpecToken(); break;
case 254: { action. consumeToken(); break;
}
//
// Rule 255: storage_class_specifier ::= register
//
case 255: { action. consumeDeclSpecToken(); break;
case 255: { action. consumeToken(); break;
}
//
// Rule 256: storage_class_specifier ::= static
//
case 256: { action. consumeDeclSpecToken(); break;
case 256: { action. consumeToken(); break;
}
//
// Rule 257: storage_class_specifier ::= extern
//
case 257: { action. consumeDeclSpecToken(); break;
case 257: { action. consumeToken(); break;
}
//
// Rule 258: storage_class_specifier ::= mutable
//
case 258: { action. consumeDeclSpecToken(); break;
case 258: { action. consumeToken(); break;
}
//
// Rule 259: function_specifier ::= inline
//
case 259: { action. consumeDeclSpecToken(); break;
case 259: { action. consumeToken(); break;
}
//
// Rule 260: function_specifier ::= virtual
//
case 260: { action. consumeDeclSpecToken(); break;
case 260: { action. consumeToken(); break;
}
//
// Rule 261: function_specifier ::= explicit
//
case 261: { action. consumeDeclSpecToken(); break;
case 261: { action. consumeToken(); break;
}
//
// Rule 262: simple_type_specifier ::= char
//
case 262: { action. consumeDeclSpecToken(); break;
case 262: { action. consumeToken(); break;
}
//
// Rule 263: simple_type_specifier ::= wchar_t
//
case 263: { action. consumeDeclSpecToken(); break;
case 263: { action. consumeToken(); break;
}
//
// Rule 264: simple_type_specifier ::= bool
//
case 264: { action. consumeDeclSpecToken(); break;
case 264: { action. consumeToken(); break;
}
//
// Rule 265: simple_type_specifier ::= short
//
case 265: { action. consumeDeclSpecToken(); break;
case 265: { action. consumeToken(); break;
}
//
// Rule 266: simple_type_specifier ::= int
//
case 266: { action. consumeDeclSpecToken(); break;
case 266: { action. consumeToken(); break;
}
//
// Rule 267: simple_type_specifier ::= long
//
case 267: { action. consumeDeclSpecToken(); break;
case 267: { action. consumeToken(); break;
}
//
// Rule 268: simple_type_specifier ::= signed
//
case 268: { action. consumeDeclSpecToken(); break;
case 268: { action. consumeToken(); break;
}
//
// Rule 269: simple_type_specifier ::= unsigned
//
case 269: { action. consumeDeclSpecToken(); break;
case 269: { action. consumeToken(); break;
}
//
// Rule 270: simple_type_specifier ::= float
//
case 270: { action. consumeDeclSpecToken(); break;
case 270: { action. consumeToken(); break;
}
//
// Rule 271: simple_type_specifier ::= double
//
case 271: { action. consumeDeclSpecToken(); break;
case 271: { action. consumeToken(); break;
}
//
// Rule 272: simple_type_specifier ::= void
//
case 272: { action. consumeDeclSpecToken(); break;
case 272: { action. consumeToken(); break;
}
//
@ -1440,13 +1443,13 @@ public CPPNoCastExpressionParser(String[] mapFrom) { // constructor
//
// Rule 337: cv_qualifier ::= const
//
case 337: { action. consumeDeclSpecToken(); break;
case 337: { action. consumeToken(); break;
}
//
// Rule 338: cv_qualifier ::= volatile
//
case 338: { action. consumeDeclSpecToken(); break;
case 338: { action. consumeToken(); break;
}
//

View file

@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
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.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
@ -166,13 +167,16 @@ public class CPPNoFunctionDeclaratorParser extends PrsStream implements RuleActi
private CPPBuildASTParserAction action;
private ScopedStack<Object> astStack = new ScopedStack<Object>();
public CPPNoFunctionDeclaratorParser() { // constructor
}
private void initActions(IASTTranslationUnit tu, Set<IParser.Options> options) {
action = new CPPBuildASTParserAction ( CPPNodeFactory.getDefault() , this, tu);
action = new CPPBuildASTParserAction ( CPPNodeFactory.getDefault() , this, tu, astStack);
action.setParserOptions(options);
}
@ -200,13 +204,12 @@ public IASTCompletionNode parse(IASTTranslationUnit tu, Set<IParser.Options> opt
}
// uncomment this method to use with backtracking parser
public List getRuleTokens() {
return Collections.unmodifiableList(getTokens().subList(getLeftSpan(), getRightSpan() + 1));
public List<IToken> getRuleTokens() {
return getTokens().subList(getLeftSpan(), getRightSpan() + 1);
}
public IASTNode getSecondaryParseResult() {
return action.getSecondaryParseResult();
return (IASTNode) astStack.pop();
}
public String[] getOrderedTerminalSymbols() {
@ -1110,127 +1113,127 @@ public CPPNoFunctionDeclaratorParser(String[] mapFrom) { // constructor
//
// Rule 234: no_type_declaration_specifier ::= friend
//
case 234: { action. consumeDeclSpecToken(); break;
case 234: { action. consumeToken(); break;
}
//
// Rule 235: no_type_declaration_specifier ::= typedef
//
case 235: { action. consumeDeclSpecToken(); break;
case 235: { action. consumeToken(); break;
}
//
// Rule 255: storage_class_specifier ::= auto
//
case 255: { action. consumeDeclSpecToken(); break;
case 255: { action. consumeToken(); break;
}
//
// Rule 256: storage_class_specifier ::= register
//
case 256: { action. consumeDeclSpecToken(); break;
case 256: { action. consumeToken(); break;
}
//
// Rule 257: storage_class_specifier ::= static
//
case 257: { action. consumeDeclSpecToken(); break;
case 257: { action. consumeToken(); break;
}
//
// Rule 258: storage_class_specifier ::= extern
//
case 258: { action. consumeDeclSpecToken(); break;
case 258: { action. consumeToken(); break;
}
//
// Rule 259: storage_class_specifier ::= mutable
//
case 259: { action. consumeDeclSpecToken(); break;
case 259: { action. consumeToken(); break;
}
//
// Rule 260: function_specifier ::= inline
//
case 260: { action. consumeDeclSpecToken(); break;
case 260: { action. consumeToken(); break;
}
//
// Rule 261: function_specifier ::= virtual
//
case 261: { action. consumeDeclSpecToken(); break;
case 261: { action. consumeToken(); break;
}
//
// Rule 262: function_specifier ::= explicit
//
case 262: { action. consumeDeclSpecToken(); break;
case 262: { action. consumeToken(); break;
}
//
// Rule 263: simple_type_specifier ::= char
//
case 263: { action. consumeDeclSpecToken(); break;
case 263: { action. consumeToken(); break;
}
//
// Rule 264: simple_type_specifier ::= wchar_t
//
case 264: { action. consumeDeclSpecToken(); break;
case 264: { action. consumeToken(); break;
}
//
// Rule 265: simple_type_specifier ::= bool
//
case 265: { action. consumeDeclSpecToken(); break;
case 265: { action. consumeToken(); break;
}
//
// Rule 266: simple_type_specifier ::= short
//
case 266: { action. consumeDeclSpecToken(); break;
case 266: { action. consumeToken(); break;
}
//
// Rule 267: simple_type_specifier ::= int
//
case 267: { action. consumeDeclSpecToken(); break;
case 267: { action. consumeToken(); break;
}
//
// Rule 268: simple_type_specifier ::= long
//
case 268: { action. consumeDeclSpecToken(); break;
case 268: { action. consumeToken(); break;
}
//
// Rule 269: simple_type_specifier ::= signed
//
case 269: { action. consumeDeclSpecToken(); break;
case 269: { action. consumeToken(); break;
}
//
// Rule 270: simple_type_specifier ::= unsigned
//
case 270: { action. consumeDeclSpecToken(); break;
case 270: { action. consumeToken(); break;
}
//
// Rule 271: simple_type_specifier ::= float
//
case 271: { action. consumeDeclSpecToken(); break;
case 271: { action. consumeToken(); break;
}
//
// Rule 272: simple_type_specifier ::= double
//
case 272: { action. consumeDeclSpecToken(); break;
case 272: { action. consumeToken(); break;
}
//
// Rule 273: simple_type_specifier ::= void
//
case 273: { action. consumeDeclSpecToken(); break;
case 273: { action. consumeToken(); break;
}
//
@ -1440,13 +1443,13 @@ public CPPNoFunctionDeclaratorParser(String[] mapFrom) { // constructor
//
// Rule 336: cv_qualifier ::= const
//
case 336: { action. consumeDeclSpecToken(); break;
case 336: { action. consumeToken(); break;
}
//
// Rule 337: cv_qualifier ::= volatile
//
case 337: { action. consumeDeclSpecToken(); break;
case 337: { action. consumeToken(); break;
}
//

View file

@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
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.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
@ -166,13 +167,16 @@ public class CPPParser extends PrsStream implements RuleAction , IParserActionTo
private CPPBuildASTParserAction action;
private ScopedStack<Object> astStack = new ScopedStack<Object>();
public CPPParser() { // constructor
}
private void initActions(IASTTranslationUnit tu, Set<IParser.Options> options) {
action = new CPPBuildASTParserAction ( CPPNodeFactory.getDefault() , this, tu);
action = new CPPBuildASTParserAction ( CPPNodeFactory.getDefault() , this, tu, astStack);
action.setParserOptions(options);
}
@ -200,13 +204,12 @@ public IASTCompletionNode parse(IASTTranslationUnit tu, Set<IParser.Options> opt
}
// uncomment this method to use with backtracking parser
public List getRuleTokens() {
return Collections.unmodifiableList(getTokens().subList(getLeftSpan(), getRightSpan() + 1));
public List<IToken> getRuleTokens() {
return getTokens().subList(getLeftSpan(), getRightSpan() + 1);
}
public IASTNode getSecondaryParseResult() {
return action.getSecondaryParseResult();
return (IASTNode) astStack.pop();
}
public String[] getOrderedTerminalSymbols() {
@ -1110,127 +1113,127 @@ public CPPParser(String[] mapFrom) { // constructor
//
// Rule 234: no_type_declaration_specifier ::= friend
//
case 234: { action. consumeDeclSpecToken(); break;
case 234: { action. consumeToken(); break;
}
//
// Rule 235: no_type_declaration_specifier ::= typedef
//
case 235: { action. consumeDeclSpecToken(); break;
case 235: { action. consumeToken(); break;
}
//
// Rule 255: storage_class_specifier ::= auto
//
case 255: { action. consumeDeclSpecToken(); break;
case 255: { action. consumeToken(); break;
}
//
// Rule 256: storage_class_specifier ::= register
//
case 256: { action. consumeDeclSpecToken(); break;
case 256: { action. consumeToken(); break;
}
//
// Rule 257: storage_class_specifier ::= static
//
case 257: { action. consumeDeclSpecToken(); break;
case 257: { action. consumeToken(); break;
}
//
// Rule 258: storage_class_specifier ::= extern
//
case 258: { action. consumeDeclSpecToken(); break;
case 258: { action. consumeToken(); break;
}
//
// Rule 259: storage_class_specifier ::= mutable
//
case 259: { action. consumeDeclSpecToken(); break;
case 259: { action. consumeToken(); break;
}
//
// Rule 260: function_specifier ::= inline
//
case 260: { action. consumeDeclSpecToken(); break;
case 260: { action. consumeToken(); break;
}
//
// Rule 261: function_specifier ::= virtual
//
case 261: { action. consumeDeclSpecToken(); break;
case 261: { action. consumeToken(); break;
}
//
// Rule 262: function_specifier ::= explicit
//
case 262: { action. consumeDeclSpecToken(); break;
case 262: { action. consumeToken(); break;
}
//
// Rule 263: simple_type_specifier ::= char
//
case 263: { action. consumeDeclSpecToken(); break;
case 263: { action. consumeToken(); break;
}
//
// Rule 264: simple_type_specifier ::= wchar_t
//
case 264: { action. consumeDeclSpecToken(); break;
case 264: { action. consumeToken(); break;
}
//
// Rule 265: simple_type_specifier ::= bool
//
case 265: { action. consumeDeclSpecToken(); break;
case 265: { action. consumeToken(); break;
}
//
// Rule 266: simple_type_specifier ::= short
//
case 266: { action. consumeDeclSpecToken(); break;
case 266: { action. consumeToken(); break;
}
//
// Rule 267: simple_type_specifier ::= int
//
case 267: { action. consumeDeclSpecToken(); break;
case 267: { action. consumeToken(); break;
}
//
// Rule 268: simple_type_specifier ::= long
//
case 268: { action. consumeDeclSpecToken(); break;
case 268: { action. consumeToken(); break;
}
//
// Rule 269: simple_type_specifier ::= signed
//
case 269: { action. consumeDeclSpecToken(); break;
case 269: { action. consumeToken(); break;
}
//
// Rule 270: simple_type_specifier ::= unsigned
//
case 270: { action. consumeDeclSpecToken(); break;
case 270: { action. consumeToken(); break;
}
//
// Rule 271: simple_type_specifier ::= float
//
case 271: { action. consumeDeclSpecToken(); break;
case 271: { action. consumeToken(); break;
}
//
// Rule 272: simple_type_specifier ::= double
//
case 272: { action. consumeDeclSpecToken(); break;
case 272: { action. consumeToken(); break;
}
//
// Rule 273: simple_type_specifier ::= void
//
case 273: { action. consumeDeclSpecToken(); break;
case 273: { action. consumeToken(); break;
}
//
@ -1446,13 +1449,13 @@ public CPPParser(String[] mapFrom) { // constructor
//
// Rule 338: cv_qualifier ::= const
//
case 338: { action. consumeDeclSpecToken(); break;
case 338: { action. consumeToken(); break;
}
//
// Rule 339: cv_qualifier ::= volatile
//
case 339: { action. consumeDeclSpecToken(); break;
case 339: { action. consumeToken(); break;
}
//

View file

@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
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.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
@ -166,13 +167,16 @@ public class CPPSizeofExpressionParser extends PrsStream implements RuleAction ,
private CPPBuildASTParserAction action;
private ScopedStack<Object> astStack = new ScopedStack<Object>();
public CPPSizeofExpressionParser() { // constructor
}
private void initActions(IASTTranslationUnit tu, Set<IParser.Options> options) {
action = new CPPBuildASTParserAction ( CPPNodeFactory.getDefault() , this, tu);
action = new CPPBuildASTParserAction ( CPPNodeFactory.getDefault() , this, tu, astStack);
action.setParserOptions(options);
}
@ -200,13 +204,12 @@ public IASTCompletionNode parse(IASTTranslationUnit tu, Set<IParser.Options> opt
}
// uncomment this method to use with backtracking parser
public List getRuleTokens() {
return Collections.unmodifiableList(getTokens().subList(getLeftSpan(), getRightSpan() + 1));
public List<IToken> getRuleTokens() {
return getTokens().subList(getLeftSpan(), getRightSpan() + 1);
}
public IASTNode getSecondaryParseResult() {
return action.getSecondaryParseResult();
return (IASTNode) astStack.pop();
}
public String[] getOrderedTerminalSymbols() {
@ -1098,127 +1101,127 @@ public CPPSizeofExpressionParser(String[] mapFrom) { // constructor
//
// Rule 232: no_type_declaration_specifier ::= friend
//
case 232: { action. consumeDeclSpecToken(); break;
case 232: { action. consumeToken(); break;
}
//
// Rule 233: no_type_declaration_specifier ::= typedef
//
case 233: { action. consumeDeclSpecToken(); break;
case 233: { action. consumeToken(); break;
}
//
// Rule 253: storage_class_specifier ::= auto
//
case 253: { action. consumeDeclSpecToken(); break;
case 253: { action. consumeToken(); break;
}
//
// Rule 254: storage_class_specifier ::= register
//
case 254: { action. consumeDeclSpecToken(); break;
case 254: { action. consumeToken(); break;
}
//
// Rule 255: storage_class_specifier ::= static
//
case 255: { action. consumeDeclSpecToken(); break;
case 255: { action. consumeToken(); break;
}
//
// Rule 256: storage_class_specifier ::= extern
//
case 256: { action. consumeDeclSpecToken(); break;
case 256: { action. consumeToken(); break;
}
//
// Rule 257: storage_class_specifier ::= mutable
//
case 257: { action. consumeDeclSpecToken(); break;
case 257: { action. consumeToken(); break;
}
//
// Rule 258: function_specifier ::= inline
//
case 258: { action. consumeDeclSpecToken(); break;
case 258: { action. consumeToken(); break;
}
//
// Rule 259: function_specifier ::= virtual
//
case 259: { action. consumeDeclSpecToken(); break;
case 259: { action. consumeToken(); break;
}
//
// Rule 260: function_specifier ::= explicit
//
case 260: { action. consumeDeclSpecToken(); break;
case 260: { action. consumeToken(); break;
}
//
// Rule 261: simple_type_specifier ::= char
//
case 261: { action. consumeDeclSpecToken(); break;
case 261: { action. consumeToken(); break;
}
//
// Rule 262: simple_type_specifier ::= wchar_t
//
case 262: { action. consumeDeclSpecToken(); break;
case 262: { action. consumeToken(); break;
}
//
// Rule 263: simple_type_specifier ::= bool
//
case 263: { action. consumeDeclSpecToken(); break;
case 263: { action. consumeToken(); break;
}
//
// Rule 264: simple_type_specifier ::= short
//
case 264: { action. consumeDeclSpecToken(); break;
case 264: { action. consumeToken(); break;
}
//
// Rule 265: simple_type_specifier ::= int
//
case 265: { action. consumeDeclSpecToken(); break;
case 265: { action. consumeToken(); break;
}
//
// Rule 266: simple_type_specifier ::= long
//
case 266: { action. consumeDeclSpecToken(); break;
case 266: { action. consumeToken(); break;
}
//
// Rule 267: simple_type_specifier ::= signed
//
case 267: { action. consumeDeclSpecToken(); break;
case 267: { action. consumeToken(); break;
}
//
// Rule 268: simple_type_specifier ::= unsigned
//
case 268: { action. consumeDeclSpecToken(); break;
case 268: { action. consumeToken(); break;
}
//
// Rule 269: simple_type_specifier ::= float
//
case 269: { action. consumeDeclSpecToken(); break;
case 269: { action. consumeToken(); break;
}
//
// Rule 270: simple_type_specifier ::= double
//
case 270: { action. consumeDeclSpecToken(); break;
case 270: { action. consumeToken(); break;
}
//
// Rule 271: simple_type_specifier ::= void
//
case 271: { action. consumeDeclSpecToken(); break;
case 271: { action. consumeToken(); break;
}
//
@ -1434,13 +1437,13 @@ public CPPSizeofExpressionParser(String[] mapFrom) { // constructor
//
// Rule 336: cv_qualifier ::= const
//
case 336: { action. consumeDeclSpecToken(); break;
case 336: { action. consumeToken(); break;
}
//
// Rule 337: cv_qualifier ::= volatile
//
case 337: { action. consumeDeclSpecToken(); break;
case 337: { action. consumeToken(); break;
}
//

View file

@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
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.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
@ -166,13 +167,16 @@ public class CPPTemplateTypeParameterParser extends PrsStream implements RuleAct
private CPPBuildASTParserAction action;
private ScopedStack<Object> astStack = new ScopedStack<Object>();
public CPPTemplateTypeParameterParser() { // constructor
}
private void initActions(IASTTranslationUnit tu, Set<IParser.Options> options) {
action = new CPPBuildASTParserAction ( CPPNodeFactory.getDefault() , this, tu);
action = new CPPBuildASTParserAction ( CPPNodeFactory.getDefault() , this, tu, astStack);
action.setParserOptions(options);
}
@ -200,13 +204,12 @@ public IASTCompletionNode parse(IASTTranslationUnit tu, Set<IParser.Options> opt
}
// uncomment this method to use with backtracking parser
public List getRuleTokens() {
return Collections.unmodifiableList(getTokens().subList(getLeftSpan(), getRightSpan() + 1));
public List<IToken> getRuleTokens() {
return getTokens().subList(getLeftSpan(), getRightSpan() + 1);
}
public IASTNode getSecondaryParseResult() {
return action.getSecondaryParseResult();
return (IASTNode) astStack.pop();
}
public String[] getOrderedTerminalSymbols() {
@ -1110,127 +1113,127 @@ public CPPTemplateTypeParameterParser(String[] mapFrom) { // constructor
//
// Rule 234: no_type_declaration_specifier ::= friend
//
case 234: { action. consumeDeclSpecToken(); break;
case 234: { action. consumeToken(); break;
}
//
// Rule 235: no_type_declaration_specifier ::= typedef
//
case 235: { action. consumeDeclSpecToken(); break;
case 235: { action. consumeToken(); break;
}
//
// Rule 255: storage_class_specifier ::= auto
//
case 255: { action. consumeDeclSpecToken(); break;
case 255: { action. consumeToken(); break;
}
//
// Rule 256: storage_class_specifier ::= register
//
case 256: { action. consumeDeclSpecToken(); break;
case 256: { action. consumeToken(); break;
}
//
// Rule 257: storage_class_specifier ::= static
//
case 257: { action. consumeDeclSpecToken(); break;
case 257: { action. consumeToken(); break;
}
//
// Rule 258: storage_class_specifier ::= extern
//
case 258: { action. consumeDeclSpecToken(); break;
case 258: { action. consumeToken(); break;
}
//
// Rule 259: storage_class_specifier ::= mutable
//
case 259: { action. consumeDeclSpecToken(); break;
case 259: { action. consumeToken(); break;
}
//
// Rule 260: function_specifier ::= inline
//
case 260: { action. consumeDeclSpecToken(); break;
case 260: { action. consumeToken(); break;
}
//
// Rule 261: function_specifier ::= virtual
//
case 261: { action. consumeDeclSpecToken(); break;
case 261: { action. consumeToken(); break;
}
//
// Rule 262: function_specifier ::= explicit
//
case 262: { action. consumeDeclSpecToken(); break;
case 262: { action. consumeToken(); break;
}
//
// Rule 263: simple_type_specifier ::= char
//
case 263: { action. consumeDeclSpecToken(); break;
case 263: { action. consumeToken(); break;
}
//
// Rule 264: simple_type_specifier ::= wchar_t
//
case 264: { action. consumeDeclSpecToken(); break;
case 264: { action. consumeToken(); break;
}
//
// Rule 265: simple_type_specifier ::= bool
//
case 265: { action. consumeDeclSpecToken(); break;
case 265: { action. consumeToken(); break;
}
//
// Rule 266: simple_type_specifier ::= short
//
case 266: { action. consumeDeclSpecToken(); break;
case 266: { action. consumeToken(); break;
}
//
// Rule 267: simple_type_specifier ::= int
//
case 267: { action. consumeDeclSpecToken(); break;
case 267: { action. consumeToken(); break;
}
//
// Rule 268: simple_type_specifier ::= long
//
case 268: { action. consumeDeclSpecToken(); break;
case 268: { action. consumeToken(); break;
}
//
// Rule 269: simple_type_specifier ::= signed
//
case 269: { action. consumeDeclSpecToken(); break;
case 269: { action. consumeToken(); break;
}
//
// Rule 270: simple_type_specifier ::= unsigned
//
case 270: { action. consumeDeclSpecToken(); break;
case 270: { action. consumeToken(); break;
}
//
// Rule 271: simple_type_specifier ::= float
//
case 271: { action. consumeDeclSpecToken(); break;
case 271: { action. consumeToken(); break;
}
//
// Rule 272: simple_type_specifier ::= double
//
case 272: { action. consumeDeclSpecToken(); break;
case 272: { action. consumeToken(); break;
}
//
// Rule 273: simple_type_specifier ::= void
//
case 273: { action. consumeDeclSpecToken(); break;
case 273: { action. consumeToken(); break;
}
//
@ -1446,13 +1449,13 @@ public CPPTemplateTypeParameterParser(String[] mapFrom) { // constructor
//
// Rule 338: cv_qualifier ::= const
//
case 338: { action. consumeDeclSpecToken(); break;
case 338: { action. consumeToken(); break;
}
//
// Rule 339: cv_qualifier ::= volatile
//
case 339: { action. consumeDeclSpecToken(); break;
case 339: { action. consumeToken(); break;
}
//

View file

@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
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.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
@ -27,6 +28,8 @@ import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
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.gcc.GCCBuildASTParserAction;
public class GCCParser extends PrsStream implements RuleAction , IParserActionTokenProvider, IParser
{
private static ParseTable prs = new GCCParserprs();
@ -165,13 +168,21 @@ public class GCCParser extends PrsStream implements RuleAction , IParserActionTo
private C99BuildASTParserAction action;
private ScopedStack<Object> astStack = new ScopedStack<Object>();
public GCCParser() { // constructor
}
private void initActions(IASTTranslationUnit tu, Set<IParser.Options> options) {
action = new C99BuildASTParserAction ( CNodeFactory.getDefault() , this, tu);
action = new C99BuildASTParserAction ( CNodeFactory.getDefault() , this, tu, astStack);
action.setParserOptions(options);
gccAction = new GCCBuildASTParserAction( CNodeFactory.getDefault() , this, tu, astStack);
gccAction.setParserOptions(options);
}
@ -199,13 +210,12 @@ public IASTCompletionNode parse(IASTTranslationUnit tu, Set<IParser.Options> opt
}
// uncomment this method to use with backtracking parser
public List getRuleTokens() {
return Collections.unmodifiableList(getTokens().subList(getLeftSpan(), getRightSpan() + 1));
public List<IToken> getRuleTokens() {
return getTokens().subList(getLeftSpan(), getRightSpan() + 1);
}
public IASTNode getSecondaryParseResult() {
return action.getSecondaryParseResult();
return (IASTNode) astStack.pop();
}
public String[] getOrderedTerminalSymbols() {
@ -237,6 +247,8 @@ public GCCParser(String[] mapFrom) { // constructor
private GCCBuildASTParserAction gccAction;
public void ruleAction(int ruleNumber)
{
switch (ruleNumber)
@ -767,25 +779,25 @@ public GCCParser(String[] mapFrom) { // constructor
//
// Rule 159: storage_class_specifier ::= storage_class_specifier_token
//
case 159: { action. consumeDeclSpecToken(); break;
case 159: { action. consumeToken(); break;
}
//
// Rule 165: simple_type_specifier ::= simple_type_specifier_token
//
case 165: { action. consumeDeclSpecToken(); break;
case 165: { action. consumeToken(); break;
}
//
// Rule 178: typedef_name_in_declspec ::= Completion
//
case 178: { action. consumeDeclSpecToken(); break;
case 178: { action. consumeToken(); break;
}
//
// Rule 179: typedef_name_in_declspec ::= identifier
//
case 179: { action. consumeDeclSpecToken(); break;
case 179: { action. consumeToken(); break;
}
//
@ -875,13 +887,13 @@ public GCCParser(String[] mapFrom) { // constructor
//
// Rule 215: type_qualifier ::= type_qualifier_token
//
case 215: { action. consumeDeclSpecToken(); break;
case 215: { action. consumeToken(); break;
}
//
// Rule 219: function_specifier ::= inline
//
case 219: { action. consumeDeclSpecToken(); break;
case 219: { action. consumeToken(); break;
}
//
@ -1261,6 +1273,12 @@ public GCCParser(String[] mapFrom) { // constructor
//
case 331: { action. consumeIgnore(); break;
}
//
// Rule 341: extended_asm_declaration ::= asm volatile_opt ( extended_asm_param_seq ) ;
//
case 341: { gccAction.consumeDeclarationASM(); break;
}
default:

View file

@ -16,61 +16,61 @@ package org.eclipse.cdt.internal.core.dom.lrparser.gcc;
public interface GCCParsersym {
public final static int
TK_auto = 27,
TK_break = 34,
TK_case = 35,
TK_break = 35,
TK_case = 36,
TK_char = 46,
TK_const = 22,
TK_continue = 36,
TK_default = 37,
TK_do = 38,
TK_continue = 37,
TK_default = 38,
TK_do = 39,
TK_double = 47,
TK_else = 82,
TK_enum = 58,
TK_enum = 59,
TK_extern = 28,
TK_float = 48,
TK_for = 39,
TK_goto = 40,
TK_if = 41,
TK_for = 40,
TK_goto = 41,
TK_if = 42,
TK_inline = 29,
TK_int = 49,
TK_long = 50,
TK_register = 30,
TK_restrict = 23,
TK_return = 42,
TK_restrict = 25,
TK_return = 43,
TK_short = 51,
TK_signed = 52,
TK_sizeof = 16,
TK_static = 26,
TK_struct = 59,
TK_switch = 43,
TK_struct = 60,
TK_switch = 44,
TK_typedef = 31,
TK_union = 60,
TK_union = 61,
TK_unsigned = 53,
TK_void = 54,
TK_volatile = 24,
TK_while = 33,
TK_volatile = 23,
TK_while = 34,
TK__Bool = 55,
TK__Complex = 56,
TK__Imaginary = 57,
TK_integer = 17,
TK_floating = 18,
TK_charconst = 19,
TK_stringlit = 13,
TK_stringlit = 10,
TK_identifier = 1,
TK_Completion = 7,
TK_EndOfCompletion = 3,
TK_Invalid = 96,
TK_LeftBracket = 44,
TK_LeftBracket = 45,
TK_LeftParen = 2,
TK_LeftBrace = 9,
TK_Dot = 69,
TK_Arrow = 83,
TK_PlusPlus = 14,
TK_MinusMinus = 15,
TK_And = 12,
TK_And = 13,
TK_Star = 8,
TK_Plus = 10,
TK_Minus = 11,
TK_Plus = 11,
TK_Minus = 12,
TK_Tilde = 20,
TK_Bang = 21,
TK_Slash = 70,
@ -88,7 +88,7 @@ public interface GCCParsersym {
TK_AndAnd = 81,
TK_OrOr = 84,
TK_Question = 85,
TK_Colon = 63,
TK_Colon = 62,
TK_DotDotDot = 67,
TK_Assign = 64,
TK_StarAssign = 86,
@ -101,18 +101,18 @@ public interface GCCParsersym {
TK_AndAssign = 93,
TK_CaretAssign = 94,
TK_OrAssign = 95,
TK_Comma = 61,
TK_Comma = 58,
TK_RightBracket = 68,
TK_RightParen = 45,
TK_RightBrace = 62,
TK_SemiColon = 25,
TK_RightParen = 33,
TK_RightBrace = 63,
TK_SemiColon = 24,
TK_typeof = 97,
TK___alignof__ = 98,
TK_MAX = 99,
TK_MIN = 100,
TK___attribute__ = 4,
TK___declspec = 5,
TK_asm = 6,
TK___attribute__ = 5,
TK___declspec = 6,
TK_asm = 4,
TK_ERROR_TOKEN = 32,
TK_EOF_TOKEN = 76;
@ -121,16 +121,16 @@ public interface GCCParsersym {
"identifier",
"LeftParen",
"EndOfCompletion",
"asm",
"__attribute__",
"__declspec",
"asm",
"Completion",
"Star",
"LeftBrace",
"stringlit",
"Plus",
"Minus",
"And",
"stringlit",
"PlusPlus",
"MinusMinus",
"sizeof",
@ -140,9 +140,9 @@ public interface GCCParsersym {
"Tilde",
"Bang",
"const",
"restrict",
"volatile",
"SemiColon",
"restrict",
"static",
"auto",
"extern",
@ -150,6 +150,7 @@ public interface GCCParsersym {
"register",
"typedef",
"ERROR_TOKEN",
"RightParen",
"while",
"break",
"case",
@ -162,7 +163,6 @@ public interface GCCParsersym {
"return",
"switch",
"LeftBracket",
"RightParen",
"char",
"double",
"float",
@ -175,12 +175,12 @@ public interface GCCParsersym {
"_Bool",
"_Complex",
"_Imaginary",
"Comma",
"enum",
"struct",
"union",
"Comma",
"RightBrace",
"Colon",
"RightBrace",
"Assign",
"RightShift",
"LeftShift",

View file

@ -27,7 +27,7 @@ public interface GPPParsersym {
TK_const_cast = 46,
TK_continue = 81,
TK_default = 82,
TK_delete = 68,
TK_delete = 70,
TK_do = 83,
TK_double = 16,
TK_dynamic_cast = 47,
@ -47,8 +47,8 @@ public interface GPPParsersym {
TK_long = 19,
TK_mutable = 34,
TK_namespace = 63,
TK_new = 69,
TK_operator = 9,
TK_new = 71,
TK_operator = 10,
TK_private = 105,
TK_protected = 106,
TK_public = 107,
@ -75,7 +75,7 @@ public interface GPPParsersym {
TK_using = 65,
TK_virtual = 26,
TK_void = 23,
TK_volatile = 28,
TK_volatile = 27,
TK_wchar_t = 24,
TK_while = 78,
TK_integer = 55,
@ -84,7 +84,7 @@ public interface GPPParsersym {
TK_stringlit = 40,
TK_identifier = 1,
TK_Completion = 2,
TK_EndOfCompletion = 10,
TK_EndOfCompletion = 9,
TK_Invalid = 125,
TK_LeftBracket = 67,
TK_LeftParen = 3,
@ -115,7 +115,7 @@ public interface GPPParsersym {
TK_AndAnd = 103,
TK_OrOr = 104,
TK_Question = 109,
TK_Colon = 74,
TK_Colon = 73,
TK_ColonColon = 4,
TK_DotDotDot = 92,
TK_Assign = 75,
@ -129,12 +129,12 @@ public interface GPPParsersym {
TK_AndAssign = 117,
TK_CaretAssign = 118,
TK_OrAssign = 119,
TK_Comma = 70,
TK_Comma = 69,
TK_RightBracket = 120,
TK_RightParen = 71,
TK_RightParen = 68,
TK_RightBrace = 76,
TK_SemiColon = 27,
TK_LeftBrace = 73,
TK_SemiColon = 28,
TK_LeftBrace = 74,
TK_typeof = 126,
TK___alignof__ = 127,
TK_MAX = 128,
@ -155,8 +155,8 @@ public interface GPPParsersym {
"__attribute__",
"__declspec",
"Tilde",
"operator",
"EndOfCompletion",
"operator",
"Star",
"And",
"typename",
@ -173,8 +173,8 @@ public interface GPPParsersym {
"wchar_t",
"const",
"virtual",
"SemiColon",
"volatile",
"SemiColon",
"auto",
"explicit",
"extern",
@ -214,13 +214,13 @@ public interface GPPParsersym {
"using",
"ERROR_TOKEN",
"LeftBracket",
"RightParen",
"Comma",
"delete",
"new",
"Comma",
"RightParen",
"GT",
"LeftBrace",
"Colon",
"LeftBrace",
"Assign",
"RightBrace",
"try",

View file

@ -23,6 +23,7 @@ import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
import org.eclipse.cdt.core.dom.ast.c.ICASTDeclSpecifier;
import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
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.upc.ast.IUPCASTDeclSpecifier;
import org.eclipse.cdt.core.dom.upc.ast.IUPCASTForallStatement;
@ -48,8 +49,8 @@ public class UPCParserAction extends C99BuildASTParserAction {
* @param parser
* @param tu
*/
public UPCParserAction(UPCASTNodeFactory nodeFactory, IParserActionTokenProvider parser, IASTTranslationUnit tu) {
super(nodeFactory, parser, tu);
public UPCParserAction(UPCASTNodeFactory nodeFactory, IParserActionTokenProvider parser, IASTTranslationUnit tu, ScopedStack<Object> astStack) {
super(nodeFactory, parser, tu, astStack);
this.nodeFactory = nodeFactory;
nodeFactory.setUseC99SizeofExpressions();
}

View file

@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
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.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
@ -172,13 +173,16 @@ public class UPCExpressionParser extends PrsStream implements RuleAction , IPars
private UPCParserAction action;
private ScopedStack<Object> astStack = new ScopedStack<Object>();
public UPCExpressionParser() { // constructor
}
private void initActions(IASTTranslationUnit tu, Set<IParser.Options> options) {
action = new UPCParserAction ( UPCASTNodeFactory.DEFAULT_INSTANCE , this, tu);
action = new UPCParserAction ( UPCASTNodeFactory.DEFAULT_INSTANCE , this, tu, astStack);
action.setParserOptions(options);
}
@ -206,13 +210,12 @@ public IASTCompletionNode parse(IASTTranslationUnit tu, Set<IParser.Options> opt
}
// uncomment this method to use with backtracking parser
public List getRuleTokens() {
return Collections.unmodifiableList(getTokens().subList(getLeftSpan(), getRightSpan() + 1));
public List<IToken> getRuleTokens() {
return getTokens().subList(getLeftSpan(), getRightSpan() + 1);
}
public IASTNode getSecondaryParseResult() {
return action.getSecondaryParseResult();
return (IASTNode) astStack.pop();
}
public String[] getOrderedTerminalSymbols() {
@ -774,25 +777,25 @@ public UPCExpressionParser(String[] mapFrom) { // constructor
//
// Rule 159: storage_class_specifier ::= storage_class_specifier_token
//
case 159: { action. consumeDeclSpecToken(); break;
case 159: { action. consumeToken(); break;
}
//
// Rule 165: simple_type_specifier ::= simple_type_specifier_token
//
case 165: { action. consumeDeclSpecToken(); break;
case 165: { action. consumeToken(); break;
}
//
// Rule 178: typedef_name_in_declspec ::= Completion
//
case 178: { action. consumeDeclSpecToken(); break;
case 178: { action. consumeToken(); break;
}
//
// Rule 179: typedef_name_in_declspec ::= identifier
//
case 179: { action. consumeDeclSpecToken(); break;
case 179: { action. consumeToken(); break;
}
//
@ -882,13 +885,13 @@ public UPCExpressionParser(String[] mapFrom) { // constructor
//
// Rule 215: type_qualifier ::= type_qualifier_token
//
case 215: { action. consumeDeclSpecToken(); break;
case 215: { action. consumeToken(); break;
}
//
// Rule 219: function_specifier ::= inline
//
case 219: { action. consumeDeclSpecToken(); break;
case 219: { action. consumeToken(); break;
}
//

View file

@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
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.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
@ -172,13 +173,16 @@ public class UPCNoCastExpressionParser extends PrsStream implements RuleAction ,
private UPCParserAction action;
private ScopedStack<Object> astStack = new ScopedStack<Object>();
public UPCNoCastExpressionParser() { // constructor
}
private void initActions(IASTTranslationUnit tu, Set<IParser.Options> options) {
action = new UPCParserAction ( UPCASTNodeFactory.DEFAULT_INSTANCE , this, tu);
action = new UPCParserAction ( UPCASTNodeFactory.DEFAULT_INSTANCE , this, tu, astStack);
action.setParserOptions(options);
}
@ -206,13 +210,12 @@ public IASTCompletionNode parse(IASTTranslationUnit tu, Set<IParser.Options> opt
}
// uncomment this method to use with backtracking parser
public List getRuleTokens() {
return Collections.unmodifiableList(getTokens().subList(getLeftSpan(), getRightSpan() + 1));
public List<IToken> getRuleTokens() {
return getTokens().subList(getLeftSpan(), getRightSpan() + 1);
}
public IASTNode getSecondaryParseResult() {
return action.getSecondaryParseResult();
return (IASTNode) astStack.pop();
}
public String[] getOrderedTerminalSymbols() {
@ -768,25 +771,25 @@ public UPCNoCastExpressionParser(String[] mapFrom) { // constructor
//
// Rule 158: storage_class_specifier ::= storage_class_specifier_token
//
case 158: { action. consumeDeclSpecToken(); break;
case 158: { action. consumeToken(); break;
}
//
// Rule 164: simple_type_specifier ::= simple_type_specifier_token
//
case 164: { action. consumeDeclSpecToken(); break;
case 164: { action. consumeToken(); break;
}
//
// Rule 177: typedef_name_in_declspec ::= Completion
//
case 177: { action. consumeDeclSpecToken(); break;
case 177: { action. consumeToken(); break;
}
//
// Rule 178: typedef_name_in_declspec ::= identifier
//
case 178: { action. consumeDeclSpecToken(); break;
case 178: { action. consumeToken(); break;
}
//
@ -876,13 +879,13 @@ public UPCNoCastExpressionParser(String[] mapFrom) { // constructor
//
// Rule 214: type_qualifier ::= type_qualifier_token
//
case 214: { action. consumeDeclSpecToken(); break;
case 214: { action. consumeToken(); break;
}
//
// Rule 218: function_specifier ::= inline
//
case 218: { action. consumeDeclSpecToken(); break;
case 218: { action. consumeToken(); break;
}
//

View file

@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
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.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
@ -172,13 +173,16 @@ public class UPCParser extends PrsStream implements RuleAction , IParserActionTo
private UPCParserAction action;
private ScopedStack<Object> astStack = new ScopedStack<Object>();
public UPCParser() { // constructor
}
private void initActions(IASTTranslationUnit tu, Set<IParser.Options> options) {
action = new UPCParserAction ( UPCASTNodeFactory.DEFAULT_INSTANCE , this, tu);
action = new UPCParserAction ( UPCASTNodeFactory.DEFAULT_INSTANCE , this, tu, astStack);
action.setParserOptions(options);
}
@ -206,13 +210,12 @@ public IASTCompletionNode parse(IASTTranslationUnit tu, Set<IParser.Options> opt
}
// uncomment this method to use with backtracking parser
public List getRuleTokens() {
return Collections.unmodifiableList(getTokens().subList(getLeftSpan(), getRightSpan() + 1));
public List<IToken> getRuleTokens() {
return getTokens().subList(getLeftSpan(), getRightSpan() + 1);
}
public IASTNode getSecondaryParseResult() {
return action.getSecondaryParseResult();
return (IASTNode) astStack.pop();
}
public String[] getOrderedTerminalSymbols() {
@ -774,25 +777,25 @@ public UPCParser(String[] mapFrom) { // constructor
//
// Rule 159: storage_class_specifier ::= storage_class_specifier_token
//
case 159: { action. consumeDeclSpecToken(); break;
case 159: { action. consumeToken(); break;
}
//
// Rule 165: simple_type_specifier ::= simple_type_specifier_token
//
case 165: { action. consumeDeclSpecToken(); break;
case 165: { action. consumeToken(); break;
}
//
// Rule 178: typedef_name_in_declspec ::= Completion
//
case 178: { action. consumeDeclSpecToken(); break;
case 178: { action. consumeToken(); break;
}
//
// Rule 179: typedef_name_in_declspec ::= identifier
//
case 179: { action. consumeDeclSpecToken(); break;
case 179: { action. consumeToken(); break;
}
//
@ -882,13 +885,13 @@ public UPCParser(String[] mapFrom) { // constructor
//
// Rule 215: type_qualifier ::= type_qualifier_token
//
case 215: { action. consumeDeclSpecToken(); break;
case 215: { action. consumeToken(); break;
}
//
// Rule 219: function_specifier ::= inline
//
case 219: { action. consumeDeclSpecToken(); break;
case 219: { action. consumeToken(); break;
}
//

View file

@ -20,6 +20,7 @@ import org.eclipse.cdt.core.dom.ast.*;
import org.eclipse.cdt.core.dom.lrparser.IParser;
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
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.ITokenMap;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
@ -172,13 +173,16 @@ public class UPCSizeofExpressionParser extends PrsStream implements RuleAction ,
private UPCParserAction action;
private ScopedStack<Object> astStack = new ScopedStack<Object>();
public UPCSizeofExpressionParser() { // constructor
}
private void initActions(IASTTranslationUnit tu, Set<IParser.Options> options) {
action = new UPCParserAction ( UPCASTNodeFactory.DEFAULT_INSTANCE , this, tu);
action = new UPCParserAction ( UPCASTNodeFactory.DEFAULT_INSTANCE , this, tu, astStack);
action.setParserOptions(options);
}
@ -206,13 +210,12 @@ public IASTCompletionNode parse(IASTTranslationUnit tu, Set<IParser.Options> opt
}
// uncomment this method to use with backtracking parser
public List getRuleTokens() {
return Collections.unmodifiableList(getTokens().subList(getLeftSpan(), getRightSpan() + 1));
public List<IToken> getRuleTokens() {
return getTokens().subList(getLeftSpan(), getRightSpan() + 1);
}
public IASTNode getSecondaryParseResult() {
return action.getSecondaryParseResult();
return (IASTNode) astStack.pop();
}
public String[] getOrderedTerminalSymbols() {
@ -768,25 +771,25 @@ public UPCSizeofExpressionParser(String[] mapFrom) { // constructor
//
// Rule 158: storage_class_specifier ::= storage_class_specifier_token
//
case 158: { action. consumeDeclSpecToken(); break;
case 158: { action. consumeToken(); break;
}
//
// Rule 164: simple_type_specifier ::= simple_type_specifier_token
//
case 164: { action. consumeDeclSpecToken(); break;
case 164: { action. consumeToken(); break;
}
//
// Rule 177: typedef_name_in_declspec ::= Completion
//
case 177: { action. consumeDeclSpecToken(); break;
case 177: { action. consumeToken(); break;
}
//
// Rule 178: typedef_name_in_declspec ::= identifier
//
case 178: { action. consumeDeclSpecToken(); break;
case 178: { action. consumeToken(); break;
}
//
@ -876,13 +879,13 @@ public UPCSizeofExpressionParser(String[] mapFrom) { // constructor
//
// Rule 214: type_qualifier ::= type_qualifier_token
//
case 214: { action. consumeDeclSpecToken(); break;
case 214: { action. consumeToken(); break;
}
//
// Rule 218: function_specifier ::= inline
//
case 218: { action. consumeDeclSpecToken(); break;
case 218: { action. consumeToken(); break;
}
//