Skip to content

Commit

Permalink
new QualifiedType, work on TypeResolver, semantic fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
ltcmelo committed Aug 4, 2024
1 parent 7772e79 commit 288e741
Show file tree
Hide file tree
Showing 38 changed files with 1,270 additions and 611 deletions.
11 changes: 7 additions & 4 deletions C/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -174,13 +174,14 @@ 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/Binder_End.cpp
${PROJECT_SOURCE_DIR}/binder/DiagnosticsReporter_Binder.cpp
${PROJECT_SOURCE_DIR}/binder/NameSpace.h
${PROJECT_SOURCE_DIR}/binder/Scope.h
${PROJECT_SOURCE_DIR}/binder/Scope.cpp
${PROJECT_SOURCE_DIR}/binder/ScopeKind.h
${PROJECT_SOURCE_DIR}/binder/DeclarationResolver.h
${PROJECT_SOURCE_DIR}/binder/DeclarationResolver.cpp
${PROJECT_SOURCE_DIR}/binder/TypeResolver.h
${PROJECT_SOURCE_DIR}/binder/TypeResolver.cpp

# Types
${PROJECT_SOURCE_DIR}/types/Type.h
Expand All @@ -191,6 +192,8 @@ set(CFE_SOURCES
${PROJECT_SOURCE_DIR}/types/Type_Basic.cpp
${PROJECT_SOURCE_DIR}/types/Type_Function.h
${PROJECT_SOURCE_DIR}/types/Type_Function.cpp
${PROJECT_SOURCE_DIR}/types/Type_Qualified.h
${PROJECT_SOURCE_DIR}/types/Type_Qualified.cpp
${PROJECT_SOURCE_DIR}/types/Type_Pointer.h
${PROJECT_SOURCE_DIR}/types/Type_Pointer.cpp
${PROJECT_SOURCE_DIR}/types/Type_Typedef.h
Expand Down Expand Up @@ -234,8 +237,8 @@ set(CFE_SOURCES
${PROJECT_SOURCE_DIR}/tests/ParserTester_3000_3999.cpp
${PROJECT_SOURCE_DIR}/tests/ReparserTester.h
${PROJECT_SOURCE_DIR}/tests/ReparserTester.cpp
${PROJECT_SOURCE_DIR}/tests/DeclarationResolverTester.h
${PROJECT_SOURCE_DIR}/tests/DeclarationResolverTester.cpp
${PROJECT_SOURCE_DIR}/tests/TypeResolverTester.h
${PROJECT_SOURCE_DIR}/tests/TypeResolverTester.cpp
${PROJECT_SOURCE_DIR}/tests/SemanticModelTester.h
${PROJECT_SOURCE_DIR}/tests/SemanticModelTester.cpp
${PROJECT_SOURCE_DIR}/tests/TestExpectation.h
Expand Down
1 change: 1 addition & 0 deletions C/Fwds.h
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,7 @@ class PointerType;
class TypedefType;
class TagType;
class VoidType;
class QualifiedType;

/* Scopes */
class Scope;
Expand Down
64 changes: 5 additions & 59 deletions C/binder/Binder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -174,80 +174,41 @@ SyntaxVisitor::Action Binder::visitStructOrUnionDeclaration(const StructOrUnionD
return visitStructOrUnionDeclaration_AtSpecifier(node);
}

SyntaxVisitor::Action Binder::visitStructOrUnionDeclaration_AtEnd(const StructOrUnionDeclarationSyntax* node)
{
return visitDeclaration_AtEnd_COMMON(node);
}

SyntaxVisitor::Action Binder::visitTypedefDeclaration(const TypedefDeclarationSyntax* node)
{
return visitTypedefDeclaration_AtSpecifier(node);
}

SyntaxVisitor::Action Binder::visitTypedefDeclaration_AtEnd(const TypedefDeclarationSyntax* node)
{
popTy();

return Action::Skip;
}

SyntaxVisitor::Action Binder::visitEnumDeclaration(const EnumDeclarationSyntax* node)
{
return visitEnumDeclaration_AtSpecifier(node);
}

SyntaxVisitor::Action Binder::visitEnumDeclaration_AtEnd(const EnumDeclarationSyntax* node)
{
return visitDeclaration_AtEnd_COMMON(node);
}

SyntaxVisitor::Action Binder::visitVariableAndOrFunctionDeclaration(
const VariableAndOrFunctionDeclarationSyntax* node)
{
return visitVariableAndOrFunctionDeclaration_AtSpecifiers(node);
}

SyntaxVisitor::Action Binder::visitVariableAndOrFunctionDeclaration_AtEnd(
const VariableAndOrFunctionDeclarationSyntax* node)
{
popTy();

return Action::Skip;
TyContT tys;
std::swap(tys_, tys);
auto action = visitVariableAndOrFunctionDeclaration_AtSpecifiers(node);
std::swap(tys_, tys);
return action;
}

SyntaxVisitor::Action Binder::visitFieldDeclaration(const FieldDeclarationSyntax* node)
{
return visitFieldDeclaration_AtSpecifiers(node);
}

SyntaxVisitor::Action Binder::visitFieldDeclaration_AtEnd(const FieldDeclarationSyntax* node)
{
popTy();

return Action::Skip;
}

SyntaxVisitor::Action Binder::visitEnumeratorDeclaration(const EnumeratorDeclarationSyntax* node)
{
return visitEnumeratorDeclaration_AtImplicitSpecifier(node);
}

SyntaxVisitor::Action Binder::visitEnumeratorDeclaration_AtEnd(const EnumeratorDeclarationSyntax* node)
{
popTy();
return visitDeclaration_AtEnd_COMMON(node);
}

SyntaxVisitor::Action Binder::visitParameterDeclaration(const ParameterDeclarationSyntax* node)
{
return visitParameterDeclaration_AtSpecifiers(node);
}

SyntaxVisitor::Action Binder::visitParameterDeclaration_AtEnd(const ParameterDeclarationSyntax* node)
{
return visitDeclaration_AtEnd_COMMON(node);
}

SyntaxVisitor::Action Binder::visitStaticAssertDeclaration(const StaticAssertDeclarationSyntax*)
{
return Action::Skip;
Expand All @@ -258,21 +219,6 @@ SyntaxVisitor::Action Binder::visitFunctionDefinition(const FunctionDefinitionSy
return visitFunctionDefinition_AtSpecifiers(node);
}

SyntaxVisitor::Action Binder::visitFunctionDefinition_AtEnd(const FunctionDefinitionSyntax* node)
{
return Action::Skip;
}

SyntaxVisitor::Action Binder::visitDeclaration_AtEnd_COMMON(const DeclarationSyntax* node)
{
auto decl = popSymAsDecl();
PSY_ASSERT(decl, return Action::Quit);
SCOPE_AT_TOP(scope);
scope->addDeclaration(decl->asDeclarationSymbol());

return Action::Skip;
}

//------------//
// Statements //
//------------//
Expand Down
3 changes: 2 additions & 1 deletion C/binder/Binder.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ class PSY_C_INTERNAL_API Binder final : protected SyntaxVisitor
std::stack<FunctionType*> pendingFunTys_;
Type* popTy();
void pushTy(Type*);

template <class TyT, class... TyTArgs> TyT* makeTy(TyTArgs... args);

bool decltorIsOfTydef_;
Expand Down Expand Up @@ -219,7 +220,7 @@ SymT* Binder::makeAndBindSym(const SyntaxNode* node, SymTArgs... args)
syms_.top(),
scopes_.top(),
std::forward<SymTArgs>(args)...));
return static_cast<SymT*>(semaModel_->keepAndBindDecl(node, std::move(sym)));
return static_cast<SymT*>(semaModel_->keepBinding(node, std::move(sym)));
}

