Вы не сказали, что язык вы используете, C++ или C.
C++:
Управление переменными в C++ довольно легко, вы будете в основном имеют один карту std::map<string,int> symbol_table;
(предполагая, что ваш переменные - целые числа). В первый раз, когда вы используете переменную, вы вставляете ее в карту, и каждый раз, когда у вас есть объявление, вы обновляете значение на карте. Это очень быстро работает на C++. Конечно, вы должны добавить/обновить эти значения в парсере Yacc.
C:
В C ситуации немного сложнее, нет карты! Итак, вам нужно создать двоичное дерево поиска. Узел в этом дереве будет содержать массив символов - представление имени переменной, и также будет некоторое значение. Когда вы получаете некоторую переменную в первый раз, вам нужно добавить ее в BST, когда вы меняете значение, вам нужно сначала найти его, а затем обновить значение в этом узле.
Примечание: В C есть проблема с выделением памяти, что проблема заключается в распределении имя памяти, вы обычно делаете, что в Lex (к счастью, есть strdup
функция для этого) .`
Я не думаю, пример кода необходим для C++, однако я приведу вам пример в C.
Yacc начало:
%{
#include <stdio.h>
#include <stdlib.h>
#include "tree.h" /* All methods I mentioned above must be implemented */
node *map = NULL; /* You would insert every variable here */
%}
Союз:
%union {
char *s; /* We will allocate memory in Lex */
int value; /* We will update this value in Yacc */
};
Lex:
[a-zA-Z_][a-zA-Z0-9_]* {
yylval.s = strdup(yytext);
if(yylval.s == NULL){
fprintf(stderr,"Unable to allocate memory for variable name.\n");
exit(EXIT_FAILURE);
}
return id_token;
}
Это в основном это. Для выполнения этой работы необходимо проделать определенную работу. Если у вас есть дополнительные вопросы, не стесняйтесь спрашивать.
Непонятно, что вы просите. Судя по полученному вами ответу, вы спрашиваете, как создать таблицу символов времени компиляции, и в этом случае стековая машина совершенно не имеет отношения к вопросу, и вы не зацикливаетесь на генерации кода, вы застряли на таблице символов здание. То, как сформулирован ваш вопрос, похоже, о том, как хранить переменные в объектном коде для стековой машины через генератор кода. – EJP