Found due to %option nodefault. A match for } was actually missing
and # was not properly matched if it was part of an include statement
on the last line of a file that did not end with a newline.
<inc>{
/* we allow all characters except #, } and spaces, they can be escaped */
<<EOF>> |
- \n|#.*\n |
- [\t ] {
- if (*yytext && yytext[strlen(yytext) - 1] == '\n')
- { /* put the newline back to fix the line numbers */
- unput('\n');
- yy_set_bol(0);
+ [#}\n\t ] {
+ if (*yytext)
+ {
+ switch (yytext[0])
+ {
+ case '\n':
+ /* put the newline back to fix the line numbers */
+ unput('\n');
+ yy_set_bol(0);
+ break;
+ case '#':
+ case '}':
+ /* these are parsed outside of this start condition */
+ unput(yytext[0]);
+ break;
+ }
}
include_files(yyextra);
yy_pop_state(yyscanner);