Хранение переменных и констант во время компиляции. (образец языка) - PullRequest
0 голосов
/ 25 октября 2010

Справочная информация: я делаю компилятор, сканер и анализатор уже сделаны. У нас есть формальная грамматика, которая определяет программу как:

program = 
 declarations 
 procedureDeclarations
 main  (  ){  
     declarations 
     statementSequence
 }

Таким образом, вы можете заметить, что объявления могут быть глобальными или локальными для метода main. Поэтому, когда я разбираю, мне нужен способ хранения этих трех вещей: является ли входящий идентификатор: константой или переменной (я могу сказать, по какому методу синтаксического анализа я нахожусь, parseConst () или parseVar ()), глобальный или local, его настоящее имя и значение (если я его еще знаю).

Я немного растерялся, как хранить все это. В моем классе структур данных у нас есть только 2 вещи, которые нужно хранить: ключ и значение. Так бы у меня было что-то вроде:

 identHashMap<String, String> // where the first string is the ident's name, and the second is if it's a constant or var (this could be a boolean also)
 constantIdentifiers<String, String> // first string is the ident's name, second is whether it's local/global (could be a string)
 varIdentifiers<String, String> // first string is the ident's name, second is whether it's local/global (could be a string)
 identifierValues<String, Integer> // ident's name, Ident's value

кажется, что слишком много структур данных для простой задачи. Должен ли я создать класс, Identifier и иметь глобальное / локальное логическое поле, а также константу / var логическое? А потом поместить их все в один хэш-карту идентификаторов?

Спасибо!

1 Ответ

0 голосов
/ 25 октября 2010

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

...