我正在用C ++编写一个程序,需要能够测试一个字符串(可能是std::string
)是否是一个有效的C ++表达式。如果变量已被声明(bool variableDeclared(std::string identifier)
),则可以检查变量,也可以检查它们的类型(std::string variableType(std::string identifier)
)。 variableType
函数根据在C ++("bool"
,"double"
,"char"
等中声明的方式返回一个字符串。
表达式不需要进行评估,只是测试它是否有效。该函数只需要支持字符文字,字符串文字,数字文字,括号,简单操作符(+
,-
,*
,/
,!
( (不是逻辑),&&
,||
,>
,<
,==
)以及double
,std::string
类型的变量(不需要函数调用),bool
和char
。它也不需要支持字符串连接。
期望的结果将是类似bool validExpression(std::string expression)
的函数。最好还是允许我修改操作(例如我可以将"=="
更改为"equal-to"
)。
我该如何实现?是否有一个可以执行此类操作的库,一个正则表达式语句,还是仅仅是一个包含大量if
语句的长函数的问题?
答案 0 :(得分:4)
在形式上,您的情况是:您的语法描述了您要验证的表达式的语言,以及您想要确定它是否属于该语言的单词。这是该语言解析器的工作。
您可以手工烹饪类似递归下降的LL(1)解析器,或使用工具生成解析器。这种工具的一个众所周知的例子是Bison,用于生成LALR(1)解析器。维基百科有很长的parser generator list。
上面使用的技术术语主要是为谷歌搜索提供切入点。
答案 1 :(得分:1)
您可以从或多或少正式定义您的语言开始。 (语言是一组字符串)。定义语言的一种好方法是指定其无上下文语法。在散文中非正式地描述其他条件(如必须声明变量和正确类型的要求)。
下一步是为前一步骤中指定的语法构建解析器。有几种工具可以自动从语法构建解析器,从yacc / bison到boost :: spirit。
在构建并检查解析器之后,实现非正式指定的规则并将它们插入到解析器代码/数据中。
通常,构建评估者的下一步可能是编写简单解释器最简单的部分,但是你说你不需要一个。
将您的语言描述为“就像C ++一样只取出某些位”可能是上述顺序的一个初步步骤。但是,如果你能提供帮助,不建议从C ++开始。 C ++是一种非常难以正式指定的语言,由于其复杂的声明语法,它的解析器往往相当多毛。
答案 2 :(得分:-3)
您可以将编译器作为应用程序的子进程运行。您所要做的就是传递参数并正确解析响应