我想解析一个类似于 Gmail 使用 Perl 提供的搜索字符串。一个示例输入是“tag:thing by:{user1 user2} {-tag:a by:user3}”。我想把它放到一个树形结构中,比如
{and => [
"tag:thing",
{or => [
"by:user1",
"by:user2",
]},
{or => [
{not => "tag:a"},
"by:user3",
]},
}
一般规则是:
- 以空格分隔的标记默认为 AND 运算符。
- 大括号中的标记是替代选项 (OR)。大括号可以放在字段说明符之前或之后。即“by:{user1 user2}”和“{by:user1 by:user2}”是等价的。
- 以连字符为前缀的标记被排除在外。
这些元素也可以组合和嵌套:例如“{by:user5 -{tag:k by:user3}} 等”。
我正在考虑编写一个上下文无关的语法来表示这些规则,然后将其解析到树中。这是不必要的吗?(这可能使用简单的正则表达式吗?)
推荐使用哪些模块来解析上下文无关语法?
(最终这将用于生成带有 DBIx::Class 的数据库查询。)