Perl を使用して、Gmail が提供するものと同様の検索文字列を解析したいと考えています。入力例は、「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 でデータベースクエリを生成するために使用されます。)