diff options
Diffstat (limited to 'src/shared/cplusplus/Parser.cpp')
-rw-r--r-- | src/shared/cplusplus/Parser.cpp | 71 |
1 files changed, 48 insertions, 23 deletions
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 4f38bbe726..a2c0d2edda 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -353,14 +353,17 @@ bool Parser::parseName(NameAST *&node, bool acceptTemplateId) bool Parser::parseTranslationUnit(TranslationUnitAST *&node) { TranslationUnitAST *ast = new (_pool) TranslationUnitAST; - DeclarationAST **decl = &ast->declarations; + DeclarationListAST **decl = &ast->declarations; while (LA()) { unsigned start_declaration = cursor(); - if (parseDeclaration(*decl)) { - if (*decl) - decl = &(*decl)->next; + DeclarationAST *declaration = 0; + + if (parseDeclaration(declaration)) { + *decl = new (_pool) DeclarationListAST; + (*decl)->declaration = declaration; + decl = &(*decl)->next; } else { rewind(start_declaration + 1); skipUntilDeclaration(); @@ -469,16 +472,18 @@ bool Parser::parseLinkageBody(DeclarationAST *&node) if (LA() == T_LBRACE) { LinkageBodyAST *ast = new (_pool) LinkageBodyAST; ast->lbrace_token = consumeToken(); - DeclarationAST **declaration_ptr = &ast->declarations; + DeclarationListAST **declaration_ptr = &ast->declarations; while (int tk = LA()) { if (tk == T_RBRACE) break; unsigned start_declaration = cursor(); - if (parseDeclaration(*declaration_ptr)) { - if (*declaration_ptr) // ### remove me - declaration_ptr = &(*declaration_ptr)->next; + DeclarationAST *declaration = 0; + if (parseDeclaration(declaration)) { + *declaration_ptr = new (_pool) DeclarationListAST; + (*declaration_ptr)->declaration = declaration; + declaration_ptr = &(*declaration_ptr)->next; } else { rewind(start_declaration + 1); skipUntilDeclaration(); @@ -1179,16 +1184,24 @@ bool Parser::parseEnumSpecifier(SpecifierAST *&node) return false; } -bool Parser::parseTemplateParameterList(DeclarationAST *&node) +bool Parser::parseTemplateParameterList(DeclarationListAST *&node) { - DeclarationAST **template_parameter_ptr = &node; - if (parseTemplateParameter(*template_parameter_ptr)) { + DeclarationListAST **template_parameter_ptr = &node; + DeclarationAST *declaration = 0; + if (parseTemplateParameter(declaration)) { + *template_parameter_ptr = new (_pool) DeclarationListAST; + (*template_parameter_ptr)->declaration = declaration; template_parameter_ptr = &(*template_parameter_ptr)->next; + while (LA() == T_COMMA) { consumeToken(); // XXX Store this token somewhere - if (parseTemplateParameter(*template_parameter_ptr)) + declaration = 0; + if (parseTemplateParameter(declaration)) { + *template_parameter_ptr = new (_pool) DeclarationListAST; + (*template_parameter_ptr)->declaration = declaration; template_parameter_ptr = &(*template_parameter_ptr)->next; + } } return true; } @@ -1272,7 +1285,7 @@ bool Parser::parseTypeId(ExpressionAST *&node) bool Parser::parseParameterDeclarationClause(ParameterDeclarationClauseAST *&node) { - DeclarationAST *parameter_declarations = 0; + DeclarationListAST *parameter_declarations = 0; if (LA() != T_DOT_DOT_DOT) parseParameterDeclarationList(parameter_declarations); unsigned dot_dot_dot_token = 0; @@ -1288,10 +1301,13 @@ bool Parser::parseParameterDeclarationClause(ParameterDeclarationClauseAST *&nod return true; } -bool Parser::parseParameterDeclarationList(DeclarationAST *&node) +bool Parser::parseParameterDeclarationList(DeclarationListAST *&node) { - DeclarationAST **parameter_declaration_ptr = &node; - if (parseParameterDeclaration(*parameter_declaration_ptr)) { + DeclarationListAST **parameter_declaration_ptr = &node; + DeclarationAST *declaration = 0; + if (parseParameterDeclaration(declaration)) { + *parameter_declaration_ptr = new (_pool) DeclarationListAST; + (*parameter_declaration_ptr)->declaration = declaration; parameter_declaration_ptr = &(*parameter_declaration_ptr)->next; while (LA() == T_COMMA) { consumeToken(); @@ -1299,8 +1315,12 @@ bool Parser::parseParameterDeclarationList(DeclarationAST *&node) if (LA() == T_DOT_DOT_DOT) break; - if (parseParameterDeclaration(*parameter_declaration_ptr)) + declaration = 0; + if (parseParameterDeclaration(declaration)) { + *parameter_declaration_ptr = new (_pool) DeclarationListAST; + (*parameter_declaration_ptr)->declaration = declaration; parameter_declaration_ptr = &(*parameter_declaration_ptr)->next; + } } return true; } @@ -1381,7 +1401,7 @@ bool Parser::parseClassSpecifier(SpecifierAST *&node) if (LA() == T_LBRACE) ast->lbrace_token = consumeToken(); - DeclarationAST **declaration_ptr = &ast->member_specifiers; + DeclarationListAST **declaration_ptr = &ast->member_specifiers; while (int tk = LA()) { if (tk == T_RBRACE) { ast->rbrace_token = consumeToken(); @@ -1389,9 +1409,11 @@ bool Parser::parseClassSpecifier(SpecifierAST *&node) } unsigned start_declaration = cursor(); - if (parseMemberSpecification(*declaration_ptr)) { - if (*declaration_ptr) - declaration_ptr = &(*declaration_ptr)->next; + DeclarationAST *declaration = 0; + if (parseMemberSpecification(declaration)) { + *declaration_ptr = new (_pool) DeclarationListAST; + (*declaration_ptr)->declaration = declaration; + declaration_ptr = &(*declaration_ptr)->next; } else { rewind(start_declaration + 1); skipUntilDeclaration(); @@ -2097,16 +2119,19 @@ bool Parser::parseCompoundStatement(StatementAST *&node) if (LA() == T_LBRACE) { CompoundStatementAST *ast = new (_pool) CompoundStatementAST; ast->lbrace_token = consumeToken(); - StatementAST **statement_ptr = &ast->statements; + StatementListAST **statement_ptr = &ast->statements; while (int tk = LA()) { if (tk == T_RBRACE) break; unsigned start_statement = cursor(); - if (! parseStatement(*statement_ptr)) { + StatementAST *statement = 0; + if (! parseStatement(statement)) { rewind(start_statement + 1); skipUntilStatement(); } else { + *statement_ptr = new (_pool) StatementListAST; + (*statement_ptr)->statement = statement; statement_ptr = &(*statement_ptr)->next; } } |