问题标签 [boost-spirit-lex]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
149 浏览

boost-spirit - Boost.Spirit(2) Lex:strip_comments_lexer.cpp - 不工作?

boost_1_47_0/libs/spirit/example/lex/strip_comments_lexer.cpp 不剥离 C 风格的注释。为什么?

0 投票
2 回答
495 浏览

boost - 如何向基于 boost::spirit::lex 的词法分析器添加符号表接口?

要实现对 typedef 的支持,您需要在词法分析器识别标识符并返回不同标记时查找符号表。这在 flex lexer 中很容易完成。我正在尝试使用 boost Spirit 来构建解析器并查看示例,但它们都没有在词法分析器和解析器之间传递任何上下文信息。在 mini c 编译器教程示例中执行此操作的最简单方法是什么?

0 投票
1 回答
233 浏览

boost-spirit - 需要有关词法分析器 runtime_error 的帮助

我正在尝试为修改后的 C 语言编写 C qi 解析器。当我取消注释 t_in_op 和以下部分时,我收到一个运行时错误说明

语法错误:当索引 1 处的“+”时点击 BEGIN(或类似的东西,不记得确切)。这个词法分析器有什么问题?

simple.ic int i32 = 1;

0 投票
1 回答
658 浏览

c++ - 我无法在 Boost Spirit 的词法分析器功能中编译语义操作

所以,我正在使用 boost 1.47.0 并且我一直在尝试组合一个词法分析器。

我的目标是在我的词法分析器的一些标记中添加一个包含 spirit::lex::_pass = spirit::lex::pass_flags::pass_ignore. 但是,我无法编译任何语义操作。我在下面附上了一个(或多或少)最小的例子。我在 OS X 10.7.1 上使用 clang 进行编译。

编译命令

编译的代码

无法编译的代码

在无法编译的代码上报告错误。

0 投票
1 回答
1995 浏览

c++ - 我无法获取令牌的字符串值

我尝试使用 Boost Spirit 为一种小编程语言实现 Lexer。

我必须得到一个令牌的值,我得到一个 bad_get 异常:

在抛出 'boost::bad_get' 的实例后调用终止
what(): boost::bad_get: failed value get using boost::get Aborted

我在执行以下操作时收到此异常:

我的词法分析器是这样定义的:

还有其他方法可以获取 Token 的价值吗?

0 投票
1 回答
1533 浏览

c++ - 如何将 boost::spirit::lex 令牌的值从 iterator_range 转换为字符串?

当我尝试从 iterator_range 转换令牌的值时,词法分析器在尝试读取下一个令牌时失败。

这是包含令牌定义的 Tokens 结构:(我认为这不相关,但我包括在内以防万一。)

这是我的令牌和词法分析器类型的定义:

这是我用于读取令牌并将其值转换为字符串的代码。

此代码的输出是“9”(它读取第一个数字,在流中留下“索引”)。如果此时我打印出 string(first, last) 的值,它会显示“ndex”。由于某种原因,词法分析器在那个“i”字符上失败了?

我什至尝试使用 std::stringstream 进行转换,但这也会导致下一个令牌无效:

最后,如果我只是将令牌的值发送到 cout,则下一个令牌是有效的:

关于 token->value() 返回的 iterator_range 如何工作,我缺少什么?我用于将其转换为字符串的方法都没有修改 integer_range 或词法分析器的输入字符流。

编辑:我在这里添加这个,因为评论回复太短,无法完全解释发生了什么。

我想到了。正如 sehe 和 drhirsch 指出的那样,我最初问题中的代码是我实际正在做的事情的经过消毒的版本。我正在使用带有测试夹具类的 gtest 单元测试来测试词法分析器。作为该类的成员,我有 void scan(const std::string& str) 从给定的字符串分配第一个和最后一个迭代器(夹具的数据成员)。问题是一旦我们退出这个函数, const std::string& str 参数就会从堆栈中弹出并且不再存在,即使它们是夹具的数据成员,也会使这些迭代器无效。

故事的寓意:只要您希望读取令牌,迭代器传递给 lexer::begin() 所引用的对象就应该存在。

我宁愿删除这个问题也不愿在互联网上记录我的愚蠢错误,但为了帮助社区,我想我应该离开它。

0 投票
1 回答
525 浏览

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

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

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

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

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

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

最后,是否有任何替代或更好的方法来实现这一点?

0 投票
2 回答
443 浏览

c++ - Boost Spirit lex 将令牌值写回输入流

我想知道 boost::spirit::lex 中是否有办法将令牌值写回输入流(可能在编辑后)并再次重新扫描。我基本上在寻找的是 Flex 中 unput() 提供的功能。

谢谢!

0 投票
1 回答
825 浏览

c++ - Spirit Lex:哪个令牌定义生成了这个令牌?

抱歉,如果这是一个新手问题,但我需要知道哪个令牌定义产生了某个令牌。当我打印令牌 ID 时,我只得到一个整数。我需要知道哪个正则表达式生成了这个令牌。

编辑:

这是我定义我的令牌的方式:

谢谢, 海瑟姆

0 投票
0 回答
426 浏览

boost - 使用 Spirit.Lex 解析一个特殊的一元减号

我正在尝试解析一种语言,其中通过符号周围存在的空格将一元减号与二进制减号区分开来。下面是一些伪规则,定义了减号在这种语言中的解释方式:

注意:最后一条规则中的 open paren 可以替换为语言中的任何标记,除了 'identifier'、'number' 和 'close_paren'。

注意:在第 4 种情况下,x 是标识符。标识符可以构成它自己的语句。而 -y 是一个单独的语句。

由于减号类型取决于空格,我想我会从词法分析器返回两个不同的标记,一个用于一元减号,一个用于二进制减号。有什么想法我该怎么做?

代码:这里有一些对我有用的代码,但我不太确定它是否足够健壮。我试图通过删除所有不相关的词法分析器规则来简化它:

基本上,我将二进制减号(difference在代码中称为)定义为两边都有空格的减号,并使用unput来确保这条规则。我还将一元减号定义为直接位于符号或开放括号之前的减号,并再次使用 unput 来确保维护此规则(对于数字,减号是令牌的一部分)。