Может ли Boost’s 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)]
Конец строки засчитывается, а переключатель состояния не проходит. Можно ли иметь несколько семантических действий, разделенных запятыми, или мне нужно написать один функтор для переключения состояний и любых других действий, которые я хочу?
Задача ещё не решена.
Других решений пока нет …