Adding var declaration and set statement handling
This commit is contained in:
parent
b09a06d07a
commit
13cb53a437
@ -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;
|
||||
|
||||
@ -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 ;
|
||||
};
|
||||
|
||||
|
||||
@ -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) ;
|
||||
|
||||
11
prog/Makefile
Normal file
11
prog/Makefile
Normal 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
5
prog/main.c
Normal file
@ -0,0 +1,5 @@
|
||||
int main() {
|
||||
int x;
|
||||
x=42;
|
||||
return x;
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user