Программа-интерпретатор для учебного языка SPL, страница 3

  1. если дуга помечена нетерминальным символом

      то нужно прочитать очередной символ из анализируемого слова, а затем вызвать функцию вывода, соответствующую данному нетерминальному символу.

Если анализируемая цепочка символов перебирается от первого до последнего символа (в соответствии с синтаксической диаграммой) без сбоя, тогда анализ прошел успешно. Если удается от входной вершины синтаксической диаграммы добраться до выходной, пройдя последовательно все символы анализируемой цепочки, — анализ прошел успешно.

Введение в компиляцию

Классификация

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

Если входным и выходным языками является алгоритмический язык высокого уровня, тогда такой транслятор называется препроцессором (cpp.exe — в C).

Иногда происходит перевод с языка высокого уровня на язык некоторых промежуточных команд, которые тут же и выполняются. Такой транслятор называется интерпретатором. Работает он медленнее, чем компилятор.

Структура компилятора

Имеется текст на исходном языке.

На всех этапах происходит обработка ошибок, а также заполняются и обрабатываются таблицы (идентификаторов, объектов, команд).

Лексический анализ

Лексема — наименьшей длины цепочка символов, имеющая самостоятельный смысл:

  • служебные или ключевые слова алгоритмического языка (if, while, do, printf, …);
  • числа;
  • знаки для обозначения арифметических действий;
  • пунктуация;
  • идентификаторы;
  • признак конца файла.
Функции

void get( void ); //функция получения новой лексемы

void number( void ); //если очередная лексема - число

void word( void ); //если очередная лексема - идентификатор

char *add( char *nm ); //для занесения идентификаторов в таблицу идентификаторов TNM

Синтаксический анализ

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

Функции

void prog( void ); //программа

void dconst( void ); //описание констант

void cons( void ); //константы

void dvarb( void ); //описание переменных

void dfunc( void ); //описание функций

int param( void ); //параметры функции

int body( void ); //тело функции

void stml( void ); //последовательность операторов

void stat( void ); //оператор

void expr( void ); //выражение

void term( void ); //слагаемое

void fact( void ); //множитель

int fctl( void ); //последовательность выражений

void exam( int lx ); //проверка лексемы

Генерация промежуточного кода

По ходу синтаксического анализа можно генерировать промежуточный код, и осуществить оптимизацию. О генерации промежуточного кода мы уже говорили.

Функции

int gen( int co, int op ); //функция занесения команд в TCD

Проходы компилятора

SPL

Символы

  • буквы ;
  • специальные символы 13 символов;
  • цифры .

Конструкции

  • идентификаторы;
  • переменные;
  • константы;
  • функции;
  • ключевые слова;

Идентификаторы

Из букв или из букв и цифр, но первой должна быть буква. Длина — до 40 символов.

Переменные

Только целого типа.

Локальные переменные хранятся динамически, а глобальные — статически (выделяется на все время).

int v1, v2, v3;

Константы

Только числовые.

const иден1=число1, иден2=число2;

Ключевые слова

Всего 11 слов:

begin, end, read, print, return, if, then, while, do, int, const.

Функции

имя_функции( формальные_параметры )

begin

  описание_локальных_переменных_и_констант;

  опер1;

  опер2;

  .

  .

  .

  оперn

end

Перед end нельзя ставить ‘;’, а после — ‘.’.