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

AST building actions for function definitions

This commit is contained in:
Mike Kucera 2008-01-23 23:09:37 +00:00
parent c3565edec0
commit 31652900d1
7 changed files with 2022 additions and 1915 deletions

View file

@ -65,11 +65,13 @@ import org.eclipse.cdt.core.dom.ast.IASTWhileStatement;
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCatchHandler;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorInitializer;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConversionName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeleteExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExplicitTemplateInstantiation;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionTryBlockDeclarator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLinkageSpecification;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias;
@ -104,6 +106,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTCatchHandler;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTCompositeTypeSpecifier;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTCompoundStatement;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTConditionalExpression;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTConstructorChainInitializer;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTConstructorInitializer;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTContinueStatement;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTConversionName;
@ -123,6 +126,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTForStatement;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTFunctionCallExpression;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTFunctionDeclarator;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTFunctionDefinition;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTFunctionTryBlockDeclarator;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTGotoStatement;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTIdExpression;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTIfStatement;
@ -503,4 +507,12 @@ public class CPPASTNodeFactory implements ICPPASTNodeFactory {
return new CPPASTParameterDeclaration(declSpec, declarator);
}
public ICPPASTConstructorChainInitializer newConstructorChainInitializer(IASTName name, IASTExpression expr) {
return new CPPASTConstructorChainInitializer(name, expr);
}
public ICPPASTFunctionTryBlockDeclarator newFunctionTryBlockDeclarator(IASTName name) {
return new CPPASTFunctionTryBlockDeclarator(name);
}
}

View file

@ -22,6 +22,7 @@ import lpg.lpgjavaruntime.IToken;
import org.eclipse.cdt.core.dom.ast.IASTASMDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTDeclarationStatement;
@ -29,6 +30,7 @@ import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTFieldReference;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTIfStatement;
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
import org.eclipse.cdt.core.dom.ast.IASTInitializerExpression;
@ -46,12 +48,14 @@ import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
import org.eclipse.cdt.core.dom.ast.IASTWhileStatement;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCatchHandler;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorInitializer;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConversionName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeleteExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExplicitTemplateInstantiation;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionTryBlockDeclarator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLinkageSpecification;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias;
@ -77,6 +81,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBas
import org.eclipse.cdt.core.dom.lrparser.IParserActionTokenProvider;
import org.eclipse.cdt.core.dom.lrparser.action.BuildASTParserAction;
import org.eclipse.cdt.core.dom.lrparser.util.DebugUtil;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTFunctionDeclarator;
/**
* Semantic actions that build the AST during the parse. These are the actions
@ -1310,7 +1315,76 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
astStack.push(declarator);
}
}
/**
* mem_initializer
* ::= mem_initializer_id '(' expression_list_opt ')'
*/
public void consumeConstructorChainInitializer() {
if(TRACE_ACTIONS) DebugUtil.printMethodTrace();
IASTExpression expr = (IASTExpression) astStack.pop();
IASTName name = (IASTName) astStack.pop();
ICPPASTConstructorChainInitializer initializer = nodeFactory.newConstructorChainInitializer(name, expr);
setOffsetAndLength(initializer);
astStack.push(initializer);
if(TRACE_AST_STACK) System.out.println(astStack);
}
/**
* function_definition
* ::= declaration_specifiers_opt function_direct_declarator
* <openscope-ast> ctor_initializer_list_opt function_body
*
* | declaration_specifiers_opt function_direct_declarator
* 'try' <openscope-ast> ctor_initializer_list_opt function_body <openscope-ast> handler_seq
*
*/
public void consumeFunctionDefinition(boolean isTryBlockDeclarator) {
if(TRACE_ACTIONS) DebugUtil.printMethodTrace();
List<Object> handlers = isTryBlockDeclarator ? astStack.closeScope() : Collections.emptyList();
IASTCompoundStatement body = (IASTCompoundStatement) astStack.pop();
List<Object> initializers = astStack.closeScope();
ICPPASTFunctionDeclarator declarator = (ICPPASTFunctionDeclarator) astStack.pop();
IASTDeclSpecifier declSpec = (IASTDeclSpecifier) astStack.pop(); // may be null
if(isTryBlockDeclarator) {
// perform a shallow copy
ICPPASTFunctionTryBlockDeclarator tryBlockDeclarator = nodeFactory.newFunctionTryBlockDeclarator(declarator.getName());
tryBlockDeclarator.setConst(declarator.isConst());
tryBlockDeclarator.setVolatile(declarator.isVolatile());
tryBlockDeclarator.setPureVirtual(declarator.isPureVirtual());
tryBlockDeclarator.setVarArgs(declarator.takesVarArgs());
for(IASTParameterDeclaration parameter : declarator.getParameters()) {
tryBlockDeclarator.addParameterDeclaration(parameter);
}
for(IASTTypeId exception : declarator.getExceptionSpecification()) {
tryBlockDeclarator.addExceptionSpecificationTypeId(exception);
}
for(Object handler : handlers) {
tryBlockDeclarator.addCatchHandler((ICPPASTCatchHandler)handler);
}
declarator = tryBlockDeclarator;
}
for(Object initializer : initializers) {
declarator.addConstructorToChain((ICPPASTConstructorChainInitializer)initializer);
}
IASTFunctionDefinition definition = nodeFactory.newFunctionDefinition(declSpec, declarator, body);
setOffsetAndLength(definition);
astStack.push(definition);
if(TRACE_AST_STACK) System.out.println(astStack);
}
}

