1

Boost 的 Spirit Lex 能否为一个标记定义提供多个语义动作?

考虑这个 Lexer 结构:

namespace bp = boost::phoenix;
this->self = lex::token_def<>("[ \v\f\t\r]+")
    | lex::token_def<>("\n")[++bp::ref(line_no)]
    | lex::token_def<>("\\/\\/")[set_lexer_state("single_line_comment")]
    | lex::token_def<>(".")
    ;

this->self("single_line_comment")
    = lex::token_def<>("\n")
    [++bp::ref(line_no), set_lexer_state("INITIAL")]
    | lex::token_def<>(".")
    ;

然而,只有状态切换通过,但以状态 single_line_comment 结尾的行不被计算在内。

如果我切换订单,例如:

[set_lexer_state("INITIAL"), ++bp::ref(line_no)]

行尾被计算在内,状态切换不通过。是否可以有多个用逗号分隔的语义动作,还是我必须编写一个函子来进行状态切换和我想要的任何其他动作?

4

0 回答 0