1 %{ 2 /* chef.x - convert English on stdin to Mock Swedish on stdout 3 * 4 * The WC definition matches any word character, and the NW definition matches 5 * any non-word character. Two start conditions are maintained: INW (in word) 6 * and NIW (not in word). The first rule passes TeX commands without change. 7 * 8 * HISTORY 9 * 10 * Apr 26, 1993; John Hagerman: Added ! and ? to the Bork Bork Bork rule. 11 * 12 * Apr 15, 1992; John Hagerman: Created. 13 */ 14 15 static int i_seen = 0; 16 %} 17 18 WC [A-Za-z'] 19 NW [^A-Za-z'] 20 21 %start INW NIW 22 23 %% 24 25 \\[^ \n]+ ECHO; 26 27 {NW} { BEGIN NIW; i_seen = 0; ECHO; } 28 [.!?]$ { BEGIN NIW; i_seen = 0; 29 printf("%c\nBork Bork Bork!",yytext[0]); } 30 31 <NIW>"bork"/{NW} ECHO; 32 <NIW>"Bork"/{NW} ECHO; 33 34 "an" { BEGIN INW; printf("un"); } 35 "An" { BEGIN INW; printf("Un"); } 36 "au" { BEGIN INW; printf("oo"); } 37 "Au" { BEGIN INW; printf("Oo"); } 38 "a"/{WC} { BEGIN INW; printf("e"); } 39 "A"/{WC} { BEGIN INW; printf("E"); } 40 "en"/{NW} { BEGIN INW; printf("ee"); } 41 <INW>"ew" { BEGIN INW; printf("oo"); } 42 <INW>"e"/{NW} { BEGIN INW; printf("e-a"); } 43 <NIW>"e" { BEGIN INW; printf("i"); } 44 <NIW>"E" { BEGIN INW; printf("I"); } 45 <INW>"f" { BEGIN INW; printf("ff"); } 46 <INW>"ir" { BEGIN INW; printf("ur"); } 47 <INW>"i" { BEGIN INW; printf(i_seen++ ? "i" : "ee"); } 48 <INW>"ow" { BEGIN INW; printf("oo"); } 49 <NIW>"o" { BEGIN INW; printf("oo"); } 50 <NIW>"O" { BEGIN INW; printf("Oo"); } 51 <INW>"o" { BEGIN INW; printf("u"); } 52 "the" { BEGIN INW; printf("zee"); } 53 "The" { BEGIN INW; printf("Zee"); } 54 "th"/{NW} { BEGIN INW; printf("t"); } 55 <INW>"tion" { BEGIN INW; printf("shun"); } 56 <INW>"u" { BEGIN INW; printf("oo"); } 57 <INW>"U" { BEGIN INW; printf("Oo"); } 58 "v" { BEGIN INW; printf("f"); } 59 "V" { BEGIN INW; printf("F"); } 60 "w" { BEGIN INW; printf("v"); } 61 "W" { BEGIN INW; printf("V"); } 62 63 . { BEGIN INW; ECHO; } 64