template <class SymT, class... SymTArgs>
Expand Down
30 changes: 18 additions & 12 deletions C/binder/Binder_Declarators.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,10 @@ SyntaxVisitor::Action Binder::typeSymAtTopAndPopIt()

TY_AT_TOP(ty);

if (!pendingFunTys_.empty())
if (!pendingFunTys_.empty()) {
PSY_ASSERT(!pendingFunTys_.empty(), return Action::Quit);
pendingFunTys_.top()->addParameterType(ty);
}

switch (ty->kind()) {
case TypeKind::Array:
Expand All @@ -73,6 +75,7 @@ SyntaxVisitor::Action Binder::typeSymAtTopAndPopIt()
case TypeKind::Tag:
case TypeKind::Basic:
case TypeKind::Void:
case TypeKind::Qualified:
break;
}

Expand Down Expand Up @@ -208,12 +211,14 @@ SyntaxVisitor::Action Binder::visitArrayOrFunctionDeclarator(const ArrayOrFuncti
case TypeKind::Pointer:
case TypeKind::Basic:
case TypeKind::Void:
case TypeKind::Qualified:
case TypeKind::Tag:
case TypeKind::Typedef:
break;
}
pushTy(makeTy<FunctionType>(ty));
pendingFunTys_.push(tys_.top()->asFunctionType());
auto funcTy = makeTy<FunctionType>(ty);
pushTy(funcTy);
pendingFunTys_.push(funcTy);
break;
}

