问题标签 [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.
boost-spirit - 使用 Spirit.Qi 消除语法糖
我正在尝试解析一种类似 lisp 的语言,该语言具有一些常用功能的语法糖。例如,加号函数可以写成 (+ 1 2) 或 1 + 2。我认为在尝试解释语言之前消除句法糖会显着促进解释过程,因为那样的话,唯一的评估规则需要实现的将是函数调用,并且所有中缀运算符都必须具有相应的内置函数。我在想我可以创建一个解析器,它将遍历从词法分析器接收到的标记,并对它们重新排序以将表达式放入前缀符号中。但这将要求解析器的输出也是令牌列表。在 Spirit.Q 中可能吗?据我了解,精灵。
boost-spirit - 检索 token_def<> 的 ID
是否可以像这样检索词法分析器中定义的标记的 ID:token_def<> tok;
从 Spirit 解析器的语义操作内部。
我正在尝试做的是使用每个运算符的令牌 ID(如 +、-、* 等)并从解析器语义操作中检索该运算符的相应名称(如加、减、次、 ETC。)
据我了解,在这样的制作中:
toks.symbol >> toks.plus >> toks.symbol;
如果toks.plus
是或类型token_def<> plus;
,_1 将引用第一个toks.symbol
,_2 将引用第二个toks.symbol
。真的吗?如果是这样,我如何访问中间令牌(只是为了检索 ID)?
谢谢!
boost-spirit - 语义操作未禁用属性兼容性
我有一个看起来像这样的语法规则:
据我了解:
在这种情况下应该禁用属性兼容性,因为存在语义操作。尽管如此,我在 ternary() 中看到了一个编译错误,这表明 _1 的类型不是我所期望的向量,而是:
这意味着由于某种原因,语义动作没有起作用!
任何提示为什么会发生这种情况?
注意:我在此处粘贴了一个显示问题的最小化示例:
谢谢!
c++ - 有没有办法将精神::lex 字符串标记的内容匹配为精神::qi 语法中的文字
我正在编写 DSL 并使用 Boost Spirit 词法分析器来标记我的输入。在我的语法中,我想要一个类似的规则(tok
词法分析器在哪里):
我不想为语言指定保留字(例如“名称”、“描述”)并处理在词法分析器和语法之间同步这些,我只想将匹配的所有内容标记[a-zA-Z_]\w*
为单个标记类型(例如tok.symbol
),并让语法梳理出来。如果我不使用词法分析器,我可能会这样做:
使用混合词法分析器,我可以编译以下规则,但当然它匹配的比我想要的要多——它不关心特定的符号值“名称”和“描述”:
我正在寻找的是这样的:
Qi 是否提供任何我可以使用的东西来代替我specific_symbol_matcher
的挥手,那里?如果我可以使用提供的东西接近,我宁愿不编写自己的匹配器。如果我必须编写自己的匹配器,任何人都可以建议如何做到这一点?
gcc - Boost.Spirit 的内部编译器错误
我正在尝试使用 GCC 3.4.6 和 Boost 1.43 编译以下看似简单的代码,它会产生内部编译器错误:
生成的错误:
最后一行main()
是产生这个错误。通过让expression
规则在 astd::string::iterator
而不是IteratorT
.
非常感谢在仍然使用词法分析器的同时修复错误的任何帮助。
谢谢!
boost-spirit - 如何使用 qi::symbols 解析器来匹配来自使用 no_case 的精神词法分析器的标记?
我有一个基于它的词法分析器,spirit::lexertl
它产生用lex::token_def<std::string>
. 我想使用一个qi::symbols<>
表来匹配该表中的标记,使用符号表中的关联数据作为规则中的属性。像这样的东西[从实际代码中浓缩]:
但是,当我编译它时,我收到以下错误:
/Users/tim/Documents/src/tr_libs/boost/boost_1_49_0/boost/spirit/home/qi/string/detail/tst.hpp:80:错误:从“char”转换为非标量类型'boost::spirit::lex::lexertl::token<boost::spirit::line_pos_iterator<boost::spirit::multi_pass<std::istreambuf_iterator<char, std::char_traits<char>>, boost:: Spirit::iterator_policies::default_policy<boost::spirit::iterator_policies::ref_counted, boost::spirit::iterator_policies::buf_id_check, boost::spirit::iterator_policies::buffering_input_iterator, boost::spirit::iterator_policies:: split_std_deque> > >, boost::mpl::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::spirit::basic_string<std::basic_string<字符、std::char_traits<char>、std::allocator<char> >、symbol_type>、double、mpl_::na、mpl_::na、mpl_::na、mpl_::na、mpl_::na、mpl_ ::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na, mpl_::na,mpl_::na, mpl_::na>, mpl_::bool_<true>, long unsigned int>'请求
tst.hpp 中的第 80 行是这样的:
在我看来,它确实正在尝试将我的词法分析器标记转换为 a char
,我理解它是symbols<char, int>
表中的字符类型。一时兴起,我确实尝试了symbols<ident, int>
——ident
我的令牌类型在哪里——但这显然不是记录在案的symbols<>
API,而且可以预见的是它不起作用。
(你可能会问为什么我不让词法分析器将这些标识符作为令牌 ID 发出,就像kMode
上面的示例一样。在这种特殊情况下我可能会这样做,但我真的很好奇集成符号的一般情况带有词法分析器的语法中的表。)
从根本上说,我认为我的问题是:是否可以以qi::symbols<>
这种方式使用来匹配来自 Spirit 词法分析器的标记?
c++ - 尽管令牌不完整,但 Boost Spirit 信号解析成功
我有一个非常简单的路径构造,我试图用 boost spirit.lex 解析它。
我们有以下语法:
所以我们在这里只讨论冒号分隔的小写 ASCII 字符串。
我有三个例子“xyz”、“abc:xyz”、“abc:xyz:”。
前两个应该被认为是有效的。第三个结尾有一个冒号,不应该被认为是有效的。不幸的是,我所拥有的解析器认为这三个都是有效的。语法不应允许空标记,但显然精神正在这样做。我错过了什么让第三个被拒绝?
此外,如果您阅读下面的代码,在注释中有另一个版本的解析器要求所有路径都以分号结尾。当我激活这些行时,我可以获得适当的行为(即拒绝“abc:xyz:;”),但这并不是我真正想要的。
有人有想法么?
谢谢。
c++ - boost::spirit::lex 和空格的问题
我尝试学习使用 boost::spirit。为此,我想创建一些简单的词法分析器,将它们组合起来,然后开始使用 Spirit 进行解析。我尝试修改示例,但它没有按预期运行(结果 r 不正确)。
这是词法分析器:
这是我正在尝试运行的示例:
只要字符串中只有一个标记,r 就为真。为什么会这样?
问候托拜厄斯
c++ - boost::spirit::lex 的问题 - 标点符号
我想创建一个 lex::token_def<> 包含像 '[' 或 ']' 或 '&>' 这样的字符序列
我尝试转义必要的字符:
但这给了我一些关于无法识别的转义字符和用它对字符串进行词法分析失败的警告。我怎样才能正确地做到这一点?
c++ - 如何结合 boost::spirit::lex 和 boost::spirit::qi?
我有一个词法分析器,基于该词法分析器,我现在想创建一个使用该词法分析器生成的标记的语法。我尝试调整我发现的一些示例,现在我有一些可以编译和工作的东西,但我的一个应该失败的测试没有。现在我想知道为什么,我也想知道我在那里实际做了什么(我想了解 - 我只是从一些示例中复制了一些代码,但这并没有真正提高理解)。
词法分析器:
语法:
和例子:
我的假设是这返回 true 因为空格被跳过了 - 因为 auf qi::in_state("WS"). 真的吗?此外,我知道如何为空格输出额外的标记 - 但是我不知道在 qi::in_stat 现在所在的位置放置什么 - 没有它它就不起作用。
关于结构我可以改进的任何想法?为什么调试输出如此有趣?
感谢您的帮助。
问候
托拜厄斯