Как различить новую строку, вызванную 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 */ }