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

View File

@ -1,31 +1,46 @@
#include "CodeGenVisitor.h" #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) antlrcpp::Any CodeGenVisitor::visitProg(ifccParser::ProgContext *ctx)
{ {
#ifdef __APPLE__ #ifdef __APPLE__
std::cout<< ".globl _main\n" ; std::cout << ".globl _main\n" ;
std::cout<< " _main: \n" ; std::cout << " _main: \n" ;
#else #else
std::cout<< ".globl main\n" ; std::cout << ".globl main\n" ;
std::cout<< " main: \n" ; std::cout << " main: \n" ;
#endif #endif
this->visit( ctx->return_stmt() ); this->visitChildren(ctx);
std::cout << " ret\n"; std::cout << " ret\n";
return 0; return 0;
} }
antlrcpp::Any CodeGenVisitor::visitReturn_stmt(ifccParser::Return_stmtContext *ctx) antlrcpp::Any CodeGenVisitor::visitReturn_stmt(ifccParser::Return_stmtContext *ctx)
{ {
int retval = stoi(ctx->CONST()->getText()); int retval = stoi(ctx->val()->getText());
#ifdef __APPLE__ #ifdef __APPLE__
std::cout << " mov w0, #"<<retval<<"\n" ; std::cout << " mov w0, #" << retval << "\n" ;
#else #else
std::cout << " movl $"<<retval<<", %eax\n" ; std::cout << " movl $" << retval << ", %eax\n" ;
#endif #endif
return 0; return 0;

View File

@ -7,7 +7,17 @@
class CodeGenVisitor : public ifccBaseVisitor { class CodeGenVisitor : public ifccBaseVisitor {
public: 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 ;
}; };

View File

@ -1,13 +1,22 @@
grammar ifcc; 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' ; RETURN : 'return' ;
CONST : [0-9]+ ; CONST : [0-9]+ ;
VAR_NAME : [0-9a-zA-Z_]+ ;
COMMENT : '/*' .*? '*/' -> skip ; COMMENT : '/*' .*? '*/' -> skip ;
DIRECTIVE : '#' .*? '\n' -> skip ; DIRECTIVE : '#' .*? '\n' -> skip ;
WS : [ \t\r\n] -> channel(HIDDEN); WS : [ \t\r\n] -> channel(HIDDEN) ;

11
prog/Makefile Normal file
View File

@ -0,0 +1,11 @@
gcc: gcca main-gcc.asm
gcc -o main-gcc.o main-gcc.asm
gcca: main.c
gcc -S -o main-gcc.asm main.c
ifcc: ifcca main-ifcc.asm
gcc -o main-ifcc.o main-ifcc.asm
ifcca: main.c comp-ifcc
../compiler/ifcc main.c > main-ifcc.asm
comp-ifcc:
cd ../compiler && make

5
prog/main.c Normal file
View File

@ -0,0 +1,5 @@
int main() {
int x;
x=42;
return x;
}