Objetivo: implementar um interpretador para uma máquina baseada em pilha.
Contexto: Diversas linguagens de programação são compiladas para uma máquina abstrata baseada em Pilha. Nessa máquina, os operandos e os resultados das operações são armazenados em um pilha.
Nessa atividade iremos implementar um REPL (Read Eval Print Loop) similar ao que vocês utilizam quando interagem com o Python, porém interpretando comandos para uma máquina baseada em Pilha, como explicado no vídeo abaixo:
https://www.youtube.com/watch?v=_j3jzoZaSbc
Deixarei disponível em https://github.com/profsergiocosta/lab-stackinterpreter o código fonte base para o desenvolvimento. Abaixo está o código que implementa o REPL. Esse código já está interagindo e lendo as entradas do usuário e passando para o interpretador.
#include <stdio.h>
#include "interpret.h"
static void repl()
{
char line[1024];
for (;;)
{
printf("> ");
if (!fgets(line, sizeof(line), stdin))
{
printf("\\n");
break;
}
interpret(line);
}
}
int main () {
repl();
return 0;
}
Nó código base já tem o arquivo de cabeçalho do interpretador:
#ifndef interprete_h
#define interprete_h
void interpret (const char *source) ;
#endif
E também já está disponível a implementação da extração do comando e o argumento passado pelo usuário.
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "interpret.h"
#include "stack"
void interpret (const char *source) {
char op[10];
char arg[10];
sscanf (source, "%s%s", op, arg);
printf("operação: %s\\n", op);
printf("argumento: %s\\n", arg);
}
Então, quando o usuário digitar:
> push 10