InterpreteurRegistres/Lex_Yacc/as.y
2021-07-16 16:04:28 +02:00

85 lines
2.3 KiB
Text

%union {
int nombre;
}
%{
#include "../Tables/tables.h"
#include <stdlib.h>
%}
%token tMUL tDIV tADD tSUB tINF tSUP tEQU
%token tAFC tCPY
%token tLOAD tSTORE tLOADI tSTOREI tSTOREA
%token tJMP tJMZ
%token tGET tPRI tPRIC
%token tCALL tRET
%token tSTOP
%token<nombre> tNB
%%
// Un programme est une suite d'au moins une instruction
Programme : Instruction Programme;
Programme : Instruction;
// Liste de toutes les instructions et conversion
// MUL, ADD, DIV....
Instruction : tMUL tNB tNB tNB {add_instruction(MUL, $2, $3, $4);};
Instruction : tADD tNB tNB tNB {add_instruction(ADD, $2, $3, $4);};
Instruction : tDIV tNB tNB tNB {add_instruction(DIV, $2, $3, $4);};
Instruction : tSUB tNB tNB tNB {add_instruction(SUB, $2, $3, $4);};
Instruction : tINF tNB tNB tNB {add_instruction(INF, $2, $3, $4);};
Instruction : tSUP tNB tNB tNB {add_instruction(SUP, $2, $3, $4);};
Instruction : tEQU tNB tNB tNB {add_instruction(EQU, $2, $3, $4);};
// AFC R val
Instruction : tAFC tNB tNB {add_instruction(AFC, $2, $3, 0);};
// CPY R1 R2
Instruction : tCPY tNB tNB {add_instruction(CPY, $2, $3, 0);};
// LOAD R @
Instruction : tLOAD tNB tNB {add_instruction(LOAD, $2, $3, 0);};
// STORE @ R
Instruction : tSTORE tNB tNB {add_instruction(STORE, $2, $3, 0);};
// LOADI R R
Instruction : tLOADI tNB tNB {add_instruction(LOADI, $2, $3, 0);};
// STOREI R R
Instruction : tSTOREI tNB tNB {add_instruction(STOREI, $2, $3, 0);};
// STOREA @ R
Instruction : tSTOREA tNB tNB {add_instruction(STOREA, $2, $3, 0);};
// JMP Ins
Instruction : tJMP tNB {add_instruction(JMP, $2, 0, 0);};
// JMF @ Ins
Instruction : tJMZ tNB {add_instruction(JMZ, $2, 0, 0);};
// GET @
Instruction : tGET tNB {add_instruction(GET, $2, 0, 0);};
// PRI @
Instruction : tPRI tNB {add_instruction(PRI, $2, 0, 0);};
// PRIC @
Instruction : tPRIC tNB {add_instruction(PRIC, $2, 0, 0);};
// CALL Ins Val
Instruction : tCALL tNB tNB {add_instruction(CALL, $2, $3, 0);};
// RET
Instruction : tRET {add_instruction(RET, 0, 0, 0);};
// STOP Val
Instruction : tSTOP tNB {add_instruction(STOP, $2, 0, 0);};
%%
int main(int argc, char * argv[]) {
if (argc != 2) {
printf("Specifiez le fichier à interpreter");
exit(2);
}
extern FILE * yyin;
yyin = fopen(argv[1], "r");
yyparse();
execute();
return 0;
}