Реферат: Конвертер программы с подмножества языка Си в Паскаль с использованием LL(1) метода синтаксического анализа (выражения)

Новокузнецкийфилиал-институт

Кемеровский ГосударственныйУниверситет

Факультет ИнформационныхТехнологий

Кафедра АвтоматизированныхСистем

КУРСОВАЯ РАБОТА

Дисциплина:

 

«Языки программированияи методы трансляции»

Тема:

 

«Конвертер программы

с подмножества языка  Си в Паскаль

с использованием LL(1) методасинтаксического анализа

(выражения)»

Выполнили:

Студенты группы ИАС-00

Мардасова У. А.

Шалудько В. А.

Проверил:

Бочаров М. И.

Новокузнецк, 2002г.

ВВЕДЕНИЕ

При знакомстве с языком СИ,особенно после изучения Паскаля и Бейсика, погружение в детали егоизобразительных средств может затушевать важную мысль: хотя на СИ можнонаписать практически любую прикладную программу, он изначально для этого непредназначен. СИ является результатом эволюционного развития языков созданиясистемных программных средств. Если в прикладном программировании эволюция шлаот Фортрана к Алголу, Коболу, Паскалю и т.д., то в системном — от Ассемблеров,привязанных к архитектуре ЭВМ, к СИ, для которого созданы трансляторы, делающиеего хоть и независимым от архитектуры, но не меняющим основного предназначения.

С помощью СИ можно сделатьто, что на Паскале сделать невозможно (или почти невозможно) — например,написать фрагмент операционной системы (или новую операционную систему),утилиты и т.п. Так, ряд трансляторов с Паскаля написаны на СИ; обратноеневозможно представить. В то же время, не раз отмечалось, что прикладныепрограммы, написанные на Паскале, отличаются большей надежностью, чемнаписанные на СИ; их легче читать, передавать от одного программиста другомудля совершенствования и сопровождения. Это связано с тем, что Паскаль содержитсущественно больше ограничений и является языком более высокого уровня ссильной типизацией данных. Для языка же, который предназначен для разработкисистемного программного обеспечения, чем меньше ограничений, тем лучше; так, вСИ возможны неявные преобразования всех базовых типов данных и указателей другв друга, что крайне желательно при создании системных средств, но при невнимательностипрограммиста приводит к ошибкам, не улавливаемым транслятором с СИ (Паскаль жеподобные недопустимые операции пресекает немедленно).

Разумеется, сказанное вышене следует абсолютизировать. Программисты, привыкшие к СИ, успешно пишут на немпрограммы различных классов. Это касается не только СИ — вспомните обэкспертных системах, написанных на Бейсике. В то же время, при массовомпрограммировании придерживаться «разделение труда» между языкамипредставляется более естественным.

Широкой популярности Паскалясреди программистов способствуют следующие причины:

·       Благодаря своей компактности, удачному первоначальному описанию Паскальоказался достаточно лёгким для изучения.

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

·       Язык Паскаль позволяет чётко реализовать идеи структурногопрограммирования и структурной организации данных.

·       Язык Паскаль сыграл большую роль в развитии методов аналитическогодоказательства правильности программ и позволил реально перейти от методовотладки программ к системам автоматической проверки правильности программ.

·       Применение языка Паскаль значительно подняло «планку»надёжности разрабатываемых программ за счёт требований Паскаля к описаниюиспользуемых в программе переменных, проверки согласованности программы прикомпиляции без её выполнения.

·       Использование в Паскале простых и гибких структур управления:ветвлений, циклов.

С другой стороны языкпрограммирования СИ — это универсальный язык с богатым набором операторов икомпактным способом записи выражений. Благодаря гибкости, выразительности икомпактности своей конструкции СИ завоевал наибольшую популярность в средепрофессиональных программистов и широко используется при разработке системных иприкладных программ.

