М. В. Ломоносова Факультет вычислительной математики и кибернетики Е. И. Большакова, Н. В. Груздева Основы программирования на языке Рефал Учебное пособие
![]()
|
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, поскольку присваивание переменной-параметру цикла в теле цикла запрещено. В случае обнаружения ошибки в ходе интерпретации рефал-программа должна выдать соответствующее диагностическое сообщение, после чего по возможности продолжить дальнейшее её выполнение. |