Я пишу переводчик. Я делал это раньше, но никогда не пробовал такого, который мог бы работать с выражениями типа 3 + 4 * 2 / ( 1 − 5 ) ^ 2 ^ 3
.
У меня нет проблем с процессом синтаксического анализа, на самом деле речь идет о моей виртуальной машине, которая затем выполняет код.
Моей целью был быстрый интерпретатор, и поэтому я решил не использовать виртуальную машину на основе стека, где для умножения потребуется более одной инструкции, например (push, push, mul)
Код «сборки» для виртуальной машины, сгенерированный синтаксическим анализатором, выглядит следующим образом:
3 + 4 * 2 / ( 1 − 5 ) ^ 2 ^ 3
становится
sub 1 5
pow result 2
pow result 3
div 2 result
mul 4 result
add 3 result
(результат верный)
- Как видите: каждая инструкция принимает аргументы no, one или two. Есть регистр результата, который содержит результат последней инструкции. И это все.
Может ли виртуальная машина с языком этой структуры и только одним регистром вычислять каждое математическое выражение, например, Python или PHP?
Если это невозможно без стека, я начну прямо сейчас!