Найти в Дзене
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 минута