Язык СИ представляет собойудачный компромисс между желанием располагать теми возможностями, которыеобычно предоставляют программисту столь понятные и удобные языки высокогоуровня, и стремлением эффективно использовать особенности компьютера. Кроменабора средств, присущих современным языкам программирования высокого уровня(структурность, модульность, определяемые типы данных) в него включены средствадля программирования «почти» на уровне ассемблера (использованиеуказателей, побитовые операции, операции сдвига). Большой набор операторовпозволяет писать компактные и эффективные программы. Однако, такие мощныесредства требуют от программиста осторожности, аккуратности и хорошего знанияязыка со всеми его преимуществами и недостатками. В отличие от языковпрограммирования типа Паскаль, требующих жесткой дисциплины программированияограничивающих свободу программиста, содействующих устранению многих ошибок ещена стадии их трансляции, язык СИ предоставляет программисту наибольшую свободу.Однако, ответственность за корректность программ при этом полностью ложится напрограммиста.

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

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

Задача разработки конвертораотносится к классу задач автоматизации реинженеринга программ с устаревшихязыков на современные языки программирования и новые платформы. Разработкаконвертора для языка Паскаль является достаточно трудоёмкой в силу особенностейсинтаксиса и семантики языка Паскаль.

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

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

·       Ограниченное использование типов данных, в полном объёме поддерживаютсятолько арифметические типы данных.

·       Вложенность блоков, в которых используются одноименные объекты, недолжна превышать двух уровней.

·       Процедурные блоки не должны быть внутри BEGIN-блоков, вложенностьпроцедурных блоков не ограничивается.

·       Допускается использовать только одномерные массивы с открытой правойграницей (динамические массивы) в качестве параметров процедурных блоков; приэтом адресуются элементы массива в Паскаль программе, начиная с нулевогоэлемента.

·       Ограниченное использование смешения различных типов данных.

 

 

 

Выражения вПаскале

 

Конструкция языка, задающаяпорядок выполнения действия над элементами данных, называется выражением. Выражение состоит изоперандов (operand — элемент данных, участвующий в операции), — величин ивыражений, над которыми производится операция (константы и переменные всехтипов, обращения к функциям); круглых скобок и знаков операций. Операцииопределяют действия, которые надо выполнить над операндами. Например, ввыражении (X+Y-10) X, Y и 10 — операнды; а "+" и"-" — знаки операций  сложенияи вычитания.

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

          Операциив языке Паскаль делятся на арифметические, отношения, логические (булевские),операцию @, строковые и др. Выражения соответственноназываются  арифметическими, отношения,булевскими, строковыми и т.д. в зависимости от того, какого типа операнды иоперации в них используются.

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

          Операциимогут быть унарными и бинарными. В первом случае операцияотносится к одному операнду и всегда записывается перед ним, во втором — операция выражает отношение между двумя операндами и записывается между ними.

          Например,-А — унарная операция, Х+У — бинарная.

Арифметические выражения иоперации.

 

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

          Арифметическоевыражение порождает целое или действительное (вещественное) значение. Наиболеепростыми формами арифметических выражений являются:

·       Целая или действительная константа без знака;

·       Целая или действительная переменная;

·       Элемент массива целого или действительного типа;

·       Функция, принимающая целое или действительное значение.

Значение переменной илиэлемента массива должно быть определено до их появления в арифметическомвыражении. Другие арифметические выражения составляются из вышеперечисленныхпростых форм путем применения круглых скобок и арифметических операций.

     Арифметические операции выполняют арифметические действия ввыражениях над значениями операндов целочисленных и вещественных типов.Арифметические операции языка Паскаль представлены в таблице1.

Арифметические операции

Операция

Действие

Типы операндов

Тип результата

Бинарные

+

-

*

/

DIV

MOD

AND

SHL

SHR

OR

XOR

Сложение

Вычитание

Умножение

Деление

Целочисленное деление

Остаток от деления

Арифметическое И

Сдвиг влево

Сдвиг вправо

Арифметическое ИЛИ

Исключающая дизъюнкция

Целый

Вещественный

Целый

