GCC - The Complete Reference (537669), страница 75
Текст из файла (страница 75)
В примере эти функции только лишь выводят информацию, которая могла бы использоваться для генерирования действующего объектною кода. Приведенную далее последовательность команд можно использовать для компиляции программы, считывающей исходный код языка с1апд и вырабатывающей всевдоинструкции прорисовки фигур: 3 Ьгвсп -с с1епд.у 3 Е1ех с1апд.тех 3 дсс с1еавп.с 1ех.уу.с с1апд.еаЬ.с -с с1апд Команда Ьавоп считывает файл с1апд.у и вырабатывает файл с1епд. сеЬ. с, который содержит код на языке С, разделяющий входной поток лексем. Поэтому он должен быть скомпилирован и скомпонован в вырабатываемый компилятор. Опция -д указывает, что также должен быть создан заголовочный файл с1епд.
саЬ.Ь. Этот файл используется в исходном файле с1вш1п. с и в файле с1апд. 1ех, где он предоставляет константы всех типов лексем. Команда й1ех используется для выработки файла 1ех.уу. с, содержащего исюдный код функций Сдля считывания входного потока и организации его в поток лексических элементов. Команда дсс компилирует и компонует три исходных файла на языке С в готовую к запуску программу с1апд. Это — компилятор, принимающий исходный код в потоке стандартного ввода, поэтому для компиляции тестовой программы с имевем Е1дихеа.
с1апд следует применить такую команду: 3 сае Е1дигев.с1апд ( с1апд 338 Часть(11. Внутренняя структура и окружение Вывод этой команды будет выглядеть следующим образом: Пгви Ь1це сакс1в ас (100,200) квд1цв=эо Певи квгт кесевпя1в вк (250,200) Ь=10 и=10 Построение дерева синтаксического разбора В результате процесса синтаксического разделения строится дерево синтаксического разбора (рагзс (гсс).
Оно представляется в форме последовательности текстовых строк, каждая из которых описывает узел дерева. Каждый узел имеет идентификатор, используемый для разрешения ссылок на этот узел из любых других узлов дерева. Каждый узел также содержит символ, указывающий его тип. Типы узлов и соответствующие им обозначающие символы перечислены в таблице 19.1. Таблица 19.1. Буквенные символы — коды типов узлов дерева синтаксического разбора ()Нмеве Опевевпе тепе увел Выражение сравнения. Унзрисв арифметическое выражение.(С одним операндом.) Бинарное арифметическое выражение.(С двумя операндами.) Лексический блок. Константа. Обаявлвиив переменной либо ссылка из переменную. Выражение, которое ив является сравнением, унзрной или бинарной арифметической операцией, и вго вычисление не имеет побочных эффектов.
Ссылка (гв(вгвпсе) нз элемент данных в памяти. Выражение, вычисление которого имеет побочные эффекты. тип данных. Особый узел, ив соответствующий никакой другой категории. Определения символов индикаторов типов узлов содержатся в файле исходного кода ССС сгее. сзес. Для создания узлов дерева синтаксического разбора используется большое количество функций, их исходный код находится в файле вегас.с.
Функций, предназначенных для построения узлов, настолько много„что создается впечатление, будто любой оператор языка верхнего уровня в каждом варианте применения имеет собственную процедуру-генератор кода КТ(.. Например, следующая функция генерирует код сравнения операндов ор1 и ор2 и передает управление коду программы, имеющему метку 1еЬе1, в случае совпадения нх значений: всвсхс чо10 «то 1щвр ьс еоца1(ор1,ор2,1вьв1,ипваяпвбр)г В этом примере оба операнда ор1 и ор2 являются узлами выражений дерева синтаксического разбора.
1аЬе1 является указателем расположения выполнимого кода в памяти. Последний аргумент определяет метод сравнения чисел: с учетом или без учета знака. Функция проверяет аргументы и только после этого определяет гене- Глава (д. Реализация алгоритмического языка 339 рнруемый код. Например, в случае, когда ор1 и орд являются константами с равными значениями, вырабатывается простая инструкция передачи управления на вдрес метки 1аЬе1. Если на этом этапе форма инструкции определена, то вызывается подпрограмма, вырабатывающая соответствующую инструкцию. Исходный код подпрограмм нижнего уровня, которые вырабатывают выходной КТ).-код, находится в файле емйс-гс1.
с. Возможно, что функция евлйг поле () янляется наиболее простой из них. Она генерирует инструкции, не выполняющие никаких действий, которые только заполняют свободное место. Код, который вырабатывает действующие инструкции и помешает их в выходной КТ(.-код, выглядит подобно следующему: лосе = гсх а11сс(ИОтк)к зияи пхп(песе) = сиг 1пвп сто++к ИОтв яООКСК КХЬК(песе) = Едьек вьоск кок ькяи(псле) = каььв есИ ьпвп(посв)к В начале этой последовательности Функция гсх а11ос() создает новый узел дерева КТ(.-кода, Узел дерева определен на языке С как составной оператор гсх бей в файле гг1.)ь Он содержит набор идентифицирующих флагов, за ними следует массив переменной длины, содержащий операнды. Затем макрос 1мям т)1)з вставляет уникальный номер ((О) узла.
макрос мотк яоццск кхьк добавляет информацию об исходном Файле. Вызов абб 1пвп() добавляет новый сконструированный узел в конец списка связанного выходного кода на языке КТ) . Для вставки новой инструкции КТЕ перед уже записанной инструкцией применяется функция абб 1пап )зейоге (). )для ее помещения сразу после существующей инструкции — функция абб 1пап айгег ( ) . Остается одна проблема. В КТ) -код не внесена информация символьных таблиц. На верхнем уровне присутствие таблиц программных символов в той или иной форме необходимо, они требуются для разрешения ссылок на имена элементов программы.
А в КТ).-коде все ссылки разрешаются через идентификаторы узлов дерева и только через них. Однако символьные таблицы должны существовать и быть доступными с нижнего уровня компилятора. Подключение нижнего уровня компилятора к верхнему уровню Нижний уровень (Ьас)( епд) компилятора не вполне отделен от его верхнего уровня ((гол( епд). Некоторые переменные и функции программы могут быть объявленными на верхнем уровне как глобальные. Следовательно, должна быть возможность прямой адресации к ним с нижнего уровня компилятора.
Код реализации языка верхнего уровня следует размещать в отдельном каталоге ниже корневого каталога ССС. Например, код лля языка С+ч- содержится в каталоге ср, а для А()а — в каталоге аг)а, В таком каталоге имеется файл с именем Ма)ке-1апд. хп— компоновочный файл, включаемый в гпа)ге-файл родительского каталога ОСС. Также включается и файл ма)кей11е. 1п.
Он используется при создании компоновочного 340 Часть (П. Внутренняя структура и окружение Таблица 19.2. Переменные верхнего уровня бСС, адресуемые с его нижнего уровня Ониевиие Имв неремеииел Родительский узел дерева, содержащий условия вывода сообщений об ошибках. еггог пагк поде Узел основного целочисленного типа. Узел основного типа представления буквенных знаков.
Узел основного типа вызова ««1д. 1~Седег Суре поде сЬаг Суре лойе ««1й суре поде 1««едет гего поде Узел дерева, который содержит нулевое значение целогс числа. Узел дерева, содержащий значение целого числа, равного единице. Узел представляет текущую транслируемую функцию. Адрес строки буквенных знаков, содержащей название языка. Обязательный узел, хотя он используется только в языке С. 1««едет опе «ойе Сгее с«ггепг 1«пс«1оп йес1 1апд«аде агг1«д 11ад Сгайс«1«па1 Таблица 19.3. функции верхнего уронив 6СС, вызываемые с его нижнего уровнв Оииввние Имв фунм(ии Выполняет все специфичные к языку инициализации. Выполняет все специфичные к языку процедуры завершения.
Вызывается с опциями, обнаруженными в командной строке. Выполняет все инициализации, необходимые для процесса лексического анализа. Применяется прн запуске (ех-сканера. Выполняет все инициализации, необходимые для процесса синтаксического разделения. Применяется прн запуске парсера. Выполняет все процедуры завершения рабо~ы парсера. Возвращает узел дерева, определяющий машинное представление данных.
Возвращает узел дерева, который содержит целое число, представляющее аппаратную точность (в байтах). Возвращает целое число со знаком — значение узла дерева, определяющего формат представления таких чисел. 1апд 1пус() 1апд 11«ьвь[) 1апд йесойе ор«1оп() 1«1с зех() 1«1с расее() 11«1вЬ рагае() Суре еог ходе() суре еог в1зе() Суре еог «па1дпей() сценария ()па)[е-файла) для языка. Файл сопйзд-1апд. 1п используется конфигурационным сценарием сопгэ'.дцге.
Для подключения нового языка драйвер дсс должен быть модифицирован. Все изменения вносятся автоматически в процессе его сборки (Ьц()б ргосезэ). Верхний уровень компилятора языка должен содержать глобальные переменные и функции, адресуемые с нижнего уровня. Это необходимо для обеспечения доступа к узлам синтаксического дерева и таблицам программных символов.
Также они нужны и для процедур инициализации и завершения. Таблица 19.2 содержит краткое описание обязательных глобальных переменных, доступных с нижнего уровня ССС. Краткое описание адресуемых с нижнею уровня компилятора глобальных функций находится в таблице 19,3. Многие из этих функций используются н на верхнем уровне, но нх имена должны быть объявлены глобально. Глава 19.
Реализация алгоритмического языка 34 1 И»в Фу»в»»» 61дпеа суре() в1дпеа ох ипв).дпед Туре() 1пЕТ аес1 рхосевв1пд() д1оЬа1 Ьапахпдв р[) Терс 1ече1 р() дес вес 1в ( ) ривьаес1 ( ) ривь1ече 1 ( ] рор1ече1 ( ) 1пвекТ Ь1оск() вес Ьуос)т<) вауЬе Ьи11а с1еапир() ТгиТЬча]ие сопчекв1оп() аатк ааакевваЬ1е() сору 1апд аес1() Еиссовр1ете туре еххох() ууекхох(] рх1пт 1апд аес1() ртхпТ 1апд Туре() рх1пт 1апд 1аепТ111ек() веТ ууаеЬид() 0»»дв»»в Возвращает целое число без знака — значение узла дерева, которое определяет формат представления таких чисел. Значение узла дерева, определяющего формат машинного представления числа и его знака Инициализирует узлы переменных, которые представлены в таблице 19.2.
Возвращает признак глобального объявления текущего участка кода, Возвращает признак, показывающий на необходимость создания блока данных для текущего уровня дерева. Возвращает листинг всех объявлений текущего уровня кода (соггег» эсоре (ече(). Помешает объявление в символьную таблицу и возвращает соответствующий ему узел дерева.
Создает новый уровень кода дерева в символьной таблице. Убирает иэ символьной таблицы текущий уровен~ кода дерева и восстанавливает предыдущее состояние. Добавляет узел блока в конец списка блоков текущего уровня дерева. Устанавливает узел блока в текущем уровне дерева. Функция мо)кет возвращать узел дерева, представляющий операцию освобождения ресурсов после предьщущих действий. (Например, освобождение объектов.) Возвращает выражение, равносильное укаэанному, но возвращающее логический результат тхие или Еа1ве. Отмечает выражение как указывающее адрес памяти.