ожини крайніх правих і крайніх лівих термінальних символів
Символ (U) Початок построенияL(U)R(U)lt;элементgt;lt;числоgt;,IDlt;числоgt;,IDlt;лев.вырgt;lt;числоgt;,IDlt;числоgt;,IDlt;вырgt;lt;числоgt;,ID ; lt; сіс.уравн gt; lt; число gt;, ID;
На основі цих множин і правил граматики G побудуємо матрицю передування граматики:
Таблиця 3.3 - Матриця передування вихідної граматики
константапеременная.;=-+*/Константа--lt;lt;lt;lt;lt;-Переменная---lt;lt;lt;lt;lt;;lt;lt;------=lt;--------lt;lt;------+lt;lt;------*lt;lt;------/lt;lt;------
На основі матриці передування проводиться синтаксичний аналіз методом зрушення-згортка в результаті якого формується матриця коефіцієнтів для подальшого вирішення методом Гаусса.
5. ГЕНЕРАЦІЯ КОДА
Генерація об'єктного коду - це переклад компілятором внутрішнього подання вихідної програми в ланцюжок символів вихідного мови.
Генерація об'єктного коду породжує результуючу об'єктну програму мовою асемблера або безпосередньо на машинній мові (в машинних кодах). Внутрішнє представлення програми може мати будь-яку структуру в залежності від реалізації компілятора, в той час як результуюча програма завжди являє собою лінійну послідовність команд. Тому генерація об'єктного коду (об'єктної програми) в будь-якому випадку повинна виконувати дії, пов'язані з перетворенням складних синтаксичних структур в лінійні ланцюжка.
Генерацію коду можна вважати функцією, визначеною на синтаксичному дереві, побудованому в результаті синтаксичного аналізу, і на інформації, що міститься в таблиці ідентифікаторів. Тому генерація об'єктного коду виконується після того, як виконані синтаксичний аналіз програми і всі необхідні дії з підготовки до генерації коду: розподілено адресний простір під функції і змінні, перевірено відповідність імен і типів змінних, констант і функцій в синтаксичних конструкціях вихідної програми.
Характер відображення вхідний програми в послідовність команд, виконувану генерацією, залежить від вхідної мови, архітектури обчислювальної системи, на яку орієнтована результуюча програма, а також від якості бажаного об'єктного коду.
5.1 Загальні принципи генерації коду
Завдання генератора коду - побудова для програми lt; javascript:// gt; на вхідній мові еквівалентної машинної програми. Зазвичай в якості входу для генератора коду служить деяке проміжне представлення програми.
Генерація коду включає lt; javascript:// gt; ряд специфічних, відносно незалежних підзадач: розподіл пам'яті (зокрема, розподіл регістрів), вибір команд, генерацію об'єктного (або завантажувального) модуля. Звичайно, незалежність цих підзадач відносна: наприклад, при виборі команд не можна не враховувати схему розподілу пам'яті, і, навпаки, схема розподілу пам'яті (регістрів, зокрема) веде до генерації тієї чи іншої послідовності команд. Однак зручно і практично ці завдання все ж розділяти, звертаючи при цьому увагу на їх взаємодію.
У якійсь мірі схема генератора коду залежить від форми проміжного представлення. Ясно, що генерація коду з дерева відрізняється від генерації коду з трійок, а генерація коду з префиксной записи lt; javascript:// gt; відрізняється від генерації коду з орієнтованого графа. У той же час всі генератори коду мають багато спільного, і основні застосовуються алгоритми відрізняються, як правило lt; javascript:// gt ;, тільки в деталях, пов'язаних з використовуваним проміжним поданням.
5.2 Основні методи оптимізації
Завдання оптимізації коду полягає у створенні ефективного (з точки зору розміру пам'яті і часу виконання) цільового коду. Бажана ступінь оптимізації буде залежати від обставин. Іноді вона не потрібна, наприклад, якщо у програми малий час виконання, помірні запити до пам'яті і, можливо, малий термін життя.
Необхідність оптимізації може вимагатися для програм з великим часом виконання або значними запитами до пам'яті і, можливо, з тривалим часом існування. Вартість оптимізації головним чином оцінюється в термінах часу компіляції. Деякі види оптимізації можуть бути дорогими в сенсі часу компіляції, інші - порівняно дешевими. Зазвичай дешевші типи оптимізації завжди стоїть здійснювати, а більш дорогі - не завжди.
Деякі компілятори, залежно від необхідного ступеня оптимізації, можуть працювати в більш ніж одному режимі.
У середовищах, де основною є якісна діагностична інформація, найкраще повністю відмовитися від оптимізації, щоб уникнути можливої ??плутанини внаслідок некоректних повідомлень.
6. ОПИС ПРОГРАМИ