View file

@ -22,11 +22,13 @@ import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.IASTWhileStatement;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCatchHandler;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorInitializer;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConversionName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeleteExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExplicitTemplateInstantiation;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionTryBlockDeclarator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLinkageSpecification;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias;
@ -119,4 +121,9 @@ public interface ICPPASTNodeFactory extends IASTNodeFactory {
public ICPPASTConstructorInitializer newConstructorInitializer(IASTExpression exp);
public ICPPASTFunctionDeclarator newCPPFunctionDeclarator(IASTName name);
public ICPPASTConstructorChainInitializer newConstructorChainInitializer(
IASTName name, IASTExpression expr);
public ICPPASTFunctionTryBlockDeclarator newFunctionTryBlockDeclarator(IASTName name);
}

View file

@ -1346,14 +1346,6 @@ parameter_declaration_list_opt
| $empty
-- its just a declarator with an initializer
--parameter_declaration
-- ::= declaration_specifiers declarator
-- | declaration_specifiers declarator = assignment_expression
-- | declaration_specifiers abstract_declarator_opt
-- | declaration_specifiers abstract_declarator_opt = assignment_expression
abstract_declarator_opt
::= abstract_declarator
| $empty
@ -1384,10 +1376,12 @@ parameter_initializer
function_definition
::= declaration_specifiers_opt declarator ctor_initializer_opt function_body
| declaration_specifiers_opt declarator function_try_block
::= declaration_specifiers_opt function_direct_declarator <openscope-ast> ctor_initializer_list_opt function_body
| declaration_specifiers_opt function_direct_declarator 'try' <openscope-ast> ctor_initializer_list_opt function_body <openscope-ast> handler_seq
function_body
::= compound_statement
@ -1563,12 +1557,12 @@ conversion_declarator_opt
| $empty
ctor_initializer
ctor_initializer_list
::= ':' mem_initializer_list
ctor_initializer_opt
::= ctor_initializer
ctor_initializer_list_opt
::= ctor_initializer_list
| $empty
@ -1578,12 +1572,14 @@ mem_initializer_list
mem_initializer
::= mem_initializer_id '(' expression_list_opt ')'
::= mem_initializer_name '(' expression_list_opt ')'
/. $Build consumeConstructorChainInitializer(); $EndBuild ./
mem_initializer_id
mem_initializer_name
::= dcolon_opt nested_name_specifier_opt class_name
| 'identifier'
/. $Build consumeQualifiedId(false); $EndBuild ./
| identifier_name
operator_function_id_name
@ -1677,8 +1673,7 @@ try_block
/. $Build consumeStatementTryBlock(); $EndBuild ./
function_try_block
::= 'try' ctor_initializer_opt function_body handler_seq
handler_seq

