aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/semantic/scope.h23
-rw-r--r--include/semantic/semantic_analyzer.h46
-rw-r--r--include/semantic/symbol.h38
-rw-r--r--include/semantic/symbol_table.h25
-rw-r--r--include/semantic/symbol_type.h7
5 files changed, 139 insertions, 0 deletions
diff --git a/include/semantic/scope.h b/include/semantic/scope.h
new file mode 100644
index 0000000..aa13fe3
--- /dev/null
+++ b/include/semantic/scope.h
@@ -0,0 +1,23 @@
+#pragma once
+
+#include <string>
+#include <memory>
+
+class Scope {
+public:
+ explicit Scope(std::string name, int level, std::unique_ptr<Scope> parent);
+ std::string getScopeName();
+ int getScopeLevel();
+ std::unique_ptr<Scope> getParentScope();
+ void define(Symbol symbol);
+ std::unique_ptr<Symbol> lookup(std::string name);
+ bool isDeclared(std::string name);
+ std::unordered_map<std::string, Symbol> getAllSymbols();
+ std::string toString();
+
+private:
+ std::string scope_name;
+ int scope_level
+ std::unique_ptr<Scope> parent_scope;
+ std::unordered_map<std::string, Symbol>;
+};
diff --git a/include/semantic/semantic_analyzer.h b/include/semantic/semantic_analyzer.h
new file mode 100644
index 0000000..0d56599
--- /dev/null
+++ b/include/semantic/semantic_analyzer.h
@@ -0,0 +1,46 @@
+#pragma once
+
+class SemanticAnalyzer {
+public:
+ explicit SemanticAnalyzer();
+ bool analyze(ASTNode* ast);
+ std::vector<Error> getErrors();
+ std::vector<Error> getWarnings();
+ bool hasErrors();
+
+ // Main visitor method
+ std::string visit(ASTNode* ast);
+
+ // Visitor methods for program structure
+ std::string visitProgram(ProgramNode* node);
+ std::string visitFunctionDecl(FunctionDeclNode* node);
+ std::string visitParameter(ParameterNode*);
+
+ // Visitor methods for statements
+ std::string visitVarDeclaration(VarDeclNode* node);
+ std::string visitAssignment(AssignmentNode* node);
+ std::string visitIfStatement(IfStatementNode* node);
+ std::string visitWhileStatement(WhileStatementNode* node);
+ std::string visitForStatement(ForStatementNode* node);
+ std::string visitReturnStatement(ReturnStatementNode* node);
+ std::String visitExpressionStatement(ExpressionStatementNode* node);
+
+ // Visitor methods for expressions
+ std::string visitBinaryExpression(BinaryExprNode* node);
+ std::string visitUnaryExpression(UnaryExprNode* node);
+ std::string visitFunctionCall(FunctionCallNode* node);
+ std::string visitIdentifier(IdentifierNode* node);
+ std::string visitLiteral(LiteralNode* node);
+
+ // Type checking helper methods
+ bool checkTypeCompatibility(std::string target, std::string source);
+ std::string inferBinaryOpType(std::string op, std::string left, std::string right);
+
+private:
+ SymbolTable symbol_table;
+ std::vector<Error> errors;
+ std::vector<Error> warnings;
+ FunctionDeclNode* current_function;
+ std::string current_function_return_type;
+ bool has_main_function;
+};
diff --git a/include/semantic/symbol.h b/include/semantic/symbol.h
new file mode 100644
index 0000000..3cb4290
--- /dev/null
+++ b/include/semantic/symbol.h
@@ -0,0 +1,38 @@
+#pragma once
+
+#include <string>
+#include <vector>
+
+#include "types.h"
+
+class Symbol {
+public:
+ explicit Symbol(std::string name, SymbolType type, std::string data_type, int scope);
+ std::string getName();
+ SymbolType getSymbolType();
+ std::string getDataType();
+ int getScopeLevel();
+ bool isInitialized();
+ void setInitialized(bool init);
+ bool isParameter();
+ void setParameter(bool is_param);
+ std::vector<std::string> getParameterTypes();
+ void setParameterTypes(std::vector<std::string> types);
+ std::string getReturnType();
+ void setReturnType(std::string type);
+ int getLineDeclared();
+ void setLineDeclared(int line);
+ std::string toString();
+
+private:
+ std::string name;
+ SymbolType symbol_type
+ std::string data_type
+ int scope_level
+ bool is_initialized
+ bool is_parameter
+ std::vector<std::string> parameter_types
+ std::string return_type
+ int line_declared
+ int column_declared
+};
diff --git a/include/semantic/symbol_table.h b/include/semantic/symbol_table.h
new file mode 100644
index 0000000..b2b8270
--- /dev/null
+++ b/include/semantic/symbol_table.h
@@ -0,0 +1,25 @@
+#pragma once
+
+class SymbolTable {
+public:
+ explicit SymbolTable();
+ ~SymbolTable() = default;
+ void enterScope(std::string scope_name);
+ void exitScope();
+ Scope* getCurrentScope();
+ Scope* getGlobalScope();
+ int getScopeLevel();
+ void insert(Symbol symbol);
+ Symbol* lookup(std::string name);
+ Symbol* lookupCurrentScope(std::string name);
+ bool isDeclared(std::string name);
+ bool isDeclaredInCurrentScope(std::string name);
+ void display();
+ std::string toString();
+
+private:
+ std::vector<std::unique_ptr<Scope>> scopes;
+ Scope* current_scope;
+ int scope_level;
+ Scope* global_scope;
+};
diff --git a/include/semantic/symbol_type.h b/include/semantic/symbol_type.h
new file mode 100644
index 0000000..a792c09
--- /dev/null
+++ b/include/semantic/symbol_type.h
@@ -0,0 +1,7 @@
+#pragma once
+
+enum class SymbolType {
+ VARIABLE,
+ FUNCTION,
+ PARAMETER,
+};