ЗНАЙ ИНТУИТ, Лекция, Лексикален анализ
Лексема атрибути
Тъй като е доста често повече от един маркер да принадлежи към един и същ лексикален клас, лексикалният анализатор трябва да предоставя допълнителна информация за това кой конкретен маркер е бил разпределен. Например и ред 1, и ред 0 ще попаднат в лексикалния клас Number_LC, но би било полезно за следващите етапи на компилатора (да речем, генератора на код) да се знае конкретната стойност на константата в оригиналната програма. Такава информация може да бъде записана в атрибути лексеми; обикновено токенът има само един атрибут - връзка към някаква таблица с допълнителна информация. За диагностични цели можем също да съхраняваме номерата на началния и крайния ред на този маркер в оригиналната програма.
Пример. Помислете за следния фрагмент на програма C #:
Последният оператор генерира следната последователност от символи и техните атрибути:
Ще приемем, че сме дефинирали типа, съответстващ на указателя към тази таблица - ReprInd, и типа, който служи за представяне на позицията в изходния файл - FilePos. В този случай можем напълно да дефинираме маркера, както следва:
Преглед на таблицата
Таблицата с изгледи съхранява едно копие на всички външни представителства идентификатори (и вероятно всички константи също). След това идентификаторите се заменят с препратка към тази таблица - извиква се този процес коагулация.
Една от най-простите форми за организиране на таблица е масив от указатели към редове. Този подход обаче забавя двата основни процеса, свързани с таблица на изгледа: търсене на идентификатор в таблицата и добавяне на нов елемент. В същото време търсенето на идентификатор в таблица е може би най-масивната задача в процеса на компилация, тъй като се извършва за всеки идентификатор, който използва появявания на идентификатор. Ето защо бих искал да постигна максимална производителност за тази операция. .