gpt4 book ai didi

c++ - x3 在运行时修改解析器

转载 作者:行者123 更新时间:2023-11-28 04:18:26 24 4
gpt4 key购买 nike

我想知道是否可以在运行时更改解析器,因为它不会更改复合属性。

假设我希望能够在运行时修改我的解析器的字符,该字符检测我是否必须加入从 ;~ 的行。两者都只是字符,并且由于 c++ 类型和模板实例化没有变化(在这两种情况下我们都在谈论 char),我认为一定有某种方式,但我没有找到它。那么这可能吗?

我的具体情况是,我正在通过 C++/CLI 调用 X3 解析器,并且需要字符可以从 .NET 进行调整。我希望以下示例足以理解我的问题。

http://coliru.stacked-crooked.com/a/1cc2f2836dbfaa46

亲切的问候

最佳答案

您不能在运行时更改解析器(除了我在您的其他问题 https://stackoverflow.com/a/56135824/3621421 下描述的 DSO 技巧),但您可以通过语义操作和/或有状态解析器使您的解析器上下文敏感(如 x3::symbols)。

语义 Action (或者可能是您的自定义解析器)的状态也可以存储在解析器上下文中。 但是,通常我看到人们为此目的使用全局变量或函数局部变量。

一个简单的例子:

#include <boost/spirit/home/x3.hpp>
#include <iostream>

namespace x3 = boost::spirit::x3;

int main()
{
char const* s = "sep=,\n1,2,3", * e = s + std::strlen(s);
auto p = "sep=" >> x3::with<struct sep_tag, char>('\0')[
x3::char_[([](auto& ctx) { x3::get<struct sep_tag>(ctx) = _attr(ctx); })] >> x3::eol
>> x3::int_ % x3::char_[([](auto& ctx) { _pass(ctx) = x3::get<struct sep_tag>(ctx) == _attr(ctx); })]
];
if (parse(s, e, p) && s == e)
std::cout << "OK\n";
else
std::cout << "Failed\n";
}

关于c++ - x3 在运行时修改解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56045313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com