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

c++ - Boost Spirit 词法分析器状态交叉授粉

我正在尝试使用词法分析器状态来进行特定于上下文的解析,但似乎不同的词法分析器状态会交叉授粉。这是一个非常基本的例子

我希望输入

被标记为hello ccomment endcomment hello。但是发生的情况是输入被标记为hello ccomment hello,因此语法停止工作。如果您将输入更改为

一切都按预期工作。

有任何想法吗?

0 投票
1 回答
209 浏览

c++ - boost Spirit:如何匹配 qi 中的任何词法分析器标记?

我想将 C++ 函数声明与默认参数值匹配,但忽略这些值。例如:

这是词法分析器的(一部分):

我想写几个解析器规则,例如:

我在这里看到“解析器原语 qi::token 和 qi::tokenid 现在可以在没有任何参数的情况下使用。在这种情况下,它们将匹配任何令牌。”。这是我想要的(也是我写的),但不幸的是它没有编译。qi::token() 至少需要一个参数。我错过了什么?

0 投票
1 回答
395 浏览

c++ - 如何在 Spirit Lex 模式中使用斜线?

下面的代码编译得很好

clang++ -std=c++11 test.cpp -o test

但是运行时会抛出异常

在抛出 'boost::lexer::runtime_error' what() 的实例后调用终止:尚不支持 Lookahead ('/')。

问题是输入和/或正则表达式(第 12 和 39 行)中的斜杠(/),但我找不到如何正确转义它的解决方案。有什么提示吗?

0 投票
1 回答
368 浏览

c++ - How to use boost::spirit::qi with a std::vector instead of std::string

In an application, I basically want to have a "pre-parsing" phase where I adjust the token stream before a Qi parser can see it.