Expand Down Expand Up @@ -285,6 +290,8 @@ SyntaxVisitor::Action Binder::visitSimpleDeclarator_COMMON(const SyntaxNode* nod
case TypeKind::Array:
case TypeKind::Pointer:
case TypeKind::Basic:
case TypeKind::Void:
case TypeKind::Qualified:
case TypeKind::Typedef:
case TypeKind::Tag: {
SYM_AT_TOP(sym);
Expand Down Expand Up @@ -325,9 +332,6 @@ SyntaxVisitor::Action Binder::visitSimpleDeclarator_COMMON(const SyntaxNode* nod
}
break;
}

default:
PSY_ESCAPE_VIA_RETURN(Action::Quit);
}
break;
}
Expand All @@ -346,8 +350,8 @@ SyntaxVisitor::Action Binder::visitSimpleDeclarator_COMMON(const SyntaxNode* nod
*/
popTy();
TY_AT_TOP(otherTy);
pushTy(makeTy<PointerType>(otherTy));
auto ptrTy = tys_.top()->asPointerType();
auto ptrTy = makeTy<PointerType>(otherTy);
pushTy(ptrTy);
ptrTy->markAsArisingFromArrayDecay();
break;
}
Expand All @@ -358,15 +362,16 @@ SyntaxVisitor::Action Binder::visitSimpleDeclarator_COMMON(const SyntaxNode* nod
* A declaration of a parameter as “function returning type”
* shall be adjusted to “pointer to function returning type”...
*/
pushTy(makeTy<PointerType>(ty));
auto ptrTy = tys_.top()->asPointerType();
auto ptrTy = makeTy<PointerType>(ty);
pushTy(ptrTy);
ptrTy->markAsArisingFromFunctionDecay();
break;
}

case TypeKind::Pointer:
case TypeKind::Basic:
case TypeKind::Void:
case TypeKind::Qualified:
case TypeKind::Typedef:
case TypeKind::Tag:
break;
Expand All @@ -385,9 +390,10 @@ SyntaxVisitor::Action Binder::visitSimpleDeclarator_COMMON(const SyntaxNode* nod
SyntaxVisitor::Action Binder::visitIdentifierDeclarator(const IdentifierDeclaratorSyntax* node)
{
if (decltorIsOfTydef_) {
auto tydefTy = makeTy<TypedefType>(lexemeOrEmptyIdent(node->identifierToken()));
auto tydef = makeAndBindSym<Typedef>(node, tydefTy);
TY_AT_TOP(ty);
SCOPE_AT_TOP(scope);
auto tydefTy = makeTy<TypedefType>(lexemeOrEmptyIdent(node->identifierToken()));
auto tydef = makeAndBindSym<Typedef>(node, tydefTy, ty);
scope->addDeclaration(tydef);
}
else {
Expand Down
95 changes: 95 additions & 0 deletions C/binder/Binder_End.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
// Copyright (c) 2021/22 Leandro T. C. Melo <[email protected]>
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.

#include "Binder.h"
#include "Binder__MACROS__.inc"

#include "SyntaxTree.h"

#include "binder/Scope.h"
#include "compilation/Compilation.h"
#include "symbols/Symbol_ALL.h"
#include "syntax/SyntaxFacts.h"
#include "syntax/Lexeme_ALL.h"
#include "syntax/SyntaxNodes.h"
#include "syntax/SyntaxUtilities.h"
#include "types/Type_ALL.h"

#include "../common/infra/Assertions.h"

#include <iostream>

using namespace psy;
using namespace C;

SyntaxVisitor::Action Binder::visitStructOrUnionDeclaration_AtEnd(const StructOrUnionDeclarationSyntax* node)
{
return visitDeclaration_AtEnd_COMMON(node);
}

SyntaxVisitor::Action Binder::visitEnumDeclaration_AtEnd(const EnumDeclarationSyntax* node)
{
return visitDeclaration_AtEnd_COMMON(node);
}

SyntaxVisitor::Action Binder::visitTypedefDeclaration_AtEnd(const TypedefDeclarationSyntax* node)
{
popTy();
return Action::Skip;
}

SyntaxVisitor::Action Binder::visitVariableAndOrFunctionDeclaration_AtEnd(
const VariableAndOrFunctionDeclarationSyntax* node)
{
popTy();
return Action::Skip;
}

SyntaxVisitor::Action Binder::visitFieldDeclaration_AtEnd(const FieldDeclarationSyntax* node)
{
popTy();
return Action::Skip;
}

SyntaxVisitor::Action Binder::visitEnumeratorDeclaration_AtEnd(const EnumeratorDeclarationSyntax* node)
{
popTy();
return visitDeclaration_AtEnd_COMMON(node);
}

SyntaxVisitor::Action Binder::visitParameterDeclaration_AtEnd(const ParameterDeclarationSyntax* node)
{
return visitDeclaration_AtEnd_COMMON(node);
}

SyntaxVisitor::Action Binder::visitDeclaration_AtEnd_COMMON(const DeclarationSyntax* node)
{
auto decl = popSymAsDecl();
PSY_ASSERT(decl, return Action::Quit);
SCOPE_AT_TOP(scope);
scope->addDeclaration(decl->asDeclarationSymbol());

return Action::Skip;
}

SyntaxVisitor::Action Binder::visitFunctionDefinition_AtEnd(const FunctionDefinitionSyntax* node)
{
return Action::Skip;
}
Loading

0 comments on commit 288e741

Please sign in to comment.