Как различить новую строку, вызванную ENTER, и \n, записанные в файле с помощью lex?

Файл: myscanner.h

#define TYPE 1
#define NAME 2
#define TABLE_PREFIX 3 
#define PORT 4 
#define COLON 5
#define IDENTIFIER 6 
#define INTEGER 7

Входной файл в сканер:

db_type : mysql
\n
db_name : textdata
db_table_prefix : test_
db_port : a1099

Если myscanner.l это:

%{
#include "myscanner.h"
int nl=0;
%}

%%
:                       return COLON;
"db_type"               return TYPE;
"db_name"               return NAME;
"db_table_prefix"       return TABLE_PREFIX;
"db_port"               return PORT;
[a-zA-Z][_a-zA-Z0-9]*   {return IDENTIFIER;}
[1-9][0-9]*             return INTEGER;
[ \t]                   ;
\n                      yylineno++;
.                       printf("unexpected character\n");

%%

int yywrap(void)
{
        return 1;
}

Затем во второй строке входного файла отображается ошибка в виде неожиданного символа (). Если myscanner.l это:

%{
#include "myscanner.h"
int nl=0;
%}

%%
:                       return COLON;
"db_type"               return TYPE;
"db_name"               return NAME;
"db_table_prefix"       return TABLE_PREFIX;
"db_port"               return PORT;
"\n"                    nl++;
[a-zA-Z][_a-zA-Z0-9]*   {return IDENTIFIER;}
[1-9][0-9]*             return INTEGER;
[ \t]                   ;
\n                      yylineno++;
.                       printf("unexpected character\n");

%%

int yywrap(void)
{
        return 1;
}

Затем передача myscanner.l самому lex говорит об ошибке "правило не может быть найдено в

\n                      yylineno++;

Мой вопрос: что делать, если мне нужно написать \n в моем файле как комбинацию из двух символов '\', за которыми следует 'n'?

1 ответ

Вы должны избежать обратной косой черты:

"\\n" { /* Will match \n */ }
Другие вопросы по тегам