%x PRNT %x EVAL #include #include #include #include void apnd(); void eval(); void text(); void prnt(); char *buf; int len; int sz; %% (.|\n) apnd(); \<%= text(); BEGIN(PRNT); \<%[^=] text(); BEGIN(EVAL); . apnd(); %\> prnt(); BEGIN(0); (.|\n) apnd(); %\> eval(); BEGIN(0); <> prnt(); yyterminate(); <> eval(); yyterminate(); <> text(); yyterminate(); %% int main(int argc, char *argv[]) { len = 0; sz = 512; if(!(buf = malloc(sz))) err(1, "malloc"); yylex(); } void apnd() { if(len+1 > sz){ sz += 512; if(!(buf = realloc(buf, sz))) err(1, "realloc"); } buf[len++] = *yytext; buf[len+1] = 0; } void eval() { printf("%s\n", buf); len = 0; } void text() { char *t; printf("printf(\""); for(t = buf; *t; t++){ if(*t == '\\') printf("\\\\"); else if(*t == '"') printf("\\\""); else if(*t == '\n') printf("\\n"); else printf("%c", *t); } printf("\");\n"); len = 0; } void prnt() { printf("printf(\"%%s\", %s);\n", buf); len = 0; }