C语言DFA字符串,c – 提升字符串匹配DFA

你考虑过Spirit吗?当然你没有在上下文中指定你如何检测后缀(你最后是否需要它们,你需要一些语法吗?)但是你可以这样做:

x3::symbols sym;

sym += "foo", "bar", "qux";

它构建了一个非常有效的Trie.它可以解析任何类型的输入迭代器(如果你是如此倾向,包括流).只需为上下文要求添加一些魔法约束,例如输入结束:

bool has_suffix(string_view sv) {

return parse(sv.cbegin(), sv.cend(), x3::seek[suffix >> x3::eoi]);

}

如果您甚至希望返回字符串的文本值,只需执行以下操作:

string_view get_suffix(string_view sv) {

boost::iterator_range<:const_iterator> output;

parse(sv.cbegin(), sv.cend(), x3::seek[x3::raw[suffix >> x3::eoi]], output);

return {output.begin(), output.size()};

}

精神让你有很大的自由来围绕智能,动态添加/删除符号,例如与Trie等使用no_case

完整的演示

使用X3(c 14)

#include

#include

#include

namespace Demo {

using Char = char32_t;

using string_view = std::basic_string_view;

namespace x3 = boost::spirit::x3;

static auto const suffix = [] {

x3::symbols sym;

sym += "foo", "bar", "qux";

return sym; // x3::no_case[sym];

}();

bool has_suffix(string_view sv) {

return parse(sv.cbegin(), sv.cend(), x3::seek[suffix >> x3::eoi]);

}

string_view get_suffix(string_view sv) {

boost::iterator_range<:const_iterator> output;

parse(sv.cbegin(), sv.cend(), x3::seek[x3::raw[suffix >> x3::eoi]], output);

return {output.begin(), output.size()};

}

}

#include

#include

int main() {

using namespace Demo;

auto widen = [](string_view sv) { return std::wstring(sv.begin(), sv.end()); };

std::wcout << std::boolalpha;

for (string_view testcase : { U"nope", U"lolbar you betqux" }) {

std::wcout

<< widen(testcase)

<< L" -> " << has_suffix(testcase)

<< L" (" << widen(get_suffix(testcase))

<< L")\n";

}

}

打印

nope -> false ()

lolbar you betqux -> true (qux)

精神版

和C 03版本的真正复古编程体验:Live On Coliru

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值