Главная страница

М. В. Ломоносова Факультет вычислительной математики и кибернетики Е. И. Большакова, Н. В. Груздева Основы программирования на языке Рефал Учебное пособие


Скачать 0.92 Mb.
НазваниеМ. В. Ломоносова Факультет вычислительной математики и кибернетики Е. И. Большакова, Н. В. Груздева Основы программирования на языке Рефал Учебное пособие
Анкорqewqe
Дата02.01.2022
Размер0.92 Mb.
Формат файлаdoc
Имя файлаRefalP-1.doc
ТипУчебное пособие
#323127
страница21 из 22
1   ...   14   15   16   17   18   19   20   21   22

5.5.Вычисление выражения языка С


Составить рефал-программу, вводящую выражение, записанное на языке программирования С, и вычисляющую его значение. Пример такого выражения:

x=2,y=3,z=x+=2*y-3*x?++y>4?(8-4)*x:25:x‑‑&&y/3?x<<3:5

Выражение состоит из целых констант, имён переменных, круглых скобок и может содержать следующие знаки операций:

  • постфиксные и префиксные ++ и ––;

  • унарные и бинарные + и –;

  • арифметические *, / и %;

  • побитовые << и >>;

  • логические !, &&, ||;

  • операции отношения !=, ==, >, <, >=, <=;

  • тернарная операция ?:;

  • операции присваивания =, +=, =, *=, /=, %=, >>=, <<= ;

  • операция запятая (,).

Приоритет и порядок вычисления этих операций соответствуют принятым в языке С [11] правилам – см. таблицу 1 (в ней операции располагаются по строкам в порядке убывания приоритета).

Синтаксис выражения языка С описывается следующими БНФ-правилами:

выражение ::= выражение_присваивания |

выражение , выражение_присваивания

выражение_присваивания ::= условное_выражение |

идентификатор операция_присваивания выражение_присваивания

операция_присваивания ::= = | += | -= | *= | /= |

%= | <<= | >>=

условное_выражение ::= логическое_ИЛИ_выражение |

логическое_ИЛИ_выражение ? выражение : условное_выражение

логическое_ИЛИ_выражение ::= логическое_И_выражение |

логическое_ИЛИ_выражение || логическое_И_выражение

...

слагаемое ::= унарное_выражение |

слагаемое мульт_знак унарное_выражение

мульт_знак ::= * | / | %

унарное_выражение ::= постфиксное_выражение |

унар_знак унарное_выражение

унар_знак ::= ! | ++ | -- | + | -

постфиксное_выражение ::= первичное_выражение |

постфиксное_выражение1

постфиксное_выражение1::= идентификатор |

постфиксное_выражение1 постф_знак

постф_знак ::= ++ | --

первичное_выражение ::= идентификатор | целое_без_знака |

(выражение)

При выполнении задания необходимо дописать недостающие БНФ-правила, и согласно получившемуся набору синтаксических правил составить рефал-программу, вычисляющую выражение языка С.

Таблица 1. Приоритет и порядок вычисления операций языка С

Приоритет операций (в порядке убывания)

порядок вычисления

постфиксные ++ и --

слева направо

! префиксные ++ и -- унарные + и -

справа налево

* / %

слева направо

бинарные + и -

слева направо

<< >>

слева направо

< <= > >=

слева направо

== !=

слева направо

&&

слева направо

||

слева направо

? :

справа налево

= += -= *= /= %= <<= >>=

справа налево

,

слева направо


5.6.Интерпретация паскаль-программы


Рассматривается задача интерпретации программы, записанной на подмножестве языка Паскаль. Синтаксис подмножества задаётся следующими БНФ-правилами. Использованные в правилах фигурные скобки означают повторение заключённой в них конструкции 0, 1 или произвольное количество раз.

программа ::= program имя; раздел_описаний раздел_операторов

имя ::= идентификатор

раздел_описаний ::= раздел_констант раздел_переменных

раздел_констант ::= пусто | const имя=конст; {имя=конст;}

раздел_переменных ::= var секция {; секция};

секция ::= имя {, имя} : тип

тип ::= integer | boolean

конст ::= знак цифра {цифра}

знак ::= пусто | + | –

конст._бз ::= цифра {цифра}

логич._значение::= true | false

раздел_операторов ::= begin оператор {; оператор} end.

оператор ::= оператор_присваивания | оператор_вывода |

составной_оператор | оператор_цикла_с_постусловием |

оператор_цикла_с_предусловием | оператор_цикла_for |

оператор_выбора | условный_оператор

оператор_присваивания ::= имя:=выражение

выражение ::= простое_выражение |

простое_выражение операция_отношения простое_выражение

операция_отношения ::= > | < | <> | <= | >= | =

простое_выражение ::= слагаемое |

простое_выражение операция_сложения слагаемое

операция_сложения ::= + | - | or

слагаемое ::= множитель |

слагаемое операция_умножения множитель

множитель ::= имя | (выражение) | конст._бз | логич._значение |

not множитель

операция_умножения ::= * | div | mod | and

оператор_вывода ::= writeln(список_элементов)

список_элементов ::= элемент{,элемент}

элемент ::= выражение

составной_оператор ::= begin оператор{; оператор} end

оператор_цикла_с_постусловием ::=

repeat оператор{; оператор} until  выражение

оператор_цикла_с_предусловием ::= while выражение do оператор

оператор_цикла_for ::=

for имя:=выражение to выражение do оператор

оператор_выбора ::=

case выражение of вариант {; вариант} endcase

вариант ::= метка_варианта : оператор

метка_варианта ::= конст | логическое_значение

условный_оператор ::=

if выражение then оператор else оператор

Семантика описанных конструкций эквивалентна семантике соответствующих конструкций стандарта языка Паскаль [12].

Требуется написать на языке Рефал интерпретатор паскаль-программ, который выполняет:

  • ввод паскаль-программы из файла;

  • лексический и синтаксический анализ введённой программы с выдачей диагностических сообщений в случаях обнаружения в ней ошибок;

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

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

    • нарушение баланса открывающих и закрывающих скобок в выражениях;

    • неверная запись или пропуск операций и операндов в выражении;

    • нарушения синтаксиса записи операторов;

    • в том числе – баланса операторных скобок begin и end, а также case и endcase;

    • присваивание значения константе;

    • неописанный или дважды описанный идентификатор;

    • несоответствие типов в операторе присваивания и в выражении;

    • неверный тип выражения в условном операторе и операторе цикла.

В процессе интерпретации следует выявлять такие ошибки, как переменная без значения, деление на ноль, зацикливание. Требуется также контролировать изменение параметра цикла в цикле for, поскольку присваивание переменной-параметру цикла в теле цикла запрещено.

В случае обнаружения ошибки в ходе интерпретации рефал-программа должна выдать соответствующее диагностическое сообщение, после чего по возможности продолжить дальнейшее её выполнение.
1   ...   14   15   16   17   18   19   20   21   22


написать администратору сайта