Skip to content

Commit

Permalink
simplify classes/files around binder (decl, decltors, specs, quals)
Browse files Browse the repository at this point in the history
  • Loading branch information
ltcmelo committed Apr 21, 2024
1 parent c3326a0 commit 2bacbd1
Show file tree
Hide file tree
Showing 20 changed files with 293 additions and 637 deletions.
8 changes: 0 additions & 8 deletions C/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -182,19 +182,11 @@ set(CFE_SOURCES
${PROJECT_SOURCE_DIR}/binder/Binder.cpp
${PROJECT_SOURCE_DIR}/binder/Binder_Declarators.cpp
${PROJECT_SOURCE_DIR}/binder/Binder_Specifiers.cpp
${PROJECT_SOURCE_DIR}/binder/ConstraintsInDeclarations.h
${PROJECT_SOURCE_DIR}/binder/ConstraintsInDeclarations.cpp
${PROJECT_SOURCE_DIR}/binder/ConstraintsInDeclarators.h
${PROJECT_SOURCE_DIR}/binder/ConstraintsInDeclarators.cpp
${PROJECT_SOURCE_DIR}/binder/ConstraintsInTypeSpecifiers.h
${PROJECT_SOURCE_DIR}/binder/ConstraintsInTypeSpecifiers.cpp
${PROJECT_SOURCE_DIR}/binder/DiagnosticsReporter_Binder.cpp
${PROJECT_SOURCE_DIR}/binder/DiagnosticsReporter_TypeChecker.cpp
${PROJECT_SOURCE_DIR}/binder/NameSpace.h
${PROJECT_SOURCE_DIR}/binder/NameSpaces.h
${PROJECT_SOURCE_DIR}/binder/NameSpaceKind.h
${PROJECT_SOURCE_DIR}/binder/SemanticsOfTypeQualifiers.h
${PROJECT_SOURCE_DIR}/binder/SemanticsOfTypeQualifiers.cpp
${PROJECT_SOURCE_DIR}/binder/Scope.h
${PROJECT_SOURCE_DIR}/binder/Scope.cpp
${PROJECT_SOURCE_DIR}/binder/ScopeKind.h
Expand Down
3 changes: 1 addition & 2 deletions C/binder/Binder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
#include "SyntaxTree.h"

#include "binder/Scope.h"
#include "binder/ConstraintsInDeclarations.h"
#include "compilation/SemanticModel.h"
#include "symbols/Symbol_ALL.h"
#include "symbols/SymbolName_ALL.h"
Expand Down Expand Up @@ -152,7 +151,7 @@ SyntaxVisitor::Action Binder::visitTranslationUnit(const TranslationUnitSyntax*

SyntaxVisitor::Action Binder::visitIncompleteDeclaration(const IncompleteDeclarationSyntax* node)
{
ConstraintsInDeclarations::UselessDeclaration(node->lastToken(), &diagReporter_);
diagReporter_.UselessDeclaration(node->lastToken());

for (auto specIt = node->specifiers(); specIt; specIt = specIt->next)
;
Expand Down
25 changes: 21 additions & 4 deletions C/binder/Binder.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,6 @@ class PSY_C_NON_API Binder final : protected SyntaxVisitor

PSY_INTERNAL_AND_RESTRICTED:
PSY_GRANT_ACCESS(SemanticModel);
PSY_GRANT_ACCESS(ConstraintsInDeclarations);
PSY_GRANT_ACCESS(ConstraintsInTypeSpecifiers);
PSY_GRANT_ACCESS(ConstraintsInDeclarators);
PSY_GRANT_ACCESS(SemanticsOfTypeQualifiers);

Binder(SemanticModel* semaModel, const SyntaxTree* tree);
~Binder();
Expand Down Expand Up @@ -102,7 +98,28 @@ class PSY_C_NON_API Binder final : protected SyntaxVisitor
: binder_(binder)
{}
Binder* binder_;

void diagnose(DiagnosticDescriptor&& desc, SyntaxToken tk);

/* Declarations */
void UselessDeclaration(SyntaxToken declTk);
static const std::string ID_of_UselessDeclaration;

/* Declarators */
void FunctionReturningFunction(SyntaxToken decltorTk);
void FunctionReturningArray(SyntaxToken decltorTk);
static const std::string ID_FunctionReturningFunction;
static const std::string ID_FunctionReturningArray;

/* Type specifiers */
void TypeSpecifierMissingDefaultsToInt(SyntaxToken declTk);
void TwoOrMoreDataTypesInDeclarationSpecifiers(SyntaxToken tySpecTk);
static const std::string ID_TypeSpecifierMissingDefaultsToInt;
static const std::string ID_TwoOrMoreDataTypesInDeclarationSpecifiers;

/* Type qualifiers */
void InvalidUseOfRestrict(SyntaxToken tyQualTk);
static const std::string ID_InvalidUseOfRestrict;
};

DiagnosticsReporter diagReporter_;
Expand Down
11 changes: 4 additions & 7 deletions C/binder/Binder_Declarators.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
#include "SyntaxTree.h"

#include "binder/Scope.h"
#include "binder/ConstraintsInDeclarators.h"
#include "compilation/SemanticModel.h"
#include "symbols/Symbol_ALL.h"
#include "symbols/SymbolName_ALL.h"
Expand Down Expand Up @@ -191,15 +190,13 @@ SyntaxVisitor::Action Binder::visitArrayOrFunctionDeclarator(const ArrayOrFuncti
auto tySym = tySyms_.top();
switch (tySym->typeKind()) {
case TypeKind::Function:
ConstraintsInDeclarators::FunctionReturningFunction(
node->innerDeclarator()->firstToken(),
&diagReporter_);
diagReporter_.FunctionReturningFunction(
node->innerDeclarator()->firstToken());
break;

case TypeKind::Array:
ConstraintsInDeclarators::FunctionReturningArray(
node->innerDeclarator()->firstToken(),
&diagReporter_);
diagReporter_.FunctionReturningArray(
node->innerDeclarator()->firstToken());
break;

case TypeKind::Pointer:
Expand Down
179 changes: 165 additions & 14 deletions C/binder/Binder_Specifiers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@
#include "SyntaxTree.h"

#include "binder/Scope.h"
#include "binder/SemanticsOfTypeQualifiers.h"
#include "binder/ConstraintsInTypeSpecifiers.h"
#include "compilation/SemanticModel.h"
#include "symbols/Symbol_ALL.h"
#include "symbols/SymbolName_ALL.h"
Expand Down Expand Up @@ -106,7 +104,7 @@ SyntaxVisitor::Action Binder::visitDeclaration_AtSpecifiers_COMMON(
visitIfNotTypeQualifier(specIt->value);

if (tySyms_.empty()) {
ConstraintsInTypeSpecifiers::TypeSpecifierMissingDefaultsToInt(node->lastToken(), &diagReporter_);
diagReporter_.TypeSpecifierMissingDefaultsToInt(node->lastToken());
makeTySymAndPushIt<NamedTypeSymbol>(BuiltinTypeKind::Int);
}

Expand Down Expand Up @@ -174,9 +172,11 @@ SyntaxVisitor::Action Binder::visitIfTypeQualifier(const SpecifierSyntax* spec)

SyntaxVisitor::Action Binder::visitBuiltinTypeSpecifier(const BuiltinTypeSpecifierSyntax* node)
{
auto tySpecTk = node->specifierToken();

if (tySyms_.empty()) {
BuiltinTypeKind builtTyK;
switch (node->specifierToken().kind()) {
switch (tySpecTk.kind()) {
case Keyword_void:
builtTyK = BuiltinTypeKind::Void;
break;
Expand Down Expand Up @@ -215,14 +215,145 @@ SyntaxVisitor::Action Binder::visitBuiltinTypeSpecifier(const BuiltinTypeSpecifi
}

makeTySymAndPushIt<NamedTypeSymbol>(builtTyK);
return Action::Skip;
}
else {
NamedTypeSymbol* namedTySym = tySyms_.top()->asNamedType();
ConstraintsInTypeSpecifiers::specify(node->specifierToken(),
namedTySym,
&diagReporter_);

NamedTypeSymbol* namedTySym = tySyms_.top()->asNamedType();
auto curBuiltTyK = namedTySym->builtinTypeKind();
BuiltinTypeKind extraBuiltTyK;
switch (curBuiltTyK) {
case BuiltinTypeKind::UNSPECIFIED:
switch (tySpecTk.kind()) {
case Keyword_void:
extraBuiltTyK = BuiltinTypeKind::Void;
break;
case Keyword_char:
extraBuiltTyK = BuiltinTypeKind::Char;
break;
case Keyword_short:
extraBuiltTyK = BuiltinTypeKind::Short;
break;
case Keyword_int:
extraBuiltTyK = BuiltinTypeKind::Int;
break;
case Keyword_long:
extraBuiltTyK = BuiltinTypeKind::Long;
break;
case Keyword_float:
extraBuiltTyK = BuiltinTypeKind::Float;
break;
case Keyword_double:
extraBuiltTyK = BuiltinTypeKind::Double;
break;
case Keyword__Bool:
extraBuiltTyK = BuiltinTypeKind::Bool;
break;
case Keyword__Complex:
extraBuiltTyK = BuiltinTypeKind::DoubleComplex;
break;
case Keyword_signed:
extraBuiltTyK = BuiltinTypeKind::Int_S;
break;
case Keyword_unsigned:
extraBuiltTyK = BuiltinTypeKind::Int_U;
break;
default:
PSY_ESCAPE_VIA_RETURN(Action::Skip);
}
break;

case BuiltinTypeKind::Void:
// report
return Action::Skip;

case BuiltinTypeKind::Char:
switch (tySpecTk.kind()) {
case Keyword_signed:
extraBuiltTyK = BuiltinTypeKind::Char_S;
break;
case Keyword_unsigned:
extraBuiltTyK = BuiltinTypeKind::Char_U;
break;
default:
// report
return Action::Skip;
}
break;

case BuiltinTypeKind::Char_S:
case BuiltinTypeKind::Char_U:
// report
return Action::Skip;

case BuiltinTypeKind::Short:
switch (tySpecTk.kind()) {
case Keyword_signed:
extraBuiltTyK = BuiltinTypeKind::Short_S;
break;
case Keyword_unsigned:
extraBuiltTyK = BuiltinTypeKind::Short_U;
break;
default:
// report
return Action::Skip;
}
break;

case BuiltinTypeKind::Short_S:
case BuiltinTypeKind::Short_U:
// report
return Action::Skip;

case BuiltinTypeKind::Int:
switch (tySpecTk.kind()) {
case Keyword_long:
extraBuiltTyK = BuiltinTypeKind::Long;
break;
case Keyword_signed:
extraBuiltTyK = BuiltinTypeKind::Int_S;
break;
case Keyword_unsigned:
extraBuiltTyK = BuiltinTypeKind::Int_U;
break;
default:
diagReporter_.TwoOrMoreDataTypesInDeclarationSpecifiers(tySpecTk);
return Action::Skip;
}
break;

case BuiltinTypeKind::Int_S:
case BuiltinTypeKind::Int_U:
// report
return Action::Skip;

case BuiltinTypeKind::Long:
switch (tySpecTk.kind()) {
case Keyword_int:
return Action::Skip;
case Keyword_signed:
extraBuiltTyK = BuiltinTypeKind::Long_S;
break;
case Keyword_unsigned:
extraBuiltTyK = BuiltinTypeKind::Long_U;
break;
default:
diagReporter_.TwoOrMoreDataTypesInDeclarationSpecifiers(tySpecTk);
return Action::Skip;
}
break;

case BuiltinTypeKind::Long_S:
case BuiltinTypeKind::Long_U:
// report
return Action::Skip;

default:
PSY_ESCAPE_VIA_RETURN(Action::Skip);
}

if (extraBuiltTyK != curBuiltTyK)
namedTySym->patchBuiltinTypeKind(extraBuiltTyK);

return Action::Skip;
}

Expand Down Expand Up @@ -257,9 +388,7 @@ SyntaxVisitor::Action Binder::visitTagTypeSpecifier(const TagTypeSpecifierSyntax
for (auto declIt = node->declarations(); declIt; declIt = declIt->next) {
TySymContT tySyms;
std::swap(tySyms_, tySyms);

visit(declIt->value);

std::swap(tySyms_, tySyms);
}

Expand Down Expand Up @@ -309,10 +438,32 @@ SyntaxVisitor::Action Binder::visitTypedefName(const TypedefNameSyntax* node)
SyntaxVisitor::Action Binder::visitTypeQualifier(const TypeQualifierSyntax* node)
{
PSY_ASSERT(!tySyms_.empty(), return Action::Quit);
TypeSymbol* tySym = tySyms_.top();

const auto tyQualTk = node->qualifierKeyword();
switch (tyQualTk.kind()) {
case Keyword_const:
tySym->qualifyWithConst();
break;

case Keyword_volatile:
tySym->qualifyWithVolatile();
break;

case Keyword_restrict:
if (tySym->typeKind() == TypeKind::Pointer)
tySym->qualifyWithRestrict();
else
diagReporter_.InvalidUseOfRestrict(tyQualTk);
break;

SemanticsOfTypeQualifiers::qualify(node->qualifierKeyword(),
tySyms_.top(),
&diagReporter_);
case Keyword__Atomic:
tySym->qualifyWithAtomic();
break;

default:
PSY_ESCAPE_VIA_BREAK;
}

return Action::Skip;
}
38 changes: 0 additions & 38 deletions C/binder/ConstraintsInDeclarations.cpp

This file was deleted.

Loading

0 comments on commit 2bacbd1

Please sign in to comment.