Пред.Страница След.Страница  Раздел Содержание

6.3. Таблица лексем

Таблица лексем может быть реализована различными способами в зависимости от ограничений, накладываемых входным языком. Если язык предусматривает использование идентификаторов и чисел фиксированной длины, например, не более 8 символов, то для хранения таблицы символов можно использовать массив строк ограниченной длины или двумерный массив символов. Если же в языке разрешается использовать длинные идентификаторы, например, до 128 символов, то использование массивов с элементами фиксированного размена может оказаться неэффективным. В этой ситуации слишком много памяти будет выделяться для коротких идентификаторов.

В общем случае для хранения символьного представления лексем можно использовать одномерный массив символов с разделителями, завершающими каждую лексему. Таким разделителем может служить любой символ, который не может встречаться в идентификаторах или числах. Если в качестве такого разделителя выбрать символ @, то строка

x11 = b | ch & y12

будет представлена в таблице лексем следующем виде:

 

 

Рис.6.3. Символьное представление лексем в LexTab.

 

Идентификатор каждой переменной или числовая константа могут повторяться в тексте программы несколько раз. Естественно, что такие идентификаторы и числа не имеет смысла хранить в нескольких экземплярах. Чтобы избежать повторных записей в таблицу лексем после каждого обнаружения лексемы в тексте программы необходимо проверять, не находится ли уже такая лексема в таблице. Если лексема отсутствует, то необходимо записать ее в таблицу. Если же она уже содержится в таблице, то выполнять запись не нужно.

Для реализации описанных действий определим два метода scan(lx) и putIn(lx). Первый метод должен выполнять поиск лексемы lx в LexTab. Он должен возвращать 0, если ни одна лексема не совпадает с заданной, или указатель на найденную лексему в противном случае. Метод putIn(lx) должен выполнять запись лексемы lx в первую свободную позицию в конце таблицы и возвращать указатель на записанную лексему.

Еще одна проблема, возникающая при построении лексического анализатора, связана с использованием ключевых слов, которые обычно состоят из букв, и поэтому могут рассматриваться анализатором как идентификаторы. Один из путей решения этой проблемы заключается в том, что все ключевые слова на стадии инициализации заносятся в LexTab с помощью метода putIn(lx). Таким образом первые k позиций таблицы оказываются заполненными ключевыми словами. После выделения очередной лексемы анализатор должен проверить наличие такой лексемы в LexTab с помощью метода scan(). Если оказывается, что лексема в таблице уже есть и указатель, возвращаемый методом scan() не превышает значения указателя на позицию k, то лексема является ключевым словом. В противном случае лексема является идентификатором.

В заключении заметим, что числовые константы могут сохраняться вместе с идентификаторами в LexTab в символьном виде. В этом случае преобразование констант в числовой формат должно выполняться на этапе синтаксического анализа при выделении памяти или формировании атомов. Другой способ хранения чисел заключается в использовании специальной таблицы, в которую заносятся как символьные, так и числовые значения.

 

Пред.Страница След.Страница  Раздел Содержание