Вы находитесь на странице: 1из 11

Практическое занятие 1

Основы синтаксиса
1. Записать в префиксной и постфиксной форме:
x–y+z–k
2. Составить абстрактные синтаксические деревья для
выражений:

a*b+c
a * (b + c)
a*b+c*d
a * (b + c) * d
3. Извлечь из построенных АСД линейную префиксную и
постфисную формы:

2
4. Вычислить значение постфиксного выражения
77423–
с помощью структуры данных стек.
Стек следует отображать в виде прямоугольника, растущего вниз. Стек на
каждом шаге вычисления должен содержать конкретные элементы.
Порядок вычисления постфиксного выражения с использованием стека:
1. Выражение просматривается слева направо.
2. Если следующий элемент — операнд, помещаем его в стек.
3. Если очередной символ является символом n-арной операции,
значит, n ее операндов должны быть представлены n верхними
элементами стека. Вынимаем эти элементы, применяем операцию.
Результат заносим в стек.
Вершина стека на всех шагах вычисления должна находиться на одном и
том же уровне.
Направление перемещения элементов (чисел и/или значков операции)
нужно показать стрелкой, расположенной над вершиной стека.

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

4
Используя грамматику для арифметических выражений:
<E> :: = <E> + <T> | <E> – <T> | <T>
<T> :: = <T> * <F> | <T> / <F> | <F>
<F> :: = number | name | (<E>)
где <E> — выражение, <T> — терм, <F> — фактор,
изобразить дерево разбора для следующих арифметических
выражений:
1) 2 + 3
2) (2 + 3)
3) 2 + 3 * 5
4) (2 + 3) * 5
5) 2 + (3 * 5)

5
  Таблица операций языка Паскаль имеет следующий
вид:

Все операции, отображенные в таблице, имеют левую


ассоциативность (группировка элементов осуществляется
слева направо). Все операции в одной строке имеют
одинаковый приоритет.
Записать грамматику выражений для языка Паскаль

<фактор> :: = not <фактор> | name | number | (<выражение_отношения>)

6
 Используя команды виртуальной машины, дайте
операционное семантическое определение для
цикла for-to языка Паскаль
for i := first to last do…

i := first
loop: if i > last goto out

...
i := i + 1
  goto loop
 out:

7
Вычислить слабейшее предусловие для оператора
присваивания и постусловия.
Дано:
оператор присваивания: a := 2 * (b – 1) – 1
постусловие: {a > 0}
Дано:
оператор присваивания: b := (c + 10) / 3
постусловие: {b > 6}
Дано:
оператор присваивания: a := a + 2 * b – 1
постусловие: {a > 1}
Дано:
оператор присваивания: x := 2 * y + x – 1
постусловие: {x > 11}

8
Вычислить слабейшее предусловие для
последовательности операторов присваивания и
ее постусловия.
Дано:
оператор присваивания: a := 2 * b + 1
оператор присваивания: b := a – 3
постусловие: {b < 0}

Дано:
оператор присваивания: a := 3 * (2 * b + a)
оператор присваивания: b := 2 * a – 1
постусловие: {b > 5}

9
Доказать, что следующая программа корректна:

{y = Vy and x = Vx}
temp = x;
x = y;
y = temp;
{x = Vy and y = Vx}

10
  
СПАСИБО ЗА ВНИМАНИЕ

11