projet_systeme/interpreter/src/interpreter.y
2021-05-09 19:55:27 +02:00

97 lines
2 KiB
Text
Executable file

%{
#include <stdio.h>
#include "instructions.h"
int yylex();
void yyerror(char*);
int yydebug = 1;
extern int yylineno;
%}
/* Union for yylval */
%union {
int nb;
}
%token tADD tMUL tSOU tDIV tCOP tAFC tJMP tJMF tPRI tRET tCALL
%token tLT tLTE tGT tGTE tEQ tNEQ tAND tOR tNOT
%token tLEA tCOP_LD tCOP_STR
%token tOB tCB
%token <nb> tNB
%%
%start File;
File:
Instructions;
Instructions:
/* epsilon */
| Instructions Instruction
;
Instruction:
tADD tNB tNB tNB
{asm_add_3(ADD, $2, $3, $4);}
| tMUL tNB tNB tNB
{asm_add_3(MUL, $2, $3, $4);}
| tSOU tNB tNB tNB
{asm_add_3(SOU, $2, $3, $4);}
| tDIV tNB tNB tNB
{asm_add_3(DIV, $2, $3, $4);}
| tCOP tNB tNB
{asm_add_2(COP, $2, $3);}
| tAFC tNB tNB
{asm_add_2(AFC, $2, $3);}
| tJMP tNB
{asm_add_1(JMP, $2);}
| tJMF tNB tNB
{asm_add_2(JMF, $2, $3);}
| tLT tNB tNB tNB
{asm_add_3(LT, $2, $3, $4);}
| tGT tNB tNB tNB
{asm_add_3(GT, $2, $3, $4);}
| tLTE tNB tNB tNB
{asm_add_3(LTE, $2, $3, $4);}
| tGTE tNB tNB tNB
{asm_add_3(GTE, $2, $3, $4);}
| tAND tNB tNB tNB
{asm_add_3(AND, $2, $3, $4);}
| tOR tNB tNB tNB
{asm_add_3(OR, $2, $3, $4);}
| tEQ tNB tNB tNB
{asm_add_3(EQ, $2, $3, $4);}
| tNEQ tNB tNB tNB
{asm_add_3(NEQ, $2, $3, $4);}
| tNOT tNB tNB
{asm_add_2(NOT, $2, $3);}
| tPRI tNB
{asm_add_1(PRI, $2);}
| tLEA tNB tNB
{asm_add_2(LEA, $2, $3);}
| tCOP_LD tNB tOB tNB tCB
{asm_add_2(COP_LD, $2, $4);}
| tCOP_STR tOB tNB tCB tNB
{asm_add_2(COP_STR, $3, $5);}
| tRET tNB
{asm_add_1(RET, $2);}
| tCALL tNB tNB
{asm_add_2(CALL, $2, $3);}
;
%%
void yyerror(char* str) {
extern int yylineno;
fprintf(stderr, "ERROR yyparse : Line %d: %s\n", yylineno, str);
}
int main(int argc, char *argv[]) {
asm_init();
yyparse();
printf("INFO yyparse : Parsing End\n");
asm_run();
return 0;
}