Вы можете сделать это легко с помощью:
- генератор синтаксического анализатора (такой как ANTLR, упомянутый выше), который принимает логические выражения в качестве входных данных и создает список инфиксов и
- код для оценки стека обратной польской нотации.
Грамматика выглядит примерно так:
program: exprList ;
exprList: expr { Append($1); }
| expr OR exprList { Append(OR); }
| expr AND exprList { Append(AND); }
| NOT exprList { Append(NOT); }
| ( exprList ) { /* Do nothing */ }
;
expr: var { Append($1); }
| TRUE { Append(True); }
| FALSE { Append(False); }
;
Чтобы оценить, вы делаете это:
for each item in list
if item is symbol or truth value, push onto RPN stack
else if item is AND, push (pop() AND pop())
else if item is OR, push (pop() OR pop())
else if item is NOT, push (NOT pop())
result = pop()
Для символов вы должны заменить значение истинности во время выполнения.