2016-07-22 11 views
1

Я сейчас в середине создания простого интерпретатора байт-кода, который использует RPN для обозначения выражений и действительно постфиксной нотации для чего-либо, но теперь я пришел к вопросу, который есть: может ли оценка короткого замыкания на самом деле быть используется для постфиксных выражений? Например, при оценке выражения (false & & (factorial (7)> ​​factorial (5))) C++ знает, что оператор & & на двух операндах оценивает значение false до того, как он даже попадает во второй операнд, поскольку (false & & ничего) всегда равно false. Теперь, когда вы помещаете это в RPN, вы получаете (false (7 факториалов 5 факториалов>) & &).Оценка короткого замыкания RPN

Я хотел создать эффективный синтаксический анализатор выражения RPN, поэтому проблема заключается в следующем: как сделать эффективный парсер выражения RPN с оценкой короткого замыкания?

+0

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

+0

@MarcB Спасибо за информацию, которую я думаю. Во всяком случае, я получил полезный ответ, так что да. –

+0

RPN и постфиксные обозначения - это одно и то же, а не две разные вещи. Вы не создаете парсеры RPN в интерпретаторы. Ввод уже разобран и может обрабатываться линейно. Если вам нужна оценка короткого замыкания, вам нужно ввести филиалы. – EJP

ответ

1

Вы бы оценили выражение RPN в две фазы.

Этап 1: проанализируйте RPN и создайте древовидное представление RPN. Итак, в этом дереве, например, узел && имеет два дочерних узла для каждой половины выражения. Построение этого дерева является почти идентичным процессом, как оценка RPN, за исключением оценочной части, которая заменяется операцией построения нового узла и связыванием ее дочерних узлов с их новым родительским узлом, а затем возвращением родительского узла на RPN оценка стек.

Этап 2. Оцените построенное дерево, используя рекурсивный спуск. На этом этапе оценка короткого замыкания становится тривиальной: оцените левого ребенка &&, а затем решите, действительно ли вы хотите оценить правого ребенка.

Ditto для || узла, и т.д. ...

+0

Спасибо, что это отлично! :) –

+0

Вопрос: было бы иначе, если я вместо этого переключусь на использование PN вместо RPN? –

+0

Первый этап был бы разным, конечно. Различная логика для построения дерева. В качестве альтернативы, парсер PN может быть записан так, что он несет флаг «игнорировать», где он только анализирует и проглатывает ввод, не оценивая его, рекурсивно передавая флаг вниз; с операторами '&&' и '' ', устанавливающими флаг для оценки правой стороны, если оценка левой стороны сделала ненужным для оценки правой части. –