【发布时间】:2017-05-23 09:12:30
【问题描述】:
我正在用 C++ 编写一个程序,它需要能够测试一个字符串(可能是std::string)是否是一个有效的 C++ 表达式。可以检查变量是否已声明(bool variableDeclared(std::string identifier)),也可以检查其类型(std::string variableType(std::string identifier))。 variableType 函数根据在 C++ 中的声明方式("bool"、"double"、"char" 等)返回一个字符串。
表达式不需要计算,只需要测试它是否有效。该函数只需要支持字符文字、字符串文字、数字文字、括号、简单运算符(+、-、*、/、!(逻辑不)、&&、@987654334 @、>、<、==) 以及 double、std::string(不需要函数调用)、bool 和 char 类型的变量。也不需要支持字符串连接。
所需的结果将是一个类似于bool validExpression(std::string expression) 的函数。最好它允许我修改操作(例如我可以将"==" 更改为"equal-to")。
我将如何实现这一点?是否有一个库可以做这样的事情,一个正则表达式语句,还是只是一个包含大量 if 语句的长函数?
【问题讨论】:
-
编译它。如果它编译,那么 也许 它是有效的代码。这个练习的目的是什么?您是否正在尝试编写脚本语言?这可能是一条漫长而丑陋的道路,但也很有趣。请记住,除非您绝对信任提供代码的人,否则编译和执行任意代码是一个非常非常糟糕的主意。
-
如果您以前从未做过类似的事情,我建议您编写一个简单的表达式求值器来开始。允许的部分应该是整数(例如
123)、括号((、))、+和*。那么calc("1+2*3")应该返回 7。 -
@tadman 你确实意识到问题在于 OP 的问题比常规语言可以解决的问题更难,对吧?
-
@tadman 该页面上的第一句话:“Ragel 从常规语言编译可执行的有限状态机。”这意味着它不能做 OP 想要的。那为什么要推荐呢?
-
@tadman 不,这是我第一次听说 Ragel。但其描述的第一句话指出,它不能用于为包含可嵌套括号的语言生成解析器。如果您仅将它用作标记器(参见 Flex)并自己构建解析器,那很好。但是标记 OP 的输入是微不足道的。它需要一些工作的解析。
标签: c++ string parsing c++11 expression