Я хочу оценить строку условного выражения, я определил следующее BNF:
X ::= <value>
COND ::= X | X '==' X | '!{' COND '}' | '{' COND '&&' COND '}' | '{' COND '||' COND '}'
На основе этой структуры я написал эту функцию оценки, возвращающую логическое значение:
-- Bedingung auswerten
function eval(exp, valueTab, loopValue)
-- !{COND} - Negierung
if string.find(exp, '^!{(.+)}$') then
return not eval(string.gsub(exp, '^!{(.+)}$', '%1'))
-- {COND&&COND} - AND
elseif string.find(exp, '^{(.+)&&(.+)}$') then
return (eval(string.gsub(exp, '^{(.+)&&(.+)}$', '%1')) and eval(string.gsub(exp, '^{(.+)&&(.+)}$', '%2')))
-- {COND||COND} - OR
elseif string.find(exp, '^{(.+)||(.+)}$') then
return (eval(string.gsub(exp, '^{(.+)||(.+)}$', '%1')) or eval(string.gsub(exp, '^{(.+)||(.+)}$', '%2')))
-- X==X - Gleichheit -> true/false
elseif string.find(exp, '^(.+)==(.+)$') then
return (getValue(string.gsub(exp, '^(.+)==(.+)$', '%1'), valueTab, loopValue) == getValue(string.gsub(exp, '^(.+)==(.+)$', '%2'), valueTab, loopValue))
-- X -> false wenn X nil/false auswertet ansonsten true
else
return (getValue(exp, valueTab, loopValue) and true or false)
end
end
Но это не работает для некоторых вложенных условий, таких как
exp = '{{1||boolean:false}&&{boolean:true&&!{boolean:false}}}'
Первый рекурсивный шаг разбивает выражение на
eval('{1||boolean:false}&&{boolean:true') and
eval('!{boolean:false}}'
Любая идея, как я могу проверить, если число '{'равно количеству '}'?Это должно разделить выражение как
eval('{1||boolean:false}') and
eval('{boolean:true&&!{boolean:false}}')
Я надеюсь, вы понимаете мой вопрос, если у вас есть какие-либо дополнительные вопросы, дайте мне знать.Я также готов изменить свой синтаксис, если у вас есть идея получше.Но отрицание, AND- и OR-предложения должны поддерживаться.