使用 BOOST Tokenizer 来显示分隔符并且不在引号中标记字符串

Posted

技术标签:

【中文标题】使用 BOOST Tokenizer 来显示分隔符并且不在引号中标记字符串【英文标题】:Using BOOST Tokenizer to display delimiter and to not tokenize a string in quotes 【发布时间】:2014-03-01 21:52:05 【问题描述】:

我正在使用 BOOST Tokenizer 将字符串分解为 toekn。基本上,这些令牌将用于为基于 c/c++ 的 VSL 创建编译器。我想问的是,定义的分隔符有可能是使用

创建的
char_separator<char> sep("; << "); 

同时显示 例如,如果我在字符串上使用 Boost 标记器

string s= "cout<<hello;"

它应该做以下标记

cout
<<
hello
;

另外,我如何确保它不会转换引号中的内容 喜欢

string s= "hello my \"name is\" Hassan"

应转换为以下标记

hello
my
name is
Hassan

【问题讨论】:

我怀疑 Boost 分词器真的能胜任这项任务(“怀疑”就像“如果它能够接近我会大吃一惊”)。标记 C++ 源代码是一项相当重要的任务。 Here 是一种可能让您入门的可能性。 哦等等。刚刚注意到您实际上想要解析一种编程语言。在我的答案中添加指向示例的链接 【参考方案1】:

我建议提振精神:Live On Coliru

编辑另见http://www.boost.org/doc/libs/1_55_0/libs/spirit/example/qi/compiler_tutorial

#include <boost/spirit/include/qi.hpp>

namespace qi = boost::spirit::qi;

int main(int argc, char** argv)

    typedef std::string::const_iterator It;
    std::string const input = "cout<<hello;my \"name is\" Hassan";

    qi::rule<It, std::string()> delimiter = qi::char_("; ") | qi::string("<<");
    qi::rule<It, std::string()> quoted    = '"' >> *~qi::char_('"') > '"';
    qi::rule<It, std::string()> word      = +((quoted | qi::char_) - delimiter);

    std::vector<std::string> tokens;
    if (qi::parse(input.begin(), input.end(), *(word >> delimiter), tokens))
    
        for(auto& token : tokens)
            std::cout << "'" << token <<  "'\n";
    

输出:

'cout'
'<<'
'hello'
';'
'my'
' '
'name is'
' '
'Hassan'

【讨论】:

我面临的问题是,当我向分隔符添加更多单词时,我最终无法完全解析代码。如果我尝试将 qi::string(" 行上,如果我改为使用 qi::string(" 创建令牌 恭喜。您已经发现标记化比简单的字符串比较更有趣。我建议您查看 Boost Spirit Lex。尤其是 Boost Wave(它实现了一个完整的 c++ 预处理器)

以上是关于使用 BOOST Tokenizer 来显示分隔符并且不在引号中标记字符串的主要内容,如果未能解决你的问题,请参考以下文章

Boost::tokenizer 逗号分隔 (c++)

从 Boost::Tokenizer 中删除重复项?

如何定义 boost tokenizer 以返回 boost::iterator_range<const char*>

如何使用 boost::tokenizer 作为 C++ 类成员?

Boost.Tokenizer 用于引号和括号

使用具有不同参数的 Boost Tokenizer escaped_list_separator