Как правило, вы НИКОГДА не хотите вызывать 'input' прямо в вашем Flex-коде - это обычная процедура flex, используемая для получения большего ввода, поэтому если вы ее вызываете, вы вытягиваете случайные символы из середины ввода и сбивает с толку, думая, что они не существуют. Лучший способ сделать это - определить несколько правил и опираться на самое длинное совпадение, чтобы получить правильное.
"'"{letter}"'" { return(tChar); }
"'"{letter}"\n" { return(tCharunterm); }
"'"{letter} { yyerror("char overflow"); return(rCharunterm); }
вы также можете захотеть, чтобы yylval.ch = yytext[1];
в этих правилах возвращало фактическое значение символа, которое вы выбрали.