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:
parent
d52e5c0f1c
commit
7f0debb02e
36 changed files with 4701 additions and 4391 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
--
|
|
@ -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());
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
@ -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:
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -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",
|
||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -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",
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
//
|
||||
|
|
Loading…
Add table
Reference in a new issue