// booleanparser.h
class BooleanParser
{
public:
Node *parse(const QString &expr);
private:
Node *parseOrExpression();
Node *parseAndExpression();
Node *parseNotExpression();
Node *parseAtom();
Node *parseIdentifier();
void addChild(Node *parent, Node *child);
void addToken(Node *parent, const QString &str, Node::Type type);
bool matchToken(const QString &str) const;
QString in; //存储要处理的布尔表达式的字符串
int pos; //分析布尔表达式字符串时的当前字符位置,起始为0
};
// booleanparser.cpp
Node *BooleanParser::parse(const QString &expr)
{
//首先将传入的布尔表达式的字符串保存下来,避免直接修改参数(这也是库的接口设计中常见的一个原则)
in = expr;
in.replace(" ", ""); //将其中的空格全部去掉
pos = 0;
//创建Root节点——布尔表达式的树状表达,显然需要有一个根节点,所以我们在这里直接创建根节点,这个根节点就是一个完整的布尔表达式
Node *node = new Node(Node::Root);
//或运算的优先级最低,应该最后被处理。一旦或运算处理完毕,意味着整个布尔表达式已经处理完毕,所以在调用了addChild(node, parseOrExpression())之后,返回整个node。
addChild(node, parseOrExpression());
Qt学习之路2的bool树模型,根据豆子的文章整理为代码形式,便于阅读理解
最新推荐文章于 2024-05-05 06:23:14 发布