2015 подписчиков
👣 Задача лексический анализ (lex.go)
Пусть идентификатор — это последовательность латинских букв и цифр, начинающаяся с буквы.
Известно, что в некоторой строке записаны идентификаторы, разделённые произвольным количеством пробелов. При этом строка может начинаться и заканчиваться произвольным количеством пробелов. Назовём такую строку предложением.
Лексический анализ предложения заключается в выделении из него последовательности записанных в нём идентификаторов. В результате лексического анализа получается массив целых чисел, каждое из которых соответствует одному из идентификаторов. Целые числа назначаются идентификаторам произвольно, но так, чтобы разным идентификаторам соответствовали разные числа, а равным идентификаторам — одинаковые числа.
Пример. Пусть дано предложение
alpha x1 beta alpha x1 y
Тогда на выходе лексического анализатора может получиться последовательность чисел
1 2 3 1 2 4
Здесь число 1 соответствует идентификатору alpha, число 2 — идентификатору x1, число 3 — идентификатору beta, а число 4 — идентификатору y.
Необходимо разработать функцию lex, выполняющую лексический анализ предложения:
func lex(sentence string, array AssocArray) []int {
...
}
В качестве первого параметра функция lex принимает предложение, а второй параметр задаёт ассоциативный массив, который должен быть использован внутри функции для хранения соответствия идентификаторов и целых чисел.
Ассоциативный массив, который можно передавать в функцию lex, должен реализовывать интерфейс AssocArray:
type AssocArray interface {
Assign(s string, x int)
Lookup(s string) (x int, exists bool)
}
Метод Assign добавляет в ассоциативный массив словарную пару.
Метод Lookup выполняет поиск словарной пары по ключу и возвращает два значения: x и exists. Если словарной пары с указанным ключом в массиве нет, то exists принимает значение false. В противном случае exists равен true, а x — связанное с ключом значение.
Составьте программу lex.go, демонстрирующую работоспособность функции lex. В качестве ассоциативных массивов для тестирования функции lex нужно использовать список с пропусками и АВЛ-дерево.
Пишите свой ответ в комментариях👇
1 минута
2 марта 2023