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