问题标签 [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 回答
898 浏览

c++ - Boost.Spirit SQL 语法/词法分析器故障

我对以下 SQL 语法有两个问题:

问题1:从评论开始

当文件以注释开头时,解析立即失败:

有了这棵失败的树:

但是,如果我在之前添加一个 line return,它就可以工作。两种类型的注释(“--”和“/**/”)都失败了。

问题 2:关键字唯一性无法识别

在关键字独特的非常特定的条件下解析失败。当 unique 为大写并直接后跟逗号时,它不起作用。

以下所有情况均成功:

但是这个没有:

你有什么想法是错的吗?谢谢!

0 投票
1 回答
69 浏览

c++ - 升压::精神::莱克斯;如何指定标记“||”?

所以我的问题很简单,在我的词法分析器类(扩展lex::lexer<T>)中,我有以下内容;

在我的构造函数内部,它编译得很好,但在运行时触发了 SegFault。问题很明显|是正则表达式系统中的“或”运算符,我该如何解决这个问题?

0 投票
1 回答
384 浏览

c++ - Boost::spirit 从非终端获取价值

我有这个,在我的 boost::spirit 语法中;

这些被定义为;

该函数build_paren,具有以下原型(通过编译器转换错误找到);

这里的向量,分别包含两个字符串,"(\0"")\0"是我所期望的,但是我如何获得char匹配的字符?

真的,我想要的build_paran功能原型是;

或者,同样的,但是char参数是列表中的最后一个。

0 投票
1 回答
316 浏览

token - boost::spirit::lex,如何生成文件结束标记?

问题很简单,我编写了一个词法分析器,使用 boost::spirit,但是我似乎找不到生成EOF令牌的方法。- 那么如何去做呢?

0 投票
1 回答
284 浏览

boost - 在 boost::spirit 语法中翻转规则内子规则的顺序会导致段错误

警告; 虽然我试图将代码缩短到最低限度。我仍然必须包含很多内容,以确保提供所需的信息。

此代码编译文件并运行导致语法错误;

虽然这;

结果是SIGSEGV,分段错误;

在哪里;

和;

所有这些规则,返回一个Ast::name*()

辅助函数定义为;

和;

使用的词法分析器定义定义为:

和;

其中模式{JAVA_LETTER}{JAVA_LETTER_OR_DIGIT}定义为;

我的输入,是一个简单的字符串;

哪个词法适用于令牌;

其中第一个示例(首先使用 simple_name)引发语法错误;

最后一个示例只是抛出了一个段错误,之前发布了错误。

显然第二个例子是我想要的,因为它应该在简单的表达式之前尝试匹配复杂的表达式。

有谁知道为什么代码会崩溃,或者我将如何解决?- 这也应该在代码审查中吗?

0 投票
1 回答
147 浏览

c++ - Boost::spirit 非法回溯异常

我将 Boost.Spirit.Lex 和 .Qi 用于一个简单的计算器项目,并且(像往常一样)它给我调试和使用带来了一些痛苦。调试打印:

抛出此异常,我不明白为什么。我在我的代码中使用宏,给出一个最小的例子会很痛苦,所以我给出了整个项目。只需在根目录执行“make”,然后启动./sash,会出现提示,如果要测试只需执行“-echo $5-8”即可。

谷歌似乎没有发现任何关于这个异常的类似问题......

解析器在算术/中,解析器的调用在算术/求值器.cpp的末尾

任何帮助都非常感谢。

0 投票
0 回答
147 浏览

c++ - Boost Spirit Lex 中不同类型的语义动作

Boost 的 Spirit Lex 能否为一个标记定义提供多个语义动作?

考虑这个 Lexer 结构:

然而,只有状态切换通过,但以状态 single_line_comment 结尾的行不被计算在内。

如果我切换订单,例如:

行尾被计算在内,状态切换不通过。是否可以有多个用逗号分隔的语义动作,还是我必须编写一个函子来进行状态切换和我想要的任何其他动作?

0 投票
0 回答
178 浏览

c++ - 流上的增强精神词法分析器没有足够“早”地标记(太多前瞻?)

我正在使用 boost::spirit::lex 词法分析器来标记输入流,使用 spirit::istream_iterators 如使用 Boost.Spirit.Lex 和流迭代器中所述。

我的问题是 lex::tokenize 似乎没有像我认为的那样将令牌输出为“早期”(沿着输入流)。在我获得前一个令牌之前,它会等待一个额外的令牌(或两个?)全部可用。我想这是一个前瞻延迟,但我不确定为什么它是必要的,或者如何绕过它。

这是一个例子:

示例会话:(请注意,我的操作系统对 cin 进行了行缓冲,因此第一个“行”立即可供词法分析器使用)

我希望词法分析器接收第一行,并且一旦到达<NEWLINE>,它应该知道已经对完整的“再见”令牌进行了词法分析,并发出它。相反,它似乎要等待更多的输入才能让我再见。

0 投票
1 回答
949 浏览

c++ - C++ boost::spirit 词法分析器正则表达式

我正在用 boost::spirit 做一个简单的词法分析器/解析器。

这是词法分析器:

我定义了两个相同的模式:WORD 和 NAME_CONTENT。

这是语法:

此代码在语法中与 tok.word 一起使用,但如果我将 tok.word 替换为 tok.name_content 它不起作用。但是 tok.word == tok.name_content。

这段代码有什么问题?

PS:我想解析的是:.name "this is my name"

0 投票
1 回答
305 浏览

parsing - Boost::Spirit Token Text 在语义动作中的大小写不敏感字符串比较

我有一个标记器和一个解析器。解析器有一个特殊的标记类型,KEYWORD,用于关键字(大约有 50 个)。在我的解析器中,我想确保令牌是我所期望的,所以我对每个令牌都有规则。像这样:

这工作得很好,但它不区分大小写(我要处理的语法是!)。我想使用 boost::iequals,但尝试将 _1 转换为 std::string 会导致以下错误:

如何将这些关键字视为字符串并确保它们是预期的文本而不考虑大小写?