Skip to content

Commit

Permalink
decouple (part of) parsing of declaration and struct-declaration (#152)
Browse files Browse the repository at this point in the history
  • Loading branch information
ltcmelo authored Oct 27, 2024
1 parent afa6451 commit 7043881
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 47 deletions.
19 changes: 10 additions & 9 deletions C/parser/Parser.h
Original file line number Diff line number Diff line change
Expand Up @@ -290,14 +290,16 @@ class PSY_C_INTERNAL_API Parser
bool parseExtGNU_AsmStatementDeclaration_AtFirst(DeclarationSyntax*& decl);
bool parseDeclaration(
DeclarationSyntax*& decl,
bool (Parser::*parseSpecifiers)(
DeclarationSyntax*&,
SpecifierListSyntax*&,
DeclarationScope declScope),
bool (Parser::*parse_AtFollowOfSpecifiers)(DeclarationSyntax*&, const SpecifierListSyntax*),
bool (Parser::*parse_AtDeclarator)(DeclarationSyntax*&, const SpecifierListSyntax*),
DeclarationScope declScope);
bool parseDeclaration_AtFollowOfSpecifiers(
DeclarationSyntax*& decl,
SpecifierListSyntax*& specList,
bool (Parser::*parse_AtDeclarator)(
DeclarationSyntax*&,
const SpecifierListSyntax*));
bool parseDeclarationOrFunctionDefinition(DeclarationSyntax*& decl);
bool parseDeclarationOrFunctionDefinition_AtFollowOfSpecifiers(
bool parseDeclarationOrFunctionDefinition_AtDeclarator(
DeclarationSyntax*& decl,
const SpecifierListSyntax* specList);
bool parseFunctionDefinition_AtOpenBrace(
Expand All @@ -306,7 +308,7 @@ class PSY_C_INTERNAL_API Parser
DeclaratorSyntax*& decltor,
ExtKR_ParameterDeclarationListSyntax* paramKRList);
bool parseStructDeclaration(DeclarationSyntax*& decl);
bool parseStructDeclaration_AtFollowOfSpecifierQualifierList(
bool parseStructDeclaration_AtDeclarator(
DeclarationSyntax*& decl,
const SpecifierListSyntax* specList);
bool parseEnumerator(DeclarationSyntax*& decl);
Expand All @@ -329,8 +331,7 @@ class PSY_C_INTERNAL_API Parser
DeclarationScope declScope);
bool parseSpecifierQualifierList(
DeclarationSyntax*& decl,
SpecifierListSyntax*& specList,
DeclarationScope);
SpecifierListSyntax*& specList);
template <class SpecT> void parseTrivialSpecifier_AtFirst(SpecifierSyntax*& spec);
template <class SpecT> void parseTrivialSpecifier_AtFirst(
SpecifierSyntax*& spec,
Expand Down
2 changes: 1 addition & 1 deletion C/parser/Parser_Common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ bool Parser::parseTypeName(TypeNameSyntax*& typeName)

DeclarationSyntax* decl = nullptr;
SpecifierListSyntax* specList = nullptr;
if (!parseSpecifierQualifierList(decl, specList, DeclarationScope::Block))
if (!parseSpecifierQualifierList(decl, specList))
return false;

typeName = makeNode<TypeNameSyntax>();
Expand Down
75 changes: 38 additions & 37 deletions C/parser/Parser_Declarations.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -178,21 +178,26 @@ bool Parser::parseExtGNU_AsmStatementDeclaration_AtFirst(DeclarationSyntax*& dec

bool Parser::parseDeclaration(
DeclarationSyntax*& decl,
bool (Parser::*parseSpecifiers)(
DeclarationSyntax*&,
SpecifierListSyntax*&,
DeclarationScope declScope),
bool (Parser::*parse_AtFollowOfSpecifiers)(DeclarationSyntax*&, const SpecifierListSyntax*),
bool (Parser::*parse_AtDeclarator)(DeclarationSyntax*&, const SpecifierListSyntax*),
DeclarationScope declScope)
{
SpecifierListSyntax* specList = nullptr;
if (!((this)->*(parseSpecifiers))(
decl,
specList,
declScope)) {
if (!parseDeclarationSpecifiers(decl, specList, declScope)) {
skipTo(SyntaxKind::SemicolonToken);
return false;
}

return parseDeclaration_AtFollowOfSpecifiers(
decl,
specList,
parse_AtDeclarator);
}

bool Parser::parseDeclaration_AtFollowOfSpecifiers(
DeclarationSyntax*& decl,
SpecifierListSyntax*& specList,
bool (Parser::*parse_AtDeclarator)(DeclarationSyntax*&, const SpecifierListSyntax*))
{
if (peek().kind() == SyntaxKind::SemicolonToken) {
if (decl) {
auto tagDecl = static_cast<TagDeclarationSyntax*>(decl);
Expand Down Expand Up @@ -221,12 +226,7 @@ bool Parser::parseDeclaration(
}
}

if (!specList
&& declScope == DeclarationScope::Block) {
diagReporter_.ExpectedFIRSTofSpecifierQualifier();
}

return ((this)->*(parse_AtFollowOfSpecifiers))(decl, specList);
return ((this)->*(parse_AtDeclarator))(decl, specList);
}

/**
Expand All @@ -247,12 +247,11 @@ bool Parser::parseDeclarationOrFunctionDefinition(DeclarationSyntax*& decl)
{
return parseDeclaration(
decl,
&Parser::parseDeclarationSpecifiers,
&Parser::parseDeclarationOrFunctionDefinition_AtFollowOfSpecifiers,
&Parser::parseDeclarationOrFunctionDefinition_AtDeclarator,
DeclarationScope::File);
}

bool Parser::parseDeclarationOrFunctionDefinition_AtFollowOfSpecifiers(
bool Parser::parseDeclarationOrFunctionDefinition_AtDeclarator(
DeclarationSyntax*& decl,
const SpecifierListSyntax* specList)
{
Expand Down Expand Up @@ -581,7 +580,7 @@ Parser::IdentifierRole Parser::guessRoleOfIdentifier(DeclarationScope declScope)
}
}

bool Parser::parseStructDeclaration_AtFollowOfSpecifierQualifierList(
bool Parser::parseStructDeclaration_AtDeclarator(
DeclarationSyntax*& decl,
const SpecifierListSyntax* specList)
{
Expand Down Expand Up @@ -633,29 +632,32 @@ bool Parser::parseStructDeclaration(DeclarationSyntax*& decl)
{
DBG_THIS_RULE();

auto extKwTkIdx = peek().kind() == SyntaxKind::Keyword_ExtGNU___extension__
? consume()
: LexedTokens::invalidIndex();

switch (peek().kind()) {
case SyntaxKind::Keyword__Static_assert:
return parseStaticAssertDeclaration_AtFirst(decl);

case SyntaxKind::Keyword_ExtGNU___extension__: {
auto extKwTkIdx = consume();
if (!parseDeclaration(
decl,
&Parser::parseSpecifierQualifierList,
&Parser::parseStructDeclaration_AtFollowOfSpecifierQualifierList,
DeclarationScope::Block))
default: {
SpecifierListSyntax* specList = nullptr;
if (!parseSpecifierQualifierList(decl, specList)) {
skipTo(SyntaxKind::SemicolonToken);
return false;
PSY_ASSERT_2(decl, return false);
decl->extKwTkIdx_ = extKwTkIdx;
}
if (!parseDeclaration_AtFollowOfSpecifiers(
decl,
specList,
&Parser::parseStructDeclaration_AtDeclarator)) {
return false;
}
if (extKwTkIdx != LexedTokens::invalidIndex()) {
PSY_ASSERT_2(decl, return false);
decl->extKwTkIdx_ = extKwTkIdx;
}
return true;
}

default:
return parseDeclaration(
decl,
&Parser::parseSpecifierQualifierList,
&Parser::parseStructDeclaration_AtFollowOfSpecifierQualifierList,
DeclarationScope::Block);
}
}

Expand Down Expand Up @@ -1205,8 +1207,7 @@ bool Parser::parseDeclarationSpecifiers(DeclarationSyntax*& decl,
* \remark 6.7.2.1
*/
bool Parser::parseSpecifierQualifierList(DeclarationSyntax*& decl,
SpecifierListSyntax*& specList,
DeclarationScope)
SpecifierListSyntax*& specList)
{
DBG_THIS_RULE();

Expand Down

0 comments on commit 7043881

Please sign in to comment.