Adding var declaration and set statement handling
This commit is contained in:
parent
b09a06d07a
commit
13cb53a437
@ -1,5 +1,21 @@
|
|||||||
#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__
|
||||||
@ -10,17 +26,16 @@ antlrcpp::Any CodeGenVisitor::visitProg(ifccParser::ProgContext *ctx)
|
|||||||
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" ;
|
||||||
|
|||||||
@ -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 ;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -2,12 +2,21 @@ 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
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