C++ 提升::精神词法器正则表达式
C++ boost::spirit lexer regex
我正在使用boost::spirit做一个简单的词法分析器/解析器。
这是词法分析器:
template <typename Lexer>
struct word_count_tokens : lex::lexer<Lexer>
{
word_count_tokens()
{
this->self.add_pattern
("WORD", "[a-z]+")
("NAME_CONTENT", "[a-z]+")
;
word = "{WORD}";
name = ".name";
name_content = "{NAME_CONTENT}";
this->self.add
(word)
(name)
(name_content)
('n')
(' ')
('"')
(".", IDANY)
;
}
lex::token_def<std::string> word;
lex::token_def<std::string> name;
lex::token_def<std::string> name_content;
};
我定义了两个相同的模式:WORD和NAME_CONTENT。
这是语法:
template <typename Iterator>
struct word_count_grammar : qi::grammar<Iterator>
{
template <typename TokenDef>
word_count_grammar(TokenDef const& tok)
: word_count_grammar::base_type(start)
{
using boost::phoenix::ref;
using boost::phoenix::size;
start = tok.name >> lit(' ') >> lit('"') >> tok.word >> lit('"');
}
qi::rule<Iterator> start;
};
这段代码在语法中与 tok.word 一起使用,但是如果我用 tok.name_content 替换 tok.word,它不起作用。但是 tok.word == tok.name_content。
这段代码有什么问题?
PS :我要解析的是这样的:.name "this is my name"
更新哦,顺便说一下,问题是你只能有一个令牌匹配 - 它们按顺序匹配。您/可以/通过使用词法分析器状态来解决此问题。但我不建议这样做,而不是首先在这里使用词法分析器
我的建议是直接使用 Qi:
qi::lexeme[".name"] >> qi::lexeme['"' >> *~qi::char_('"') >> '"']
我对 Lexer 代币模式的回忆是极其混乱的转义要求之一。
我可能会稍后尝试弄清楚 - 只是出于好奇
住在科里鲁
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
int main() {
std::string const input(".name "this is my name"");
auto f(input.begin()), l(input.end());
std::string parsed_name;
if (qi::phrase_parse(f,l,
qi::lexeme[".name"] >> qi::lexeme['"' >> *~qi::char_('"') >> '"'],
qi::space,
parsed_name))
{
std::cout << "Parsed: '" << parsed_name << "'n";
}
else
{
std::cout << "Parsed failedn";
}
if (f!=l)
std::cout << "Remaining unparsed input: '" << std::string(f,l) << "'n";
}
指纹
Parsed: 'this is my name'
相关文章:
- 使用正则表达式regex_search在字符串中查找字符串
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- C++正则表达式无限循环
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- 定义有趣的宏和正则表达式在Z3 C++绑定
- 带有多个字符分隔符的正则表达式
- C++ 使用增强正则表达式库时断言崩溃
- 有人可以帮助我处理正则表达式吗?
- 使用正则表达式获取大括号块的列表
- 正则表达式以匹配数字的重复模式,后跟任何类型的分隔符?
- 组合正则表达式部分使用 | 不起作用的 C++
- 为什么C++正则表达式这么慢?
- 如何使HTML5电子邮件验证正则表达式在C++中工作?
- 在C++中实现正则表达式
- C++正则表达式替换整个单词
- 用C++编写正则表达式的正确方法是什么?
- 如何从Stroustrup的C++书中解释这个正则表达式?
- 为什么这个正则表达式C++在括号表达式中抛出无效范围异常?
- C++:匹配正则表达式,什么是匹配?
- C++:正则表达式匹配代码,打印多个匹配项?