Семантика целого числа при сканировании

Для целого в алгоритме предусмотрен генератор условного кода 2. Под кодом здесь понимается класс целых. Часто, при обработки целых требуется не только их указатель(код) целого числа, но и значение - int.value. Учитывая, что числовые значения (value) целого в выражении могут быть разными, при лексической обработки в этом случае необходимо каждый раз генерировать кортеж <адрес, значение>. Как только будет получен начальный адрес для первого числового символа кортежа, с этого начального адреса резервируется память в таблице символов.

Соответствующие числовые значения, которые будут храниться в адресах, определяются по следующему алгоритму.

Семантическое правило с определением атрибуты значения для целого имеет вид:

O ® dW (dW)* y1,

где

W – семантическая атрибута записи (Write) очередного цифрового символа в символьную строку S.

y1 – семантическая атрибута преобразования символьной строки в числовой эквивалент. Этой атрибутой может быть уже рассмотренная стандартная функция atoi(S), которая принимает входной формальный параметр S и возвращает значение целого n.

Такая удобная атрибутная организация семантики позволяет практически без изменения общего алгоритма работать не только с целыми, но и десятичными числовыми константами. Только вместо атрибутной библиотечной функции atoi(S) будет выступать библиотечная функция atof(S), которая возвращает числовые константы с плавающей точкой. В этом случае ветка сканера с кодом 1 будет превращена в граф ( рис. 5.9):

Рис. 5.9.

Каждая ветка на графе помечена не только терминальным символом, но и процедурой записи (W) очередного терминала в SR (стек с обратной записью). Определённая таким образом строка S принимается в качестве входного формального параметра встроенной функции atof(S), которая возвращает десятичное число n – значение очередной обрабатываемой числовой константы.

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