如何测试字符串是否是有效的C ++(ish)表达式?

时间:2017-01-09 06:48:56

标签: c++ string parsing c++11 expression

我正在用C ++编写一个程序,需要能够测试一个字符串(可能是std::string)是否是一个有效的C ++表达式。如果变量已被声明(bool variableDeclared(std::string identifier)),则可以检查变量,也可以检查它们的类型(std::string variableType(std::string identifier))。 variableType函数根据在C ++("bool""double""char"等中声明的方式返回一个字符串。

表达式不需要进行评估,只是测试它是否有效。该函数只需要支持字符文字,字符串文字,数字文字,括号,简单操作符(+-*/!( (不是逻辑),&&||><==)以及doublestd::string类型的变量(不需要函数调用),boolchar。它也不需要支持字符串连接。

期望的结果将是类似bool validExpression(std::string expression)的函数。最好还是允许我修改操作(例如我可以将"=="更改为"equal-to")。

我该如何实现?是否有一个可以执行此类操作的库,一个正则表达式语句,还是仅仅是一个包含大量if语句的长函数的问题?

3 个答案:

答案 0 :(得分:4)

在形式上,您的情况是:您的语法描述了您要验证的表达式的语言,以及您想要确定它是否属于该语言的单词。这是该语言解析器的工作。

您可以手工烹饪类似递归下降的LL(1)解析器,或使用工具生成解析器。这种工具的一个众所周知的例子是Bison,用于生成LALR(1)解析器。维基百科有很长的parser generator list

上面使用的技术术语主要是为谷歌搜索提供切入点。

答案 1 :(得分:1)

您可以从或多或少正式定义您的语言开始。 (语言是一组字符串)。定义语言的一种好方法是指定其无上下文语法。在散文中非正式地描述其他条件(如必须声明变量和正确类型的要求)。

下一步是为前一步骤中指定的语法构建解析器。有几种工具可以自动从语法构建解析器,从yacc / bison到boost :: spirit。

在构建并检查解析器之后,实现非正式指定的规则并将它们插入到解析器代码/数据中。

通常,构建评估者的下一步可能是编写简单解释器最简单的部分,但是你说你不需要一个。

将您的语言描述为“就像C ++一样只取出某些位”可能是上述顺序的一个初步步骤。但是,如果你能提供帮助,不建议从C ++开始。 C ++是一种非常难以正式指定的语言,由于其复杂的声明语法,它的解析器往往相当多毛。

答案 2 :(得分:-3)

您可以将编译器作为应用程序的子进程运行。您所要做的就是传递参数并正确解析响应