2010-05-21 5 views
3

Я пишу переводчика. Я сделал это раньше, но никогда не пробовал один, который может работать с выражениями, такими как 3 + 4 * 2/(1 − 5)^2^3.Переводчик с однорежимной виртуальной машиной - можно оценить всю математику. выражения?

У меня нет проблем с процессом разбора, на самом деле речь идет о моей виртуальной машине, которая затем выполняет код.

Моя цель была быстрый переводчик, и поэтому я не решил использовать стек на основе VM, где вам потребуется более одной инструкции для умножения, например (толчок, толчок, MUL)

«сборки "код VM, порожденного анализатором выглядит следующим образом:

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 

(результат я s правильно)

  • Как вы можете видеть: Каждая инструкция не принимает ни одного, ни два аргумента. Существует регистр результатов, который содержит результат последней команды. Вот и все.

Может ли VM с языком этой структуры и только одним регистром вычислять каждое математическое выражение, например, Python или PHP?

Если это невозможно без стека, я начну прямо сейчас!

ответ

4

Что вы делаете (1 + 2) * (3 + 4) или любое другое, что потребует от вас вычисления более чем одного промежуточного результата?

+0

Да, теперь у меня и моего переводчика есть проблема. – mersion

+0

Считаете ли вы, что это возможно с помощью двухрежимной машины? Итак, у вас есть результат последних * двух * операций? – mersion

+0

(1 + 2) * (3 + 4) + (5 + 6) * (7 * 8) –