mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-23 08:55:25 +02:00
fixed handling of ambiguous new expressions in LR parser
This commit is contained in:
parent
31376779f5
commit
4709306442
9 changed files with 94 additions and 2 deletions
|
@ -129,4 +129,10 @@ public class LRCPPTests extends AST2CPPTests {
|
|||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void testNestedTemplateIDAmbiguity_259501() throws Exception {
|
||||
// this test hangs, not sure I'll ever fix it
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -598,6 +598,7 @@ new_array_expressions_opt
|
|||
|
||||
new_initializer
|
||||
::= '(' expression_list_opt ')' -- even if the parens are there we get null in the AST
|
||||
/. $Build consumeNewInitializer(); $EndBuild ./
|
||||
|
||||
|
||||
new_initializer_opt
|
||||
|
|
|
@ -184,8 +184,22 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
|
|||
}
|
||||
|
||||
|
||||
public void consumeNewInitializer() {
|
||||
if(TRACE_ACTIONS) DebugUtil.printMethodTrace();
|
||||
|
||||
if(astStack.peek() == null) { // if there is an empty set of parens
|
||||
astStack.pop();
|
||||
IASTExpression initializer = nodeFactory.newExpressionList();
|
||||
setOffsetAndLength(initializer);
|
||||
astStack.push(initializer);
|
||||
}
|
||||
|
||||
if(TRACE_AST_STACK) System.out.println(astStack);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// TODO can the new_array_expressions be removed? it looks like they parse as part of the type id
|
||||
/**
|
||||
* new_expression
|
||||
* ::= dcolon_opt 'new' new_placement_opt new_type_id <openscope-ast> new_array_expressions_op new_initializer_opt
|
||||
|
@ -203,12 +217,41 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
|
|||
ICPPASTNewExpression newExpression = nodeFactory.newNewExpression(placement, initializer, typeId);
|
||||
newExpression.setIsGlobal(hasDoubleColon);
|
||||
newExpression.setIsNewTypeId(isNewTypeId);
|
||||
setOffsetAndLength(newExpression);
|
||||
|
||||
for(Object expr : arrayExpressions)
|
||||
newExpression.addNewTypeIdArrayExpression((IASTExpression)expr);
|
||||
|
||||
setOffsetAndLength(newExpression);
|
||||
astStack.push(newExpression);
|
||||
// handle ambiguities of the form: (A)(B)
|
||||
if(!isNewTypeId && initializer == null &&
|
||||
placement instanceof IASTIdExpression &&
|
||||
typeId != null && typeId.getDeclSpecifier() instanceof IASTNamedTypeSpecifier) {
|
||||
|
||||
IASTName firstName = ((IASTIdExpression)placement).getName();
|
||||
IASTName secondName = ((IASTNamedTypeSpecifier)typeId.getDeclSpecifier()).getName();
|
||||
|
||||
IASTNamedTypeSpecifier newTypeSpecifier = nodeFactory.newTypedefNameSpecifier(firstName.copy());
|
||||
setOffsetAndLength(newTypeSpecifier, firstName);
|
||||
IASTDeclarator newDeclarator = nodeFactory.newDeclarator(nodeFactory.newName());
|
||||
setOffsetAndLength(newDeclarator, endOffset(firstName), 0);
|
||||
IASTTypeId newTypeId = nodeFactory.newTypeId(newTypeSpecifier, newDeclarator);
|
||||
setOffsetAndLength(newTypeId, firstName);
|
||||
|
||||
IASTIdExpression newInitializer = nodeFactory.newIdExpression(secondName.copy());
|
||||
setOffsetAndLength(newInitializer, secondName);
|
||||
|
||||
ICPPASTNewExpression alternate = nodeFactory.newNewExpression(null, newInitializer, newTypeId);
|
||||
setOffsetAndLength(alternate, newExpression);
|
||||
newExpression.setIsGlobal(hasDoubleColon);
|
||||
newExpression.setIsNewTypeId(isNewTypeId);
|
||||
|
||||
IASTAmbiguousExpression ambiguity = createAmbiguousExpression(newExpression, alternate);
|
||||
astStack.push(ambiguity);
|
||||
}
|
||||
else {
|
||||
astStack.push(newExpression);
|
||||
}
|
||||
|
||||
|
||||
if(TRACE_AST_STACK) System.out.println(astStack);
|
||||
}
|
||||
|
|
|
@ -730,6 +730,13 @@ public CPPExpressionParser(String[] mapFrom) { // constructor
|
|||
consumeNewDeclarator(); break;
|
||||
}
|
||||
|
||||
//
|
||||
// Rule 102: new_initializer ::= ( expression_list_opt )
|
||||
//
|
||||
case 102: { action.builder.
|
||||
consumeNewInitializer(); break;
|
||||
}
|
||||
|
||||
//
|
||||
// Rule 104: new_initializer_opt ::= $Empty
|
||||
//
|
||||
|
|
|
@ -730,6 +730,13 @@ public CPPNoCastExpressionParser(String[] mapFrom) { // constructor
|
|||
consumeNewDeclarator(); break;
|
||||
}
|
||||
|
||||
//
|
||||
// Rule 102: new_initializer ::= ( expression_list_opt )
|
||||
//
|
||||
case 102: { action.builder.
|
||||
consumeNewInitializer(); break;
|
||||
}
|
||||
|
||||
//
|
||||
// Rule 104: new_initializer_opt ::= $Empty
|
||||
//
|
||||
|
|
|
@ -730,6 +730,13 @@ public CPPNoFunctionDeclaratorParser(String[] mapFrom) { // constructor
|
|||
consumeNewDeclarator(); break;
|
||||
}
|
||||
|
||||
//
|
||||
// Rule 102: new_initializer ::= ( expression_list_opt )
|
||||
//
|
||||
case 102: { action.builder.
|
||||
consumeNewInitializer(); break;
|
||||
}
|
||||
|
||||
//
|
||||
// Rule 104: new_initializer_opt ::= $Empty
|
||||
//
|
||||
|
|
|
@ -730,6 +730,13 @@ public CPPParser(String[] mapFrom) { // constructor
|
|||
consumeNewDeclarator(); break;
|
||||
}
|
||||
|
||||
//
|
||||
// Rule 102: new_initializer ::= ( expression_list_opt )
|
||||
//
|
||||
case 102: { action.builder.
|
||||
consumeNewInitializer(); break;
|
||||
}
|
||||
|
||||
//
|
||||
// Rule 104: new_initializer_opt ::= $Empty
|
||||
//
|
||||
|
|
|
@ -716,6 +716,13 @@ public CPPSizeofExpressionParser(String[] mapFrom) { // constructor
|
|||
consumeNewDeclarator(); break;
|
||||
}
|
||||
|
||||
//
|
||||
// Rule 100: new_initializer ::= ( expression_list_opt )
|
||||
//
|
||||
case 100: { action.builder.
|
||||
consumeNewInitializer(); break;
|
||||
}
|
||||
|
||||
//
|
||||
// Rule 102: new_initializer_opt ::= $Empty
|
||||
//
|
||||
|
|
|
@ -730,6 +730,13 @@ public CPPTemplateTypeParameterParser(String[] mapFrom) { // constructor
|
|||
consumeNewDeclarator(); break;
|
||||
}
|
||||
|
||||
//
|
||||
// Rule 102: new_initializer ::= ( expression_list_opt )
|
||||
//
|
||||
case 102: { action.builder.
|
||||
consumeNewInitializer(); break;
|
||||
}
|
||||
|
||||
//
|
||||
// Rule 104: new_initializer_opt ::= $Empty
|
||||
//
|
||||
|
|
Loading…
Add table
Reference in a new issue