forked from qt-creator/qt-creator
C: Parser: Support parsing of c99 designated initializers
In case:
int a[6] = { [4] = 29, [2] = 15 };
struct point { int x, y; };
struct point p = { .y = 3, .x = 2 };
Grammar change when c99 language feature is enabled:
old grammar:
braced-init-list :: '{' initializer-list '}'
new grammar:
braced-init-list :: '{' designated-initializer-list '}'
designated-initializer-list :: designated-initializer (',' designated-initializer )*
designated-initializer :: designator* initializer-clause
designator :: '.' identifier
| '[' constant-expression ']'
Task-number: QTCREATORBUG-1902
Change-Id: Ib99d6f553f8d0f50ba3eff86f3a2e86d73372426
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
This commit is contained in:
68
src/libs/3rdparty/cplusplus/AST.h
vendored
68
src/libs/3rdparty/cplusplus/AST.h
vendored
@@ -161,6 +161,8 @@ public:
|
||||
virtual DeclaratorIdAST *asDeclaratorId() { return 0; }
|
||||
virtual DecltypeSpecifierAST *asDecltypeSpecifier() { return 0; }
|
||||
virtual DeleteExpressionAST *asDeleteExpression() { return 0; }
|
||||
virtual DesignatedInitializerAST *asDesignatedInitializer() { return 0; }
|
||||
virtual DesignatorAST *asDesignator() { return 0; }
|
||||
virtual DestructorNameAST *asDestructorName() { return 0; }
|
||||
virtual DoStatementAST *asDoStatement() { return 0; }
|
||||
virtual DynamicExceptionSpecificationAST *asDynamicExceptionSpecification() { return 0; }
|
||||
@@ -4527,6 +4529,72 @@ protected:
|
||||
virtual bool match0(AST *, ASTMatcher *);
|
||||
};
|
||||
|
||||
class DesignatorAST: public AST
|
||||
{
|
||||
public:
|
||||
enum Type
|
||||
{
|
||||
Invalid,
|
||||
Dot,
|
||||
Bracket
|
||||
};
|
||||
Type type;
|
||||
union Designator
|
||||
{
|
||||
struct DotDesignator
|
||||
{
|
||||
unsigned dot_token;
|
||||
unsigned identifier_token;
|
||||
} dot;
|
||||
struct BracketDesignator
|
||||
{
|
||||
unsigned lbracket_token;
|
||||
ExpressionAST *expression;
|
||||
unsigned rbracket_token;
|
||||
} bracket;
|
||||
} u;
|
||||
|
||||
public:
|
||||
DesignatorAST()
|
||||
: type(Invalid)
|
||||
{}
|
||||
|
||||
virtual DesignatorAST *asDesignator() { return this; }
|
||||
virtual unsigned firstToken() const;
|
||||
virtual unsigned lastToken() const;
|
||||
|
||||
virtual DesignatorAST *clone(MemoryPool *pool) const;
|
||||
|
||||
protected:
|
||||
virtual void accept0(ASTVisitor *visitor);
|
||||
virtual bool match0(AST *, ASTMatcher *);
|
||||
};
|
||||
|
||||
class DesignatedInitializerAST: public ExpressionAST
|
||||
{
|
||||
public:
|
||||
DesignatorListAST *designator_list;
|
||||
unsigned equal_token;
|
||||
ExpressionAST *initializer;
|
||||
|
||||
public:
|
||||
DesignatedInitializerAST()
|
||||
: designator_list(0)
|
||||
, equal_token(0)
|
||||
, initializer(0)
|
||||
{}
|
||||
|
||||
virtual DesignatedInitializerAST *asDesignatedInitializer() { return this; }
|
||||
virtual unsigned firstToken() const;
|
||||
virtual unsigned lastToken() const;
|
||||
|
||||
virtual DesignatedInitializerAST *clone(MemoryPool *pool) const;
|
||||
|
||||
protected:
|
||||
virtual void accept0(ASTVisitor *visitor);
|
||||
virtual bool match0(AST *, ASTMatcher *);
|
||||
};
|
||||
|
||||
} // namespace CPlusPlus
|
||||
|
||||
#endif // CPLUSPLUS_AST_H
|
||||
|
||||
Reference in New Issue
Block a user