Commit ecc2b25d authored by Thorbjørn Lindeijer's avatar Thorbjørn Lindeijer
Browse files

Extended the AST with references to more tokens

Mainly comma tokens. Referencing all tokens is necessary to be able to
implement pretty-printing based on the AST while maintaining user
formatting.

Reviewed-by: Roberto Raggi
parent 36a94b69
......@@ -148,6 +148,7 @@ AttributeAST *AttributeAST::clone(MemoryPool *pool) const
ast->rparen_token = rparen_token;
if (next)
ast->next = next->clone(pool);
ast->comma_token = comma_token;
return ast;
}
......@@ -331,6 +332,7 @@ unsigned AsmDefinitionAST::lastToken() const
BaseSpecifierAST *BaseSpecifierAST::clone(MemoryPool *pool) const
{
BaseSpecifierAST *ast = new (pool) BaseSpecifierAST;
ast->comma_token = comma_token;
ast->token_virtual = token_virtual;
ast->token_access_specifier = token_access_specifier;
if (name)
......@@ -1149,6 +1151,7 @@ unsigned DeclaratorIdAST::lastToken() const
DeclaratorListAST *DeclaratorListAST::clone(MemoryPool *pool) const
{
DeclaratorListAST *ast = new (pool) DeclaratorListAST;
ast->comma_token = comma_token;
if (declarator)
ast->declarator = declarator->clone(pool);
if (next)
......@@ -1395,6 +1398,7 @@ unsigned EnumSpecifierAST::lastToken() const
EnumeratorAST *EnumeratorAST::clone(MemoryPool *pool) const
{
EnumeratorAST *ast = new (pool) EnumeratorAST;
ast->comma_token = comma_token;
ast->identifier_token = identifier_token;
ast->equal_token = equal_token;
if (expression)
......@@ -1517,6 +1521,7 @@ unsigned ExceptionSpecificationAST::lastToken() const
ExpressionListAST *ExpressionListAST::clone(MemoryPool *pool) const
{
ExpressionListAST *ast = new (pool) ExpressionListAST;
ast->comma_token = comma_token;
if (expression)
ast->expression = expression->clone(pool);
if (next)
......@@ -1954,6 +1959,7 @@ unsigned LinkageSpecificationAST::lastToken() const
MemInitializerAST *MemInitializerAST::clone(MemoryPool *pool) const
{
MemInitializerAST *ast = new (pool) MemInitializerAST;
ast->comma_token = comma_token;
if (name)
ast->name = name->clone(pool);
ast->lparen_token = lparen_token;
......@@ -2938,8 +2944,10 @@ TypeofSpecifierAST *TypeofSpecifierAST::clone(MemoryPool *pool) const
{
TypeofSpecifierAST *ast = new (pool) TypeofSpecifierAST;
ast->typeof_token = typeof_token;
ast->lparen_token = lparen_token;
if (expression)
ast->expression = expression->clone(pool);
ast->rparen_token = rparen_token;
if (next)
ast->next = next->clone(pool);
return ast;
......@@ -3066,6 +3074,7 @@ unsigned SwitchStatementAST::lastToken() const
TemplateArgumentListAST *TemplateArgumentListAST::clone(MemoryPool *pool) const
{
TemplateArgumentListAST *ast = new (pool) TemplateArgumentListAST;
ast->comma_token = comma_token;
if (template_argument)
ast->template_argument = template_argument->clone(pool);
if (next)
......
......@@ -265,6 +265,7 @@ public:
ExpressionListAST *expression_list;
unsigned rparen_token;
AttributeAST *next;
unsigned comma_token;
public:
virtual AttributeAST *asAttribute()
......@@ -283,7 +284,9 @@ class CPLUSPLUS_EXPORT TypeofSpecifierAST: public SpecifierAST
{
public:
unsigned typeof_token;
unsigned lparen_token;
ExpressionAST *expression;
unsigned rparen_token;
public:
virtual TypeofSpecifierAST *asTypeofSpecifier()
......@@ -359,6 +362,7 @@ public:
CoreDeclaratorAST *core_declarator;
PostfixDeclaratorAST *postfix_declarators;
SpecifierAST *attributes;
unsigned equals_token;
ExpressionAST *initializer;
public:
......@@ -377,6 +381,7 @@ protected:
class CPLUSPLUS_EXPORT ExpressionListAST: public ExpressionAST
{
public:
unsigned comma_token;
ExpressionAST *expression;
ExpressionListAST *next;
......@@ -482,6 +487,7 @@ protected:
class CPLUSPLUS_EXPORT BaseSpecifierAST: public AST
{
public:
unsigned comma_token;
unsigned token_virtual;
unsigned token_access_specifier;
NameAST *name;
......@@ -847,6 +853,7 @@ protected:
class CPLUSPLUS_EXPORT DeclaratorListAST: public AST
{
public:
unsigned comma_token;
DeclaratorAST *declarator;
DeclaratorListAST *next;
......@@ -971,6 +978,7 @@ protected:
class CPLUSPLUS_EXPORT EnumeratorAST: public AST
{
public:
unsigned comma_token;
unsigned identifier_token;
unsigned equal_token;
ExpressionAST *expression;
......@@ -1229,6 +1237,7 @@ protected:
class CPLUSPLUS_EXPORT MemInitializerAST: public AST
{
public:
unsigned comma_token;
NameAST *name;
unsigned lparen_token;
ExpressionAST *expression;
......@@ -2073,6 +2082,7 @@ protected:
class CPLUSPLUS_EXPORT TemplateArgumentListAST: public AST
{
public:
unsigned comma_token;
ExpressionAST *template_argument;
TemplateArgumentListAST *next;
......
......@@ -609,10 +609,11 @@ bool Parser::parseTemplateArgumentList(TemplateArgumentListAST *&node)
(*template_argument_ptr)->template_argument = template_argument;
template_argument_ptr = &(*template_argument_ptr)->next;
while (LA() == T_COMMA) {
consumeToken();
unsigned comma_token = consumeToken();
if (parseTemplateArgument(template_argument)) {
*template_argument_ptr = new (_pool) TemplateArgumentListAST;
(*template_argument_ptr)->comma_token = comma_token;
(*template_argument_ptr)->template_argument = template_argument;
template_argument_ptr = &(*template_argument_ptr)->next;
}
......@@ -993,7 +994,7 @@ bool Parser::parseDeclarator(DeclaratorAST *&node, bool stopAtCppInitializer)
ExpressionAST *initializer = 0;
bool blocked = blockErrors(true);
if (parseInitializer(initializer)) {
if (parseInitializer(initializer, &node->equals_token)) {
if (NestedExpressionAST *expr = initializer->asNestedExpression()) {
if (expr->expression && expr->rparen_token && (LA() == T_COMMA || LA() == T_SEMICOLON)) {
rewind(lparen_token);
......@@ -1151,6 +1152,7 @@ bool Parser::parseEnumSpecifier(SpecifierAST *&node)
ast->enum_token = enum_token;
ast->name = name;
ast->lbrace_token = consumeToken();
unsigned comma_token = 0;
EnumeratorAST **enumerator_ptr = &ast->enumerators;
while (int tk = LA()) {
if (tk == T_RBRACE)
......@@ -1161,13 +1163,13 @@ bool Parser::parseEnumSpecifier(SpecifierAST *&node)
skipUntil(T_IDENTIFIER);
}
if (parseEnumerator(*enumerator_ptr))
if (parseEnumerator(*enumerator_ptr)) {
(*enumerator_ptr)->comma_token = comma_token;
enumerator_ptr = &(*enumerator_ptr)->next;
}
if (LA() != T_RBRACE) {
unsigned comma_token = 0;
if (LA() != T_RBRACE)
match(T_COMMA, &comma_token);
}
}
match(T_RBRACE, &ast->rbrace_token);
node = ast;
......@@ -1183,7 +1185,7 @@ bool Parser::parseTemplateParameterList(DeclarationAST *&node)
if (parseTemplateParameter(*template_parameter_ptr)) {
template_parameter_ptr = &(*template_parameter_ptr)->next;
while (LA() == T_COMMA) {
consumeToken();
consumeToken(); // XXX Store this token somewhere
if (parseTemplateParameter(*template_parameter_ptr))
template_parameter_ptr = &(*template_parameter_ptr)->next;
......@@ -1566,7 +1568,7 @@ bool Parser::parseInitDeclarator(DeclaratorAST *&node,
}
rewind(colon_token);
} else if (LA() == T_EQUAL || (! acceptStructDeclarator && LA() == T_LPAREN)) {
parseInitializer(node->initializer);
parseInitializer(node->initializer, &node->equals_token);
}
return true;
}
......@@ -1581,10 +1583,12 @@ bool Parser::parseBaseClause(BaseSpecifierAST *&node)
ast = &(*ast)->next;
while (LA() == T_COMMA) {
consumeToken();
unsigned comma_token = consumeToken();
if (parseBaseSpecifier(*ast))
ast = &(*ast)->next;
if (parseBaseSpecifier(*ast)) {
(*ast)->comma_token = comma_token;
ast = &(*ast)->next;\
}
}
}
......@@ -1593,12 +1597,12 @@ bool Parser::parseBaseClause(BaseSpecifierAST *&node)
return false;
}
bool Parser::parseInitializer(ExpressionAST *&node)
bool Parser::parseInitializer(ExpressionAST *&node, unsigned *equals_token)
{
if (LA() == T_LPAREN) {
return parsePrimaryExpression(node);
} else if (LA() == T_EQUAL) {
consumeToken();
(*equals_token) = consumeToken();
return parseInitializerClause(node);
}
return false;
......@@ -1611,9 +1615,12 @@ bool Parser::parseMemInitializerList(MemInitializerAST *&node)
if (parseMemInitializer(*initializer)) {
initializer = &(*initializer)->next;
while (LA() == T_COMMA) {
consumeToken();
if (parseMemInitializer(*initializer))
unsigned comma_token = consumeToken();
if (parseMemInitializer(*initializer)) {
(*initializer)->comma_token = comma_token;
initializer = &(*initializer)->next;
}
}
return true;
}
......@@ -1668,10 +1675,11 @@ bool Parser::parseExpressionList(ExpressionListAST *&node)
(*expression_list_ptr)->expression = expression;
expression_list_ptr = &(*expression_list_ptr)->next;
while (LA() == T_COMMA) {
consumeToken();
unsigned comma_token = consumeToken();
if (parseExpression(expression)) {
*expression_list_ptr = new (_pool) ExpressionListAST;
(*expression_list_ptr)->comma_token = comma_token;
(*expression_list_ptr)->expression = expression;
expression_list_ptr = &(*expression_list_ptr)->next;
}
......@@ -1716,10 +1724,11 @@ bool Parser::parseInitializerList(ExpressionListAST *&node)
(*initializer_ptr)->expression = initializer;
initializer_ptr = &(*initializer_ptr)->next;
while (LA() == T_COMMA) {
consumeToken();
unsigned comma_token = consumeToken();
initializer = 0;
parseInitializerClause(initializer);
*initializer_ptr = new (_pool) ExpressionListAST;
(*initializer_ptr)->comma_token = comma_token;
(*initializer_ptr)->expression = initializer;
initializer_ptr = &(*initializer_ptr)->next;
}
......@@ -2326,18 +2335,17 @@ bool Parser::parseAttributeList(AttributeAST *&node)
AttributeAST *ast = new (_pool) AttributeAST;
ast->identifier_token = consumeToken();
if (LA() == T_LPAREN) {
consumeToken();
ast->lparen_token = consumeToken();
if (LA() == T_IDENTIFIER && (LA(2) == T_COMMA || LA(2) == T_RPAREN)) {
ast->tag_token = consumeToken();
if (LA() == T_COMMA) {
consumeToken();
ast->comma_token = consumeToken();
parseExpressionList(ast->expression_list);
}
} else {
parseExpressionList(ast->expression_list);
}
unsigned rparen_token = 0;
match(T_RPAREN, &rparen_token);
match(T_RPAREN, &ast->rparen_token);
}
*attribute_ptr = ast;
......@@ -2360,7 +2368,8 @@ bool Parser::parseBuiltinTypeSpecifier(SpecifierAST *&node)
if (LA() == T_LPAREN) {
unsigned lparen_token = consumeToken();
if (parseTypeId(ast->expression) && LA() == T_RPAREN) {
consumeToken();
ast->lparen_token = lparen_token;
ast->rparen_token = consumeToken();
node = ast;
return true;
}
......@@ -2491,10 +2500,11 @@ bool Parser::parseSimpleDeclaration(DeclarationAST *&node,
if (LA() == T_COMMA || LA() == T_SEMICOLON || has_complex_type_specifier) {
while (LA() == T_COMMA) {
consumeToken();
unsigned comma_token = consumeToken();
declarator = 0;
if (parseInitDeclarator(declarator, acceptStructDeclarator)) {
*declarator_ptr = new (_pool) DeclaratorListAST;
(*declarator_ptr)->comma_token = comma_token;
(*declarator_ptr)->declarator = declarator;
declarator_ptr = &(*declarator_ptr)->next;
}
......
......@@ -127,7 +127,7 @@ public:
bool parseInclusiveOrExpression(ExpressionAST *&node);
bool parseInitDeclarator(DeclaratorAST *&node, bool acceptStructDeclarator);
bool parseInitializerList(ExpressionListAST *&node);
bool parseInitializer(ExpressionAST *&node);
bool parseInitializer(ExpressionAST *&node, unsigned *equals_token);
bool parseInitializerClause(ExpressionAST *&node);
bool parseLabeledStatement(StatementAST *&node);
bool parseLinkageBody(DeclarationAST *&node);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment