В настоящее время я работаю над интерпретатором скриптов для игры, которую портирую как личный проект - я уже задавал несколько вопросов по этому поводу ранее.
Он начинает работать довольно хорошо, однако я дошел до того, что мне нужно оценивать логические выражения, например, в циклах while, if и т. Д.
Мой текущий код токенизирует сценарий и передает логическое выражение функции с именем ProcessExpression(string[] tokens)
, когда оно встречается. Примером массива токенов может быть:
local.i
<=
local.arrayLength
+
1
&&
(
local.i
<
local.notThis
||
local.i
>
local.notThis
)
Размышляя о том, как выполнить фактическую оценку, я решил начать с замены переменных фактическими значениями, например: local.i
станет 0, local.arrayLength
станет 16, а local.notThis
станет 10.
Затем я подумал о том, чтобы пропустить полученные токены через калькулятор постфиксов, чтобы избавиться от всей математики, оставив только логические условия.
Тем не менее, я как бы не понимаю, стоит ли мне придерживаться этого подхода или нет. Видя, как одно только вычисление постфикса добавит много кода, мне было интересно, есть ли какие-то уловки, о которых я не подумал? Если postfix действительно подходит, могу ли я каким-то образом заставить его обрабатывать логические условия вместе с математическими операторами?
Я делаю это на C #, но, тем не менее, я не хочу использовать внешние библиотеки или какую-то функцию "Eval". Я также не заинтересован в создании грамматики для этого с использованием таких вещей, как ANTLR, поскольку должны быть менее навязчивые способы для чего-то, казалось бы, «простого» в качестве решателя выражений (если это будет термин для этого).