%{ #include int akku = 0; %} %option main %% "I"{1,3} akku += yyleng; "IV" akku += 4; "V" akku += 5; "IX" akku += 9; "X"{1,3} akku += yyleng*10; "XL" akku += 40; "L" akku += 50; "XC" akku += 90; "C"{1,3} akku += yyleng*100; "CD" akku += 400; "D" akku += 500; "CM" akku += 900; "M"+ akku += yyleng*1000; /* Die Fehlerbehandlung muß *nach* den normalen Regeln stehen! */ /* Damit sind IV usw. erlaubt. */ ("I"{1,3}|"IV")[IVXLCDM] | "V"([VXLCDM]|"IV"|"IX") | ("X"{1,3}|"XL")[XLCDM] | "L"([LCDM]|"XL"|"XC") | ("C"{1,3}|"CD")[CDM] | "D"([DM]|"CD"|"CM") { fprintf(stderr, "Illegale Ziffernfolge '%s'\n", yytext); exit(1); } .|\n { if (akku) { printf("%d", akku); akku = 0; } ECHO; }