Вот сканер NCR, созданный с использованием Flex :
/** ncr2a.y: Replace all NCRs by corresponding printable ASCII characters. */
%%
&#(1([01][0-9]|2[0-6])|3[2-9]|[4-9][0-9]); { /* accept 32..126 */
/**recursive: unput(atoi(yytext + 2)); skip '&#'; `atoi()` ignores ';' */
fputc(atoi(yytext + 2), yyout); /* non-recursive version */
}
Чтобы сделать исполняемый файл:
$ flex ncr2a.y
$ gcc -o ncr2a lex.yy.c -lfl
Пример:
$ echo "Hello,  here's a test colon:.
> Here's a test semi-colon; 'ƒ'
> &#59; <-- may be recursive" \
> | ncr2a
Печатает для нерекурсивной версии:
Hello,  here's a test colon:.
Here's a test semi-colon; 'ƒ'
; <-- may be recursive
А рекурсивный производит:
Hello,  here's a test colon:.
Here's a test semi-colon; 'ƒ'
; <-- may be recursive