%option noyywrap %x NEW %x REQ %x RAW %x ESC %x RES %% \\ BEGIN(ESC); \n BEGIN(NEW); \ /* Ignore comment. */ ^< printf("."); BEGIN(REQ); /* Beginning of file. */ \< printf("\\c\n."); BEGIN(REQ); . ECHO; /* Handle text following newlines. */ \n /* Ignore consecutive newlines. */ \\ printf("\n"); BEGIN(ESC); /* Ignore comment. */ < printf("\n."); BEGIN(REQ); \. printf("\n\\&."); BEGIN(0); . printf("\n"); BEGIN(0); REJECT; /* Translate request. */ \\ BEGIN(RES); > BEGIN(NEW); /* Pass through raw troff code. */ \n\]> BEGIN(NEW); \]> BEGIN(0); . ECHO; /* Escape next character. */ \\ printf("\\\\"); BEGIN(0); < ECHO; BEGIN(0); . printf("\\"); ECHO; BEGIN(0); /* Escape next character within request. */ \\ printf("\\\\"); BEGIN(REQ); > ECHO; BEGIN(REQ); . printf("\\"); ECHO; BEGIN(REQ); %% int main() { char *st; yylex(); switch (YYSTATE) { case 0: return 0; case NEW: printf("\n"); return 0; case REQ: st = "request"; break; case RAW: st = "raw section"; break; case ESC: st = "escape"; break; case RES: st = "escape (within request)"; break; } fprintf(stderr, "%s unfinished\n", st); return 1; }