用已知变量解析字符串中的逻辑表达式
Posted
技术标签:
【中文标题】用已知变量解析字符串中的逻辑表达式【英文标题】:Parsing logic expressions in strings with known variables 【发布时间】:2015-11-21 07:38:08 【问题描述】:我想要做的是创建一个函数,该函数将接受一个带有 1-3 个变量的输入字符串(并且至少需要一个),然后解析该输入以获得一个表达式。然后,此表达式将被视为合乎逻辑并返回 true 或 false。
例如,
"X == Y && 0.1 <= X < 1.0 && Z > 0.0"
然后首先迭代该字符串中的变量并用实际值替换。替换所有变量后,修改后的字符串将如下所示:
"1.0 == 1.0 && 0.1 <= 1.0 < 1.0 && 0.6 > 0.0"
然后该字符串将被逻辑测试。如果为真,则该函数将返回真,否则返回假。
我在想函数应该是这样的:
IsLogical(string, float X, float Y, float Z)
过去几个小时我一直在寻找实现此目的的方法,但我发现的只是算术数学方程解析器。到目前为止,我所做的只是将变量替换为三个输入值的部分。
如果有人愿意帮忙,你能告诉我怎么做吗?给我看例子肯定也很棒。
此函数不能使用任何外部资源,如 boost 或嵌入式 Lua。
编辑:这应该包括 C++ 中的所有基本比较运算符,例如小于、大于、小于或等于、大于或等于、等于、不等于、和、或、括号。它将全部采用 C++ 格式。如果输入的格式不正确,函数会自动返回 false。
【问题讨论】:
我只需要插入变量并进行评估。在这里嵌入 Lua 绝对不是一个选择。 @CoreyIles 你的问题是什么?您是要求有人为您编写代码,还是您的代码存在特定问题? 阻止我使用它的不是 Lua 的大小。你建议我如何让它不那么宽泛? 【参考方案1】:这是对您的问题的一次疯狂尝试。不详细写代码,也不关注语言语义、完美编译等。
用新类型 (ExpresionVar) 包装变量。使用 ExpressionBuilder 注册每个变量,其中包含在程序开头注册的逻辑运算符。参考结果中的cmets(伪代码)...
ExpressionVar
float value_;
std::string name_;
;
LogicalOp
virtual std::string id() const = 0;
virtual bool operator()(
const ExpressionVar& lhs, const ExpressionVar& rhs) const = 0;
;
IsEqual : LogicalOp
std::string id() const override return "==";
bool operator()(
const ExpressionVar& lhs, const ExpressionVar& rhs) const override
returns lhs.value_ == rhs.value_;
;
//etc...
ExpressionBuilder
void registerVar(std::initializer_list<const ExpressionVar&>);
static void registerLogical(LogicalOp&&);
bool result(const std::string& expression) const
//run through expression.
// Search for known ExpressionVariable (EV), if variable found,
// store as lhs, else throw.
// Then search for LogicalOp until found, if another EV found
// throw, else store op, whereafter searching of rhs, etc...
;
bool IsLogical(
const std::string& input,
std::initializer_list<ExpressionVar> variables)
//Logical ops registered prior...
return ExpressionBuilder().registerVar(variables).result(input);
【讨论】:
我认为这是一个非常好的答案——让语言处理运算符,并将重点转移到解析上。它可能只涉及到一点点处理括号、一元非等。但我认为考虑到操作的特定要求,这是一个很好的起点。以上是关于用已知变量解析字符串中的逻辑表达式的主要内容,如果未能解决你的问题,请参考以下文章