Бесплатная библиотека, читать онлайн, скачать книги txt

БОЛЬШАЯ БЕСПЛАТНАЯ БИБЛИОТЕКА

МЕЧТА ЛЮБОГО КНИГОЛЮБА

Воскресенье, 19 мая, 13:51

Авторизация    Регистрация
Дамы и господа! Электронные книги в библиотеке бесплатны. Вы можете их читать онлайн или же бесплатно скачать в любом из выбранных форматов: txt, jar и zip. Обратите внимание, что качественные электронные и бумажные книги можно приобрести в специализированных электронных библиотеках и книжных магазинах (Litres, Read.ru и т.д.).

ПОСЛЕДНИЕ ОТЗЫВЫ О КНИГАХ

Михаил (19.04.2017 - 06:11:11)
книге:  Петля и камень на зелёной траве

Потрясающая книга. Не понравится только нацистам.

Антихрист666 (18.04.2017 - 21:05:58)
книге:  Дом чудовищ (Подвал)

Классное чтиво!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Ладно, теперь поспешили вы... (18.04.2017 - 20:50:34)
книге:  Физики шутят

"Не для сайта!" – это не имя. Я пытался завершить нашу затянувшуюся неудачную переписку, оставшуюся за окном сайта, а вы вын... >>

Роман (18.04.2017 - 18:12:26)
книге:  Если хочешь быть богатым и счастливым не ходи в школу?

Прочитал все его книги! Великий человек, кардинально изменил мою жизнь.

АНДРЕЙ (18.04.2017 - 16:42:55)
книге:  Технология власти

ПОЛЕЗНАЯ КНИГА. Жаль, что мало в России тех, кто прочитал...

Читать все отзывы о книгах

Обои для рабочего стола

СЛУЧАЙНОЕ ПРОИЗВЕДЕНИЕ

То была не любовь.
Робкий вздох.
Жест руки.
Обещанье в глазах.
Одиночества боль.
Мы с тобой улетели
От вечной тоски,
От печали и слёз
Ускользнули с тобой.

То была не любовь.
Наша вера слаба.
А надежда хрупка, как лёд.
Мы смелы. Просто нас
Обманула Судьба,
Оборвав
Наш недолгий полёт.... >>

15.07.10 - 05:17
Нина

Читать онлайн произведения


Хотите чтобы ваше произведение или ваш любимый стишок появились здесь? добавьте его!

Поделись ссылкой

Давайте создадим компилятор!   ::   Креншоу Джек

Страница: 4 из 139
 
'9'];

end;

{–}

{ Get an Identifier }

function GetName: char;

begin

if not IsAlpha(Look) then Expected('Name');

GetName := UpCase(Look);

GetChar;

end;

{–}

{ Get a Number }

function GetNum: char;

begin

if not IsDigit(Look) then Expected('Integer');

GetNum := Look;

GetChar;

end;

{–}

{ Output a String with Tab }

procedure Emit(s: string);

begin

Write(TAB, s);

end;

{–}

{ Output a String with Tab and CRLF }

procedure EmitLn(s: string);

begin

Emit(s);

WriteLn;

end;

{–}

{ Initialize }

procedure Init;

begin

GetChar;

end;

{–}

{ Main Program }

begin

Init;

end.

{–}



Скопируйте код, представленный выше, в TP и откомпилируйте. Удостоверьтесь, что программа откомпилировалась и запустилась корректно. Затем переходим к первому уроку, синтаксическому анализу выражений.



Синтаксический анализ выражений



 НАЧАЛО



Если вы прочитали введение, то вы уже в курсе дела. Вы также скопировали программу Cradle в Turbo Pascal и откомпилировали ее. Итак, вы готовы.

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

x = 2*y + 3/(4*z)

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

ОДИНОЧНЫЕ ЦИФРЫ



В соответствии с общей темой этой серии (KISS-принцип, помнишь?), начнем с самого простого случая, который можно себе представить. Это выражение, состоящее из одной цифры.

Перед тем как начать, удостоверьтесь, что у вас есть базовая копия Cradle. Мы будем использовать ее для других экспериментов. Затем добавьте следующие строки:



{–}

{ Parse and Translate a Math Expression }

procedure Expression;

begin

EmitLn('MOVE #' + GetNum + ',D0')

end;

{–}

И добавьте строку “Expression;” в основную программу, которая должна выглядеть так:

{–}

begin

Init;

Expression;

end.

{–}



Теперь запустите программу. Попробуйте ввести любую одиночную цифру. Вы получите результат в виде одной строчки на ассемблере. Затем попробуйте ввести любой другой символ и вы увидите, что синтаксический анализатор правильно сообщает об ошибке.

Поздравляю! Вы только что написали работающий транслятор!

Конечно, я понимаю, что он очень ограничен. Но не отмахивайтесь от него. Этот маленький «компилятор» в ограниченных масштабах делает точно то же, что делает любой большой компилятор: он корректно распознает допустимые утверждения на входном «языке», который мы для него определили, и производит корректный, выполнимый ассемблерный код, пригодный для перевода в объектный формат. И, что важно, корректно распознает недопустимые утверждения, выдавая сообщение об ошибке. Кому требовалось больше?

Имеются некоторые другие особенности этой маленькой программы, заслуживающие внимания. Во первых, вы видите, что мы не отделяем генерацию кода от синтаксического анализа… как только анализатор узнает что нам нужно, он непосредственно генерирует объектный код. В настоящих компиляторах, конечно, чтение в GetChar должно происходить из файла и затем выполняться запись в другой файл, но этот способ намного проще пока мы экспериментируем.

Также обратите внимание, что выражение должно где-то сохранить результат. Я выбрал регистр D0 процессора 68000. Я мог бы выбрать другой регистр, но в данном случае это имеет смысл.

ВЫРАЖЕНИЯ С ДВУМЯ ЦИФРАМИ



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

1+2

или 4-3

или в общем  +/–  (это часть формы Бэкуса-Наура или БНФ.)

Для того, чтобы сделать это, нам нужна процедура, распознающая термы и сохраняющая результат, и другая процедура, которая распознает и различает «+» и «-» и генерирует соответствующий код.

1<<345>>139


В тексте попалась красивая цитата? Добавьте её в коллекцию цитат!


copyright © Бесплатная библиотека,    контакты: [email protected]