Вещественный

Целый

Вещественный

Целый

Вещественный

Целый

Целый

Целый

Целый

Целый

Целый

Целый

Целый

Вещественный

Целый

Вещественный

Целый

Вещественный

Вещественный

Вещественный

Целый

Целый

Целый

Целый

Целый

Целый

Целый

Унарные

+

-

NOT

Сохранение знака

Отрицание знака

Арифметическое отрицание

Целый

Вещественный

Целый

Вещественный

Целый

Целый

Вещественный

Целый

Вещественный

Целый

Выражения и операцииотношения.

          Выражениемотношения называется  словосочетаниеязыка, в котором два выражения связаны знаком операции отношения. Выражениеотношения определяет истинность или ложность результата. Операции отношениявыполняют сравнение двух операндов и определяют, истинно значение выражения илиложно.

          Вязыке Паскаль операции отношения и рассмотренные ниже булевские операции болееважны при написании программ, чем в других языках, так как они интенсивноиспользуются для реализации разветвляющихся и циклических алгоритмов. В таблице2 приведены операции отношения, допустимые в версии языка Паскаль для ПЭВМ.

          Сравниваемыевеличины могут принадлежать к любому скалярному или перечисляемому типу данных.Результат всегда имеет булевский тип и принимает одно из двух значений: True (истина)или False (ложь).

Операцииотношения.

Операция

Название

Выражение

Результат

=

<>

>

<

>=

<=

in

Равно

Не равно

Больше

Меньше

Больше или равно

Меньше или равно

Принадлежность

A=B

A<>B

A>B

A<B

A>=B

A<=B

A in M

True, если А равно В

True, если А не равно В

True, если А больше В

True, если А меньше В

True, если А больше или равно В

True, если А меньше или равно В

True, если А находится в списке М

Логические выражения иоперации.

          Результатомвыполнения логического (булевского) выражения является логическое значение True илиFalse. Операндами служат данные только булевского типа.

          Простейшимивидами логических выражений являются следующие:

·       Логическая константа;

·       Логическая переменная;

·       Элемент массива логического типа;

·       Логическая функция;

·       Выражение отношения.

<img src="/cache/referats/12525/image001.gif" v:shapes="_x0000_s1026">Другие логические выражениястроятся из вышеперечисленных путем применения логических операций и круглыхскобок. Список логических операций приведен в таблице 3.

Логические операции.

Операция

Действие

Выражение

А

В

Результат

Not

And

Or

xor

Логическое отрицание

Логическое И

Логическое ИЛИ

Исключающее ИЛИ

not A

A and B

A or B

A xor B

True

False

True

True

False

False

True

True

False

False

True

True

False

False

True

False

True

False

True

False

True

False

True

False

True

False

False

True

True

False

False

False

True

True

True

False

False

True

True

False

Операция @.

 

С помощью операции @ можносоздать указатель на переменную. В таблице 4 показаны операнд и типырезультата.

Операция создания указателя.

Операция

Действие

Тип операнда

Тип результата

@

Получение указателя

Ссылка на переменную, процедуру или идентификатор функции

Указатель (совместимый с nil)

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

Выражения вСИ.

 

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

          Еслив выражениях встречаются операнды различных типов, то они преобразуются кобщему типу в соответствии с определенными правилами:

·       Переменные типа char интерпретируются как целыебез знака (unsigned);

·       Переменные типа short автоматически преобразуютсяв int; если один из операндов имеет тип unsigned, то другой (другие) такжепреобразуется к типу unsigned и результат имеет тип unsigned;

·       Если один из операндов имеет тип int, то другой (другие) такжепреобразуется к типу int и результат имеет тип int;

·       Если один из операндов имеет тип char, то другой (другие) такжепреобразуется к типу char и результат имеет тип char;

·       Во время операции присваивания значения правой части преобразуются ктипу левой части, который и становится типом результата;

·       В процессе преобразования int в char лишние 8 бит простоотбрасываются.

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

