如何区分由ENTER引起的新行和使用lex在文件中写入的\ n?

时间:2016-01-25 05:23:54

标签: 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;
}

然后在输入文件的第2行显示错误为意外字符()。 如果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 个答案:

答案 0 :(得分:0)

你需要逃避反斜杠:

"\\n" { /* Will match \n */ }