View file

@ -200,7 +200,7 @@ public int getKind(int i) {
// Initialize ruleAction array.
//
static {
RULE_ACTIONS = new Action[526 + 1];
RULE_ACTIONS = new Action[525 + 1];
RULE_ACTIONS[0] = null;
RULE_ACTIONS[1] = new Action1();
@ -421,6 +421,8 @@ public int getKind(int i) {
RULE_ACTIONS[423] = new Action423();
RULE_ACTIONS[424] = new Action424();
RULE_ACTIONS[430] = new Action430();
RULE_ACTIONS[440] = new Action440();
RULE_ACTIONS[441] = new Action441();
RULE_ACTIONS[444] = new Action444();
RULE_ACTIONS[445] = new Action445();
RULE_ACTIONS[488] = new Action488();
@ -430,8 +432,8 @@ public int getKind(int i) {
RULE_ACTIONS[510] = new Action510();
RULE_ACTIONS[511] = new Action511();
RULE_ACTIONS[512] = new Action512();
RULE_ACTIONS[515] = new Action515();
RULE_ACTIONS[516] = new Action516();
RULE_ACTIONS[517] = new Action517();
//
@ -2624,6 +2626,26 @@ public int getKind(int i) {
}
}
//
// Rule 440: mem_initializer ::= mem_initializer_name ( expression_list_opt )
//
static final class Action440 extends DeclaredAction< CPPParserAction , Object > {
public void doFinal(ITrialUndoActionProvider< Object > provider, CPPParserAction action) { action.builder.
consumeConstructorChainInitializer();
}
}
//
// Rule 441: mem_initializer_name ::= dcolon_opt nested_name_specifier_opt class_name
//
static final class Action441 extends DeclaredAction< CPPParserAction , Object > {
public void doFinal(ITrialUndoActionProvider< Object > provider, CPPParserAction action) { action.builder.
consumeQualifiedId(false);
}
}
//
// Rule 444: operator_function_id_name ::= operator_id_name < <openscope-ast> template_argument_list_opt >
//
@ -2715,9 +2737,9 @@ public int getKind(int i) {
}
//
// Rule 516: handler ::= catch ( exception_declaration ) compound_statement
// Rule 515: handler ::= catch ( exception_declaration ) compound_statement
//
static final class Action516 extends DeclaredAction< CPPParserAction , Object > {
static final class Action515 extends DeclaredAction< CPPParserAction , Object > {
public void doFinal(ITrialUndoActionProvider< Object > provider, CPPParserAction action) { action.builder.
consumeStatementCatchHandler(false);
@ -2725,9 +2747,9 @@ public int getKind(int i) {
}
//
// Rule 517: handler ::= catch ( ... ) compound_statement
// Rule 516: handler ::= catch ( ... ) compound_statement
//
static final class Action517 extends DeclaredAction< CPPParserAction , Object > {
static final class Action516 extends DeclaredAction< CPPParserAction , Object > {
public void doFinal(ITrialUndoActionProvider< Object > provider, CPPParserAction action) { action.builder.
consumeStatementCatchHandler(true);

View file

@ -65,7 +65,7 @@ public interface CPPParsersym {
TK_template = 44,
TK_this = 32,
TK_throw = 39,
TK_try = 73,
TK_try = 74,
TK_true = 33,
TK_typedef = 56,
TK_typeid = 34,
@ -134,7 +134,7 @@ public interface CPPParsersym {
TK_OrAssign = 111,
TK_Comma = 68,
TK_RightBracket = 113,
TK_RightParen = 74,
TK_RightParen = 73,
TK_RightBrace = 71,
TK_SemiColon = 40,
TK_ERROR_TOKEN = 45,
@ -214,8 +214,8 @@ public interface CPPParsersym {
"Colon",
"RightBrace",
"export",
"try",
"RightParen",
"try",
"while",
"break",
"case",