Например: z=(int)x+(int)y;

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

В языке СИ присваиваниетакже является выражением, и значением такого выражения является величина,которая присваивается.

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

Операнд — это константа,литерал, идентификатор, вызов функции, индексное выражение, выражение выбораэлемента или более сложное выражение, сформированное комбинацией операндов,знаков операций и круглых скобок. Любой операнд, который имеет константноезначение, называется константным выражением. Каждый операнд имеет тип.

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

Унарное выражение состоит изоперанда и предшествующего ему знаку унарной операции и имеет следующий формат:

знак-унарной-операции операнд

 

Бинарное выражения состоитиз двух операндов, разделенных знаком бинарной операции:

операнд1 знак-бинарной-операции операнд2

Тернарное выражение состоитиз трех операндов, разделенных знаками тернарной операции (?) и (:), и имеетформат:

операнд1? операнд2: операнд3

По количеству операндов,участвующих в операции, операции также подразделяются на унарные, бинарные итернарные.

В языке Си имеются следующиеунарные операции:

·       -арифметическое отрицание (отрицание и дополнение);

·       ~ побитовое логическое отрицание (дополнение);

·       ! логическое отрицание;

·       & вычисление адреса;

·       + унарный плюс;

·       ++ увеличение (инкремент);

·       --уменьшение (декремент);

·       sizeof размер.

Унарные операции выполняютсясправа налево.

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

В отличие от унарных,бинарные операции, список которых приведен в табл.7, выполняются слева направо.

Таблица 7

PRIVATEЗнак операции

Операция

Группа операций

*

Умножение

Мультипликативные

/

Деление

%

Остаток от деления

+

Сложение

Аддитивные

-

Вычитание

<<

Сдвиг влево

Операции сдвига

>>

Сдвиг вправо

<

Меньше

Операции отношения

<=

Меньше или равно

>=

Больше или равно

= =

Равно

!=

Не равно

&

Поразрядное И

Поразрядные операции

|

Поразрядное ИЛИ

^

Поразрядное исключающее ИЛИ

&&

Логическое И

Логические операции

||

Логическое ИЛИ

,

Последовательное вычисление

Последовательного вычисления

=

Присваивание

Операции присваивания

*=

Умножение с присваиванием

/=

Деление с присваиванием

%=

Остаток от деления с присваиванием

-=

Вычитание с присваиванием

+=

Сложение с присваиванием

<<=

Сдвиг влево с присваиванием

>>=

Сдвиг вправо присваиванием

&=

Поразрядное И с присваиванием

|=

Поразрядное ИЛИ с присваиванием

^=

Поразрядное исключающее ИЛИ с присваиванием

Мультипликативные операции

К этому классу операцийотносятся операции умножения (*), деления (/) и получение остатка от деления(%). Операндами операции (%) должны быть целые числа. Отметим, что типыоперандов операций умножения и деления могут отличаться, и для них справедливыправила преобразования типов. Типом результата является тип операндов послепреобразования.

Операция умножения (*)выполняет умножение операндов. Операция деления (/) выполняет деление первогооперанда на второй. Если две целые величины не делятся нацело, то результатокругляется в сторону нуля. При попытке деления на ноль выдается сообщение вовремя выполнения. Операция остаток от деления (%) дает остаток от деленияпервого операнда на второй.

Аддитивные операции

К аддитивным операциямотносятся сложение (+) и вычитание (-). Операнды могут быть целого илиплавающего типов. В некоторых случаях над операндами аддитивных операцийвыполняются общие арифметические преобразования. Однако преобразования,выполняемые при аддитивных операциях, не обеспечивают обработку ситуацийпереполнения и потери значимости. Информация теряется, если результатаддитивной операции не может быть представлен типом операндов послепреобразования. При этом сообщение об ошибке не выдается.

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

Операция вычитания (-)вычитает второй операнд из первого. Возможна следующая комбинация операндов:

1. Оба операнда целого или плавающего типа.

2. Оба операнда являются указателями на один и тотже тип.

