如何使用 boost::spirit::lex 实现包含指令?

2023-12-23

我有一个由spirit::lex 和spirit::qi 构建的简单配置文件解析器。当词法分析器到达模式时include "path"我希望包含文件的文本。如您所知,spirit::lexer::begin() 启动扫描过程:

// Read file contents into a std::string
...

// _first and _last are const char*
_first = _contents.c_str();
_last  = &_first[_input.size()];

// _token is a lexer::iterator_type for the current token
_token = _lexer.begin(_first, _last);

我的想法是有一个堆栈来存储表示为结构的词法分析器状态:

struct LexerState
{
    const char* first;
    const char* last;
    std::string contents;
};

词法分析器将能够识别以下模式:include "path"并在语义操作中提取包含文件的路径。然后,当前的词法分析器状态被压入堆栈,文件的内容被加载到字符串中,并使用 lexer::begin() 如上所述初始化新状态。

当词法分析器找到 EOF 字符时,将弹出堆栈并使用之前的词法分析器状态变量调用 lexer::begin()。

像这样重复调用 lexer::begin() 可以吗?如何让 lex::lexer 识别include "path"模式和 EOF 字符而不向 qi 解析器返回标记?

最后,有没有其他替代或更好的方法来实现这一目标?


看看如何升压波 http://www.boost.org/doc/libs/1_49_0/libs/wave/index.html做事:

The WaveC++ 预处理器库使用Spirit解析器构建库,用于实现具有符合 ISO/ANSI 标准的预处理功能的 C++ 词法分析器。它公开一个迭代器接口,该接口从输入流返回当前预处理的标记。该预处理标记是在迭代预处理器迭代器序列时动态生成的(在 STL 的术语中,这些迭代器是前向迭代器)。

关于功能:

C++ 预处理器提供了四个独立的工具,您可以根据需要使用它们:

  • 包含头文件
  • 宏观扩张
  • 条件编译
  • 线路控制

Their 快速入门示例 http://www.boost.org/doc/libs/1_49_0/libs/wave/samples/quick_start/quick_start.cpp展示了如何使用 Boost Wave 的词法分析器界面。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 boost::spirit::lex 实现包含指令? 的相关文章

