Правильно ли я преобразовал данное выражение в форму ПОЛИЗ?

Я разрабатываю простой интерпретатор, и мне нужно представить следующий код в форме ПОЛИЗ (Обратная польская запись): 

<pre><code>a = 10;
b = a + 10;
i = 12;
if (i &gt; 0 and 12 &lt;= 4)
{
    output i;
}</code></pre> 

Каков будет соответствующий вид представления в ПОЛИЗ (с использованием стека)? 

<pre><code>{'type': 'PUSH', 'value': '10'}
...
{'type': 'if_statement', 'condition': {'type': 'condition', 'operator': 'and', 'left': {'type': 'comparison', 'operat</code></pre>
  • 18 декабря 2024 г. 17:53
Ответы на вопрос 2
Чтобы представить ваш код в форме ПОЛИЗ (Обратная польская запись), сначала давайте разберем выражения и операции в вашем коде. Ваша программа включает присваивания, условные операторы и вывод переменных. Мы можем преобразовать каждую часть кода в ПОЛИЗ следующим образом:

### 1. Присваивание `a = 10`
В ПОЛИЗ сначала помещаем значение, затем переменную, в которую мы хотим его сохранить:

```
{'type': 'PUSH', 'value': 10}  // положить 10 на стек
{'type': 'STORE', 'variable': 'a'}  // сохранить на переменной a
```

### 2. Присваивание `b = a + 10`
Сначала нужно получить `a`, затем положить 10 и выполнить операцию сложения:

```
{'type': 'LOAD', 'variable': 'a'} // загрузить значение a
{'type': 'PUSH', 'value': 10} // положить 10 на стек
{'type': 'ADD'} // сложить два верхних значения стека
{'type': 'STORE', 'variable': 'b'} // сохранить результат в переменной b
```

### 3. Присваивание `i = 12`
Для этого присваивания:

```
{'type': 'PUSH', 'value': 12} // положить 12 на стек
{'type': 'STORE', 'variable': 'i'} // сохранить на переменной i
```

### 4. Условие `if (i > 0 and 12 <= 4)`
Для условия в ПОЛИЗ сначала нужно рассмотреть каждое подусловие:

- `i > 0`: 

```
{'type': 'LOAD', 'variable': 'i'} // загрузить значение i
{'type': 'PUSH', 'value': 0} // положить 0 на стек
{'type': 'GREATER'} // сравнить i и 0
```

- `12 <= 4`:

```
{'type': 'PUSH', 'value': 12} // положить 12 на стек
{'type': 'PUSH', 'value': 4} // положить 4 на стек
{'type': 'LESS_EQUAL'} // сравнить 12 и 4
```

- `and`:

```
{'type': 'AND'} // выполнить логическое И на двух верхних значениях стека
```

### 5. Блок `output i`
Если условие истинно, нужно вывести значение `i`:

```
{'type': 'DUP'} // дублировать верхнее значение стека (результат условия)
{'type': 'PUSH', 'value': 'output'} // положить команду вывода на стек
{'type': 'LOAD', 'variable': 'i'} // загрузить значение i для вывода
{'type': 'CALL', 'function': 'output'} // вызвать функцию вывода
```

### Полное представление в ПОЛИЗ
Теперь, объединив все части, мы получаем:

```
[
    {'type': 'PUSH', 'value': 10},
    {'type': 'STORE', 'variable': 'a'},
    
    {'type': 'LOAD', 'variable': 'a'},
    {'type': 'PUSH', 'value': 10},
    {'type': 'ADD'},
    {'type': 'STORE', 'variable': 'b'},
    
    {'type': 'PUSH', 'value': 12},
    {'type': 'STORE', 'variable': 'i'},
    
    {'type': 'LOAD', 'variable': 'i'},
    {'type': 'PUSH', 'value': 0},
    {'type': 'GREATER'},
    
    {'type': 'PUSH', 'value': 12},
    {'type': 'PUSH', 'value': 4},
    {'type': 'LESS_EQUAL'},
    
    {'type': 'AND'},
    
    {'type': 'DUP'},
    {'type': 'LOAD', 'variable': 'i'},
    {'type': 'CALL', 'function': 'output'}
]
```

Таким образом, предоставленный код был успешно преобразован в ПОЛИЗ для простого интерпретатора.
IMHO, вы неправильно поняли польскую обратную запись. 
Каждая строка должна включать одно действие, выполняемое над стеком.
00: 10          10: :=          20: i
01: &a          11: i           21: output
02: :=          12: 0           22: 
03: a           13: >
04: 10          14: 12
05: +           15: 4
06: &b          16: <=
07: :=          17: and
08: 12          18: 22
09: &i          19: jz

А после оптимизации код должен вообще стать пустым.
12 <= 4 всегда false, заменяем.
На момент вычисления условия i всегда 10, заменяем.
10 > 0 всегда true, заменяем.
true and false всегда false, заменяем.
Условие всегда false, поэтому выбрасываем if вместе с содержимым.
Переменная i получает значение, но не используется, выбрасываем.
Переменная b получает значение, но не используется, выбрасываем.
Переменная a получает значение, но не используется, выбрасываем.
Похожие вопросы