3. Первый операнд является указателем, а второй — целым.

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

Логические операции

 К логическим операциям относятся операциялогического И (&&) и операция логического ИЛИ (||). Операнды логическихопераций могут быть целого типа, плавающего типа или типа указателя, при этом вкаждой операции могут участвовать операнды различных типов.

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

Логические операции невызывают стандартных арифметических преобразований. Они оценивают каждыйоперанд с точки зрения его эквивалентности нулю. Результатом логическойоперации является 0 или 1, тип результата int.

Операция логического И(&&) вырабатывает значение 1, если оба операнда имеют нулевые значения.Если один из операндов равен 0, то результат также равен 0. Если значениепервого операнда равно 0, то второй операнд не вычисляется.

Операция логического ИЛИ(||) выполняет над операндами операцию включающего ИЛИ. Она вырабатываетзначение 0, если оба операнда имеют значение 0, если какой-либо из операндовимеет ненулевое значение, то результат операции равен 1. Если первый операндимеет ненулевое значение, то второй операнд не вычисляется.

Операция последовательного вычисления

Операция последовательноговычисления обозначается запятой (,) и используется для вычисления двух и болеевыражений там, где по синтаксису допустимо только одно выражение. Эта операциявычисляет два операнда слева направо. При выполнении операции последовательноговычисления, преобразование типов не производится. Операнды могут быть любыхтипов. Результат операции имеет значения и тип второго операнда. Отметим, чтозапятая может использоваться также как символ разделитель, поэтому необходимопо контексту различать, запятую, используемую в качестве разделителя или знакаоперации.

Условная операция

В языке СИ имеется одна тернарная операция — условная операция, которая имеет следующий формат:

 

операнд-1? операнд-2: операнд-3

Операнд-1 должен быть целогоили плавающего типа или быть указателем. Он оценивается с точки зрения егоэквивалентности 0. Если операнд-1 не равен 0, то вычисляется операнд-2 и егозначение является результатом операции. Если операнд-1 равен 0, то вычисляетсяоперанд-3 и его значение является результатом операции. Следует отметить, чтовычисляется либо операнд-2, либо операнд-3, но не оба. Тип результата зависитот типов операнда-2 и операнда-3, следующим образом.

1. Если операнд-2 или операнд-3 имеет целый илиплавающий тип (отметим, что их типы могут отличаться), то выполняются обычныеарифметические преобразования. Типом результата является тип операнда послепреобразования.

2. Если операнд-2 и операнд-3 имеют один и тот жетип структуры, объединения или указателя, то тип результата будет тем же самымтипом структуры, объединения или указателя.

3. Если оба операнда имеют тип void, то результатимеет тип void.

4. Если один операнд является указателем на объектлюбого типа, а другой операнд является указателем на vold, то указатель наобъект преобразуется к указателю на vold, который и будет типом результата.

1.     Если один из операндовявляется указателем, а другой константным выражением со значением 0, то типомрезультата будет тип указателя.

Операции увеличения и уменьшения

Операции увеличения (++) иуменьшения (--) являются унарными операциями присваивания. Они соответственноувеличивают или уменьшают значения операнда на единицу. Операнд может бытьцелого или плавающего типа или типа указатель и должен быть модифицируемым.Операнд целого или плавающего типа увеличиваются (уменьшаются) на единицу. Типрезультата соответствует типу операнда. Операнд адресного типа увеличиваетсяили уменьшается на размер объекта, который он адресует. В языке допускаетсяпрефиксная или постфиксная формы операций увеличения (уменьшения), поэтому значениявыражения, использующего операции увеличения (уменьшения) зависит от того,какая из форм указанных операций используется.

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

В том случае если знакоперации стоит после операнда (постфиксная форма записи), то операнд вначалеиспользуется для вычисления выражения, а затем происходит изменение операнда.

 

Построение управляющих таблиц

 Определим выражение в виде БНФ для языка СС++и  Turbo Pascal 7.0.

 

