Adding var declaration and set statement handling

This commit is contained in:
Clément Grennerat
2026-03-02 16:55:58 +01:00
parent b09a06d07a
commit 13cb53a437
5 changed files with 65 additions and 15 deletions
+24 -9
View File
@@ -1,31 +1,46 @@
#include "CodeGenVisitor.h"
#include "generated/ifccParser.h"
antlrcpp::Any CodeGenVisitor::visitStmt(ifccParser::StmtContext *ctx) {
return this->visitChildren(ctx);
}
antlrcpp::Any CodeGenVisitor::visitDecl_stmt(ifccParser::Decl_stmtContext *ctx) {
return 0;
}
antlrcpp::Any CodeGenVisitor::visitSet_stmt(ifccParser::Set_stmtContext *ctx) {
return 0;
}
antlrcpp::Any CodeGenVisitor::visitVal(ifccParser::ValContext *ctx) {
// TODO: return either the const or the variable value from the symbol table
return 0;
}
antlrcpp::Any CodeGenVisitor::visitProg(ifccParser::ProgContext *ctx)
{
#ifdef __APPLE__
std::cout<< ".globl _main\n" ;
std::cout<< " _main: \n" ;
std::cout << ".globl _main\n" ;
std::cout << " _main: \n" ;
#else
std::cout<< ".globl main\n" ;
std::cout<< " main: \n" ;
std::cout << ".globl main\n" ;
std::cout << " main: \n" ;
#endif
this->visit( ctx->return_stmt() );
this->visitChildren(ctx);
std::cout << " ret\n";
return 0;
}
antlrcpp::Any CodeGenVisitor::visitReturn_stmt(ifccParser::Return_stmtContext *ctx)
{
int retval = stoi(ctx->CONST()->getText());
int retval = stoi(ctx->val()->getText());
#ifdef __APPLE__
std::cout << " mov w0, #"<<retval<<"\n" ;
std::cout << " mov w0, #" << retval << "\n" ;
#else
std::cout << " movl $"<<retval<<", %eax\n" ;
std::cout << " movl $" << retval << ", %eax\n" ;
#endif
return 0;
+12 -2
View File
@@ -7,7 +7,17 @@
class CodeGenVisitor : public ifccBaseVisitor {
public:
virtual antlrcpp::Any visitProg(ifccParser::ProgContext *ctx) override ;
virtual antlrcpp::Any visitReturn_stmt(ifccParser::Return_stmtContext *ctx) override;
std::any visitProg(ifccParser::ProgContext *ctx) override ;
std::any visitStmt(ifccParser::StmtContext *ctx) override ;
std::any visitReturn_stmt(ifccParser::Return_stmtContext *ctx) override ;
std::any visitDecl_stmt(ifccParser::Decl_stmtContext *ctx) override ;
std::any visitSet_stmt(ifccParser::Set_stmtContext *ctx) override ;
std::any visitVal(ifccParser::ValContext *ctx) override ;
};
+13 -4
View File
@@ -1,13 +1,22 @@
grammar ifcc;
axiom : prog EOF ;
axiom: prog EOF ;
prog : 'int' 'main' '(' ')' '{' return_stmt '}' ;
prog: 'int' 'main' '(' ')' '{' stmt* '}' ;
return_stmt: RETURN CONST ';' ;
stmt: decl_stmt | set_stmt | return_stmt ;
return_stmt: RETURN val ';' ;
decl_stmt: 'int' VAR_NAME ';' ;
set_stmt: VAR_NAME '=' val ';' ;
val: CONST | VAR_NAME ;
RETURN : 'return' ;
CONST : [0-9]+ ;
VAR_NAME : [0-9a-zA-Z_]+ ;
COMMENT : '/*' .*? '*/' -> skip ;
DIRECTIVE : '#' .*? '\n' -> skip ;
WS : [ \t\r\n] -> channel(HIDDEN);
WS : [ \t\r\n] -> channel(HIDDEN) ;