#include #include %%{ machine Parser; alphtype char; action token { tk = input.substr(start - begin, fpc - start); std::cout << "TOKEN: " << std::quoted(tk) << '\n'; } action mark { start = fpc; } action title { fmt::println("TITLE"); } action enum { fmt::println("ENUM"); } action content { tk = input.substr(start - begin, fpc - start); std::cout << "CONTENT:" << std::quoted(tk) << '\n'; } action meta { tk = input.substr(start - begin, fpc - start); std::cout << "META:" << std::quoted(tk) << '\n'; } action start { fmt::println("----- START"); } action plain { fmt::println("PLAIN"); } action start_slide { fmt::println(">> START SLIDE"); } action end_slide { fmt::println("<< END SLIDE"); } eol = '\n'; start = '===' %start; end = '---' %end_slide; pound = '#' %title; asterisk = '*' %enum; dash = '-' %enum; meta = ('{' ( any+) :>> '}') >mark %meta; content = (any+ -- (eol|end)) >mark %content; title = pound space+ content eol; enum = (asterisk | dash) space+ content eol; line = content :>> eol; blank = space* eol; slide = (title | enum | line | blank)+ >start_slide end eol; main := meta eol start eol (slide)+; }%% %% write data; bool Parser::parse(const std::string& input) { int cs = 0; const char *start = nullptr; const char *begin = input.data(); const char *p = input.data(); const char *pe = p + input.size(); const char *eof = p + input.size(); (void)eof; std::string tk; %% write init; %% write exec; bool good = pe - p == 0; if(good) { finalize(); } else { error = true; std::cout << "!!!!!!!!!!!!!!!!!!!!!! error at:"; std::cout << p; } return good; }