СС++:

В::= ++i | --i | i++ | i-- | B*B | B/B | B%B | B+B | B-B |B<B | B>B | B>=B | B<=B | B!=B | B==B | B&&B | B|| | (k)B |B?B:B | i=B | i*=B | i-=B | i+=B | i/=B | i%=B | i | i(S) | (B)

S::=B | B, S

Где В – выражение;

       S – списоквыражений;

       i — индификатор.

Turbo Pascal 7.0.

В::=П | П=П | П<П | П> П |П<> П | П>= П | П<= П

П::=+C | -C | П+C | П-C | П or C

C::=M | C*M | C/M | C div M | Cmod M | C and M

M::=i | i(S) | (B)

S::=B | B, S

Где В – выражение;

       S – списоквыражений;

       П – простоевыражение;

       С – слагаемое;

       М – множитель:

       i — индификатор.

N

Теперь приведём данные БНФ кКС-грамматике: G=<N, T, P, S>

СС++                                                 TurboPascal 7.0Bà (k)B                                             BàП 

Bà++i                                                BàП=П

Bà--i                                                  BàП<П

Bài++                                                BàП>П

BàB*B                                              BàП<=П

BàB/B                                               BàП>=П

BàB+B                                              BàП<>П

BàB-B                                               ПàП+C

BàB<B                                              ПàП-C         

BàB>B                                              ПàПor C

BàB>=B                                           Пà+C

BàB<=B                                           Пà-C

BàB!=B                                            CàM

BàB==B                                           CàC*M

BàB&&B                                          CàC/M

BàB||B                                              CàCdiv M

BàB?B:B                                          CàCmod M

Bài=B                                               CàCand M

Bài*=B                                             Mài

Bài/=B                                              Mài(S)

Bài%=B                                            Mà(B)

Bài+=B                                             SàB

Bài-=B                                              SàB,S

Bài

Bài(S)

Bà(B)

Sà B

SàB, S

N(CC++)={B, П, S}

T(CC++)={i, ++, --, +, -, ==,!=, <, >, <=, >=, *=, -=, +=, /=, %=, =, *, /, %, (, ), ?, :, ,, &&, ||}

N(TP)={B, П, C, M, S}

T(TP)={ i, +, -, =, <>,<, >, <=, >=,  *, /, div,mod, and, or, (, ),  ,}

    Устранив цепные правила, левую рекурсию,получим LL(1)-грамматику.

CC++

1.     ài B1

2.     à= BB’

3.     à*=BB’

4.     à+=BB’

5.     à-BB’

6.     à/BB’

7.     à--B’

8.     à++B’

9.     à(SS1

10.  à)B’

11.  à(B2

12.  àiB1C

13.  à)B’

14.  à(B2C

15.  à--C1C

16.  àiB’

17.  à++C1C

18.  àkC2

19.  à)BB’

20.  à--C1

21.  à++C1

22.  à%BB’

23.  à*BB’

24.  à/BB’

25.  à+BB’

26.  à-BB’

27.  à>BB’

28.  à<BB’

29.  à<=BB’

30.  à>=BB’

31.  à==BB’

32.  à!=BB’

33.  à&&BB’

34.  à||BB’

35.  à?BB3

36.  à:BB’

37.  à$

38.  à%BB’

39.  à*BB’

40.  à/BB’

41.  à+BB’

42.  à-BB’

43.  à>BB’

44.  à<BB’

45.  à>=BB’

46.  à<=BB’

47.  à==BB’

48.  à!=BB’

49.  à&&BB’

50.  à||BB’

51.  à?BB3

52.  à%=BB’

53.  à$

54.  àiB1 S’

55.  à(B2S’

56.  à--C1S’

57.  à++C1S’

58.  à,S

59.  à$

60. 

0.Отвергнуть

Turbo Pascal 7.0

1.     à+CП’B’

2.     à- CП’B’

3.     &agra

еще рефераты
Еще работы по компьютерам. программированию