One way to do this would be to have some kind of "lexer adaptor" which is constructed from a lexer and is itself a lexer, which wraps and modifies the behavior of the inner lexer. However it would be simpler and easier to debug if instead I just lex the entire input stream with the inner lexer first and store the results in a std::vector<token_type>, then modify as desired, then pass the result to the parser. (In my application I don't think that there would even be any performance concern with this.)

In an email exchange from a few years back, someone described exactly this question and Hartmut said that it should be trivial. http://comments.gmane.org/gmane.comp.parsers.spirit.general/24899

However I didn't find any code examples or instructions how to do this beyond, look at the headers in spirit::lex and figure it out. That will likely occupy me for quite a while now unless you, dear reader, can assist.

The specific question is, how can I make a "shim" lexer which wraps over a pair of std::vector<token_type>::iterator's and looks to spirit::qi just like a standard spirit::lex lexer.

Edit: To be clear, this is not a duplicate of this question: Using Boost.Spirit.Qi with custom lexer My token_types are attributed, and the details of the extra things that Hartmut says I need to do are the substance of this question.


Edit: Okay, I made an SSCCE. This version does not have attributed lexer tokens, but even without that I still can't get it to work yet, and this seems like as good an SSCCE to get started anyways.

Highlights:

"Token buffer" type:

My first attempt at making a "buffer lexer" which looks like a lex::lexer to Qi, but in fact serves tokens from a buffer. This one derives from lex_basic above, I'm not sure if that's correct.

My second attempt at making a buffer lexer. This one does not derive from lex_basic and instead tries to follow these instructions found in the header boost/spirit/home/lex/lexer/lexertl/lexer.hpp:

Here's the "buffer_lexer_raw" that I came up with:

The test code responds to a macro defined at the top of the file.

The test code will:

  • Run the lexer on a simple test case and make a detailed dump of the lexed token sequence.
  • Run the lexer and grammar in tandem on a few simple test cases using lex::tokenize_and_parse, and dump the resulting AST.
  • Try lexing and parsing again, using the lexer selected by the macro to generate iterators for use with qi::parse. It will check that the resulting AST is the same as the AST generated the "easy" way.

Currently the #define WHICH_LEXER_TYPE 0 option compiles and works great for me with both gcc-4.8 and clang-3.6.

I can't actually get it to compile with the #define WHICH_LEXER_TYPE 1 or #define WHICH_LEXER_TYPE 2 options. With type 1, clang gives the following error message which I don't have the foggiest idea about:

The "2" option gives essentially the same error message. gcc doesn't seem to give a better error message.

Here's the complete source code:

0 投票
1 回答
153 浏览

c++ - 为什么 qi::skip 使用来自词法分析器的标记失败?

我正在使用 boost::spirit lex 和 qi 来解析一些源代码。

我已经使用词法分析器从输入字符串中跳过了空格。我想做的是根据解析器中的上下文切换跳过注释。

这是一个基本的演示。有关我的问题,请参阅 Grammar::Grammar() 中的评论:

输出是:

skipped_t 有什么问题吗?

0 投票
1 回答
53 浏览

c++ - 无法编译 boost 精神 word_count_lexer 示例

我正在继续学习 Boost Spirit 库,并遇到无法编译的示例问题。您可以在此处找到示例的来源:source place。您也可以查看此代码并在Coliru上编译结果

当我尝试编译它时,我收到很多错误,请参阅Coliru上的完整列表。

这个例子有什么问题?什么以及为什么需要更改来编译它?

0 投票
1 回答
992 浏览

c++ - 无法编译boost Spirit example4.cpp

我正在继续学习 Boost Spirit 库,但我遇到了一些无法编译的示例问题。您可以在此处找到示例的来源:source place。您也可以查看此代码并在Coliru上编译结果。

当我尝试编译它时,我收到很多错误,请参阅Coliru上的完整列表。

这个例子有什么问题?什么以及为什么需要更改来编译它?如何确定究竟是什么导致编译过程失败?

0 投票
1 回答
370 浏览

c++ - Spirit X3解析器启动状态?

我一直在浏览我能够找到的 Boost.Spirit X3 文档——这并不多——并认为我想将它用于我的下一个解析项目。值得注意的是,我从未使用过 Boost.Spirit Classic 或 V2,但使用过 flex/bison 和 ANTLR。

从最基本的意义上说,我要解析的格式如下所示:

仅解析“# BEGIN”和“# END”之间的文本,而其他所有内容都被完全忽略。我试图找出一种在 X3 解析器中完成此任务的有效方法。我的一些想法:

  1. 使用基本的字符串搜索函数来限制解析的范围。这似乎是最糟糕的选择,因为文本将被处理多次而不是一次处理。
  2. 查看 Spirit.Lex。同样,我发现在 Spirit.Lex 上找到任何体面的阅读材料有些困难,但似乎 Lex 提供了词法分析器启动状态,这将是处理这项工作的传统方式。顺便说一句,由于 X3 基于 C++14 并且 Spirit.Lex 构建在lexertl 之上,是否有配置选项或方法可以将 Spirit.Lex 与现代化的 lexertl14 一起使用?
  3. 也许在 X3 中有一些有意义的方法来处理这个问题?由于语法实际上非常简单,我认为拥有一个单独的词法分析器是矫枉过正的。
0 投票
1 回答
242 浏览

c++ - 如何使 Boost.Spirit.Lex 标记值成为匹配序列的子字符串(最好通过正则表达式匹配组)

我正在编写一个简单的表达式解析器。它建立在 Boost.Spirit.Qi 语法的基础上,该语法基于 Boost.Spirit.Lex 标记(Boost 版本 1.56)。

令牌定义如下:

现在我希望variable令牌值只是(\\w+)没有前缀%符号的名称(匹配组)。我怎么做?


单独使用匹配组无济于事。仍然值是完整的字符串,包括前缀%

有没有办法强制使用匹配组?

或者至少以某种方式在令牌的作用下引用它?


我也尝试过使用这样的操作:

但它无法编译。错误声称没有一个std::string构造函数重载可以匹配参数:


更简单

编译失败。出于类似的原因,现在只有第一个参数类型是boost::spirit::lex::_start_type.


最后我尝试了这个(即使它看起来像一个很大的浪费):

但这也无法编译。这次编译器无法从转换const boost::spirit::lex::_val_typestd::string.


有没有办法解决这个问题?

0 投票
1 回答
202 浏览

c++ - Boost Spirit如何检查代币的价值?

如何在下一个代码中检查 lasttok.identifier的值为'='-character?

编辑。我声明标识符lex::token_def<std::string> identifier;