Задать вопрос
@Mizafix

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

Пишу простой интерпретатор.
для такого кода:
a = 10;
    b = a + 10;
    i = 12;
    if (i > 0 and 12 <= 4)
    {
        output i;
    }


Представление в ПОЛИЗ (со стеком):
{'type': 'PUSH', 'value': '10'}
{'type': 'SET', 'variable': 'a', 'value': {'type': 'constant', 'value': '10'}}
None
{'type': 'PUSH', 'value': 'a'}
{'type': 'PUSH', 'value': '10'}
{'type': 'ADD', 'left': {'type': 'identifier', 'name': 'a'}, 'right': {'type': 'constant', 'value': '10'}}
{'type': 'SET', 'variable': 'b', 'value': {'type': 'operation', 'operator': '+', 'left': {'type': 'identifier', 'name': 'a'}, 'right': {'type': 'constant', 'value': '10'}}}  
None
{'type': 'PUSH', 'value': '12'}
{'type': 'SET', 'variable': 'i', 'value': {'type': 'constant', 'value': '12'}}
None
{'type': 'PUSH', 'value': 'i'}
{'type': 'PUSH', 'value': '0'}
{'type': 'CMP', 'left': {'type': 'identifier', 'name': 'i'}, 'right': {'type': 'constant', 'value': '0'}}
{'type': 'PUSH', 'value': '12'}
{'type': 'PUSH', 'value': '4'}
{'type': 'CMP', 'left': {'type': 'constant', 'value': '12'}, 'right': {'type': 'constant', 'value': '4'}}
[{'type': 'JZ', 'condition': {'type': 'condition', 'operator': 'and', 'left': {'type': 'comparison', 'operator': '>', 'left': {'type': 'identifier', 'name': 'i'}, 'right': {'type': 'constant', 'value': '0'}}, 'right': {'type': 'comparison', 'operator': '<=', 'left': {'type': 'constant', 'value': '12'}, 'right': {'type': 'constant', 'value': '4'}}}, 'label': 'end_if_0'}, {'type': 'LABEL', 'name': 'end_if_0'}, {'type': 'if_statement', 'condition': {'type': 'condition', 'operator': 'and', 'left': {'type': 'comparison', 
'operator': '>', 'left': {'type': 'identifier', 'name': 'i'}, 'right': {'type': 'constant', 'value': '0'}}, 'right': {'type': 'comparison', 'operator': '<=', 'left': {'type': 'constant', 'value': '12'}, 'right': {'type': 'constant', 'value': '4'}}}, 'body': [{'type': 'OUTPUT', 'value': [{'type': 'PUSH', 'value': 'i'}, {'type': 'identifier', 'name': 'i'}]}], 'else_body': None}]


Правильно ли я понял алгоритм преобразования или он должен быть еще более подробным?
  • Вопрос задан
  • 60 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
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 получает значение, но не используется, выбрасываем.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы