使用 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 以返回 boost::iterator_range<const char*>