0

Для моего класса, я должен написать компилятор для крошечного подмножества Python:Как хранить переменные из таблицы символов Составители

  • Этот язык один метод
  • Там не функционирует, так что я 'm имеет дело только с одним лексическим областью

Это подмножество Python будет переведено на байт-код Java. Я уже делал лексический анализ и дерево синтаксического анализа (используя lex и yacc). Я застрял в генерации кода.

Мы используем Gnoloo для генерации кода, языка машинных стеков.

Проблема в том, что я не знаю, как хранить переменные. Я знаю, что мне нужно использовать таблицу символов, но я не знаю, как ее заполнить.

Должен ли я хранить значение переменных?

Если код имеет x = 2, будет ли у symtable поле для этого?

Как сохранить переменные для стековых машин.

+0

Непонятно, что вы просите. Судя по полученному вами ответу, вы спрашиваете, как создать таблицу символов времени компиляции, и в этом случае стековая машина совершенно не имеет отношения к вопросу, и вы не зацикливаетесь на генерации кода, вы застряли на таблице символов здание. То, как сформулирован ваш вопрос, похоже, о том, как хранить переменные в объектном коде для стековой машины через генератор кода. – EJP

ответ

0

Вы не сказали, что язык вы используете, 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; 
} 

Это в основном это. Для выполнения этой работы необходимо проделать определенную работу. Если у вас есть дополнительные вопросы, не стесняйтесь спрашивать.

+0

Поблагодарите u !, я использую java. Моя проблема в том, что я должен сгенерировать код для стека. Предположим, что исходный код имеет два оператора: x = 2 * 3 и более поздние y = 2 + x. Я не знаю, как отслеживать, где я загрузил x. Как я могу это сделать?. – MadDog

+0

Ну, вы можете использовать Hash Map или словарь для этого. Это в основном то же, что я описал для C++. Подробнее читайте здесь http://stackoverflow.com/questions/267312/difference-between-a-hashmap-and-a-dictionary-adt хэш-карты и словари. –

Смежные вопросы