随机推荐

  • 面向 .NET Core 3.1 的 C++/CLI

    NET Core 3 1 添加了对 C CLI 的支持 宣布 NET Core 3 1 https devblogs microsoft com dotnet announcing net core 3 1 官方公告列出了两个新的项目模板
  • .NET Windows 服务 - 架构决策

    我目前有一个全天持续运行的 Windows 服务 它有多个启动线程 每天更新缓存的任务 每周任务进行清理 将 XML 导入 SQL Server 的 24 7 任务 每天运行大约 12 小时的任务 启动控制台应用程序来管理 ETL 这些任务
  • 在 Java8 中设置 LocalDateTime 和时区的格式

    我有这个简单的代码 DateTimeFormatter FORMATTER DateTimeFormatter ofPattern yyyyMMdd HH mm ss SSSSSS Z LocalDateTime now format FO
  • 视图中的 HttpContext.User 或 Page.User?

    如果我在 Asp net MVC 的视图中编码并且我想获取当前用户 那么使用是否更好 Page User or HttpContext User 有区别吗 Page User回报this Context User这与HttpContext
  • ChromeDriver 控制台应用程序隐藏

    我创建了一个播放器 它将使用 C 中的 selenium 和 ChromeDriver 来自动化 chrome 运行良好 我面临的问题是 当它为 ChromDriver 创建对象时 它将启动 ChromeDriver 应用程序 该应用程序会
  • 反应事件未触发

    在与 img 标签并熟悉 React 我发现我的onLoad and onError事件没有触发 在将我的使用简化为最基本的 React 组件之后 我仍然发现事件没有触发 在下面的组件中 我希望单击渲染的 div 登录到控制台 它渲染得很好
  • Woocommerce - 产品页面中的描述

    我需要在 Woocommerce 插件中添加我的 产品 描述的一些摘录 我有这样的页面 http exploreprague cz guides buddies 2 http exploreprague cz guides buddies
  • 用户使用 Azure AD 身份验证登录后调用适用于 Teams 的图形 API

    在用户使用 Azure AD 登录应用程序后 我们尝试使用 Microsoft Graph API for Teams 用户应该能够向应用程序内的 Teams 频道发送消息 我试图得到访问令牌登录用户并将其作为不记名令牌传递给图形 API
  • 如何使用 transclude 将 ngRepeat“模板”传递给 ngDirective?

    Demo http plnkr co edit TiH96FCgOGnXV0suFyJA p preview http plnkr co edit TiH96FCgOGnXV0suFyJA p preview 我有一个名为 myDirect
  • 避免壁纸横跨 5 个屏幕

    我一直面临一个问题 如何在 Android 中设置壁纸 而不将其拉伸到 5 个主屏幕 需要明确的是 我有一个分辨率为 320x480px 的资源图像 当我在 Android 中将其设置为壁纸时 它会拉伸到 5 个屏幕 但我希望它仅显示在 1
  • 不允许 > 2mb 的图像

    你好 如何检查用户是否尝试上传大于 2mb 的文件 我想否认这一点 并向尝试这样做的用户发出错误消息 我知道是这样的 但是我该如何将 50000 更改为 2mb 呢 if FILES imagefile size gt 50000 die
  • 为什么使用片段?

    我已阅读文档并其他一些问题的主题 https softwareengineering stackexchange com q 200583 127226对于这个话题 我并没有真正被说服 我不清楚使用这种技术的局限性 碎片现在被视为最佳实践
  • 如何使用 mongodb 和 php 正确处理分页查询?

    我这样做对吗 我查看了一些使用 MySQL 的旧 PHP 代码 并设法让它工作 但是我想知道是否有一种更 干净 和 更快 的方法来完成此任务 首先我需要获取 文档 的总数 total documents collection gt find
  • 如果不是 SwingUtilities.invokeLater(),Java 剪贴板将忽略用户副本

    Problem 以编程方式在 Java 中设置剪贴板内容 然后获取剪贴板文本永远不会反映手动剪贴板内容更改 但是 推迟通过 SwingUtilities invokeLater 获取剪贴板文本直到处理完所有 Swing 事件确实反映了当前和
  • PinnedHeaderListView 示例

    我想实现一个列表视图 其部分标题类似于 Android 移动联系人中的部分标题 其中部分标题在滚动标题内的内容时不会滚动 我发现必须实现类似 PinnedHeaderListView 的东西 有人有关于如何开发 PinnedHeaderLi
  • javascript每9秒循环一次?

    我正在开发一个html5应用程序 我希望在写入随机位置8秒后 如果你赢了或没有赢一秒钟 它将写入 然后它将从创建一个新的随机开始 我已经尝试过但它似乎没有做任何事情 如果我写 while true 浏览器就会崩溃 有什么办法可以解决吗 jQ
  • TypeScript 第二个参数类型基于第一个参数类型

    我有第一个参数的可能值的枚举 并且我希望第二个参数基于第一个参数 因此 如果给出 NAME 我希望第二个参数为字符串 如果给出 AGE 我希望第二个参数是一个数字 我怎样才能做这样的事情 enum KeyType NAME AGE clas
  • 如何在mingw中静态链接libwinpthread-1.dll?

    我从这里使用 mingw http sourceforge net projects mingwbuilds files host windows releases 4 7 2 32 bit threads posix sjlj x32 4
  • Python:确定未排序的列表是否包含在“列表的列表”中,无论元素的顺序如何

    我有一个与这个问题类似的问题 确定 2 个列表是否具有相同的元素 无论顺序如何 https stackoverflow com questions 8866652 determine if 2 lists have the same ele
  • 如何使用 boost::spirit::lex 实现包含指令?

    我有一个由spirit lex 和spirit qi 构建的简单配置文件解析器 当词法分析器到达模式时include path 我希望包含文件的文本 如您所知 spirit lexer begin 启动扫描过程 Read file cont