Справочная информация: я делаю компилятор, сканер и анализатор уже сделаны. У нас есть формальная грамматика, которая определяет программу как:
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 логическое? А потом поместить их все в один хэш-карту идентификаторов?
Спасибо!