我正在用 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.word 替换为 tok.name_content 它不起作用。但是 tok.word == tok.name_content。
这段代码有什么问题?
PS:我想解析的是:.name "this is my name"