Разбор логического выражения в машину с одной памятью с использованием lex и yacc - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь написать небольшое приложение, которое в некотором смысле упрощает логическое выражение, приложение будет использовать только один слот памяти. Если необходимо более одного слота памяти, я хочу вернуть сообщение о том, что приложение не может выполнить оценку выражения. Я использую AST, который я создал из lex и yacc.

Основная идея состоит в том, чтобы взять логическое выражение и преобразовать его во что-то вроде этого:

X==3 || y==3 && z==5 || x!=4

, поэтому расчет будет линейным слева направо Если дано выражение типа

x==3 || (y==3 && z==5)

Тогда я хочу, чтобы он был разобран в

y==3 && z==5 || x==3

Это имеет эквивалентное совпадение, и ему не нужно сначала сохранять результат x == 3 в регистр. Для этого он использует только один слот памяти и все еще возвращает правильный результат.
выражения, такие как:

(x==3 || y==4) && (t==3 || t>4)

слишком сложны

x==3 || x==4 || (x==5 && x==6)

Так как вы не можете разобрать его в один слот памяти из AST.
Однако следует помнить, что выражение

x==4 && (x==3 && y==5) && p==5

все еще жизнеспособен и может быть проанализирован в

x==3 && y==5 && x==4 && p==5

Аст, который я построил с использованием yacc, имеет следующие правила:

E -> E | E '||' T
T -> T | T '&&' F
F -> exp | '(' E ')'


exp -> create это выражения типа x == 3, здесь нет рекурсивных понятий, это ведет к концу правил.


Я не уверен, нужно ли строить дерево, но проблема в том, что 2 логических выражения:

1. x==4 && (x==3 && y==5) && p==5
2. x==3 || x==4 && (x==5 && x==6)


генерировать тот же AST, ну почти то же самое, различия между двумя очень незначительны, и они отражают друг друга. Кажется, я не могу найти практическое правило, чтобы сказать мне, что «слишком сложно», а что нет.
Конечно, эти два выражения могут генерировать гораздо более сложные выражения, но они должны следовать тем же правилам.

Можно предположить, что само приложение, очевидно, имеет память и выполняет только синтаксический анализ выражения, а также имеет доступ ко всем возможностям c.

Спасибо большое заранее

...