LEX在文件末尾捕获一个额外的换行符

时间:2013-07-02 14:30:22

标签: newline lex eof

我的lex文件有问题。它会抓住一个额外的' \ n'在文件的末尾,即使它没有' \ n'。我有一个3行的例子,lex说有一个' \ n'在第3行结束时没有。有人能帮帮我吗?

谢谢

输入:

export integer entry (integer argc, integer *argv, integer *envp) = 0 {
  "olá pessoal!"!!
}

lex文件:

%{
#include <stdlib.h> 
#include <string.h> 
#include "y.tab.h" 
void yyerror(char *s);
char *dupstr(const char *s);
int ncom = 0;
int delimitador = 0;
char *cadeiaCaracteres;
%} 

%x COM
%x CC

%%

    /*Comentarios*/

    /*Linha*/

"<>".*                  delimitador = 1;

    /*Aninhados*/

"<<"                    delimitador = 1; ncom++; BEGIN COM;
<COM>">>"               delimitador = 1; if(--ncom == 0) BEGIN INITIAL;
<COM>"<<"               delimitador = 1; ncom++;
<COM>.|\n               delimitador = 1;

    /*Palavras Chave*/

"=="                    delimitador = 1; return EQ;
">="                    delimitador = 1; return GE;
"<="                    delimitador = 1; return LE;
"~="                    delimitador = 1; return NE;
"<-"                    delimitador = 1; return LM;
">-"                    delimitador = 1; return GM;
"++"                    delimitador = 1; return INC;
"--"                    delimitador = 1; return DEC;
"!!"                    delimitador = 1; return PE;
":="                    delimitador = 1; return DEF;
"real"                  delimitador = 1; return REAL;
"integer"               delimitador = 1; return INTEGER;
"export"                delimitador = 1; return EXPORT;
"import"                delimitador = 1; return IMPORT;
"if"                    delimitador = 1; return IF;
"for"                   delimitador = 1; return FOR;
"else"                  delimitador = 1; return ELSE;
"return"                delimitador = 1; return RETURN;
"break"                 delimitador = 1; return BREAK;
"continue"              delimitador = 1; return CONTINUE;


    /*Delimitadores e Separadores*/

[\?!#{}():,]                delimitador = 1; return *yytext;
";"                 delimitador = 0; return ';';
\\                  delimitador = 0;

    /*Identificadoes*/

[A-Za-z][A-Za-z0-9_]*           yylval.s = strdup(yytext); delimitador = 1; return ID;

    /*Literais*/

    /*Inteiros*/

[0-9]+                  {yylval.i = strtol(yytext, 0, 10); delimitador = 1; if(errno == ERANGE){yyerror("Erro overflow decimal"); errno = 0;} return INT;}

    /*Cadeia de Caracteres*/


\"                  {cadeiaCaracteres = (char*) malloc(sizeof(char)); BEGIN CC;}    
<CC>\"                  {delimitador = 1; strcat(cadeiaCaracteres, "\0"); yylval.s = dupstr(cadeiaCaracteres); BEGIN INITIAL; return STRING;}
<CC>\\\"                {cadeiaCaracteres = (char*) realloc(cadeiaCaracteres, (yyleng + strlen(cadeiaCaracteres)) * sizeof(char)); strcat(cadeiaCaracteres, yytext);}
<CC>[\n\r\t]                {cadeiaCaracteres = (char*) realloc(cadeiaCaracteres, (yyleng + strlen(cadeiaCaracteres)) * sizeof(char)); strcat(cadeiaCaracteres, yytext);} 
<CC>[^\"]               {cadeiaCaracteres = (char*) realloc(cadeiaCaracteres, (yyleng + strlen(cadeiaCaracteres)) * sizeof(char)); strcat(cadeiaCaracteres, yytext);} 
<CC>\\[0-7][0-7]?[0-7]?         {cadeiaCaracteres = (char*) realloc(cadeiaCaracteres, (yyleng + strlen(cadeiaCaracteres)) * sizeof(char)); strcat(cadeiaCaracteres, yytext);} 
<CC>\\"x"[a-fA-F0-9][a-fA-F0-9]?    {cadeiaCaracteres = (char*) realloc(cadeiaCaracteres, (yyleng + strlen(cadeiaCaracteres)) * sizeof(char)); strcat(cadeiaCaracteres, yytext);}

    /*Reais em Virgula Flutuante*/

[0-9]+[Ee][+-]?[0-9]+               {delimitador = 1; yylval.d = strtod(yytext, 0); if(errno == ERANGE){yyerror("Erro overflow real"); errno = 0;} return FLOAT;}
[0-9]*"."[0-9]+([Ee][+-]?[0-9]+)?       {delimitador = 1; yylval.d = strtod(yytext, 0); if(errno == ERANGE){yyerror("Erro overflow real"); errno = 0;} return FLOAT;}
[0-9]+"."[0-9]*([Ee][+-]?[0-9]+)?       {delimitador = 1; yylval.d = strtod(yytext, 0); if(errno == ERANGE){yyerror("Erro overflow real"); errno = 0;} return FLOAT;}

    /*Operadores de Expressoes*/

[-+*/%<>=!|&\^]             delimitador = 1; return *yytext;

    /*Caracteres Brancos*/

"\n"                    if(delimitador == 0); else {delimitador = 0; return ';';}       
[ \r\t]                 delimitador = 1;

.                   delimitador = 1; yyerror("Unknown character"); 
%% 
int yywrap(void) { return 1; } 
char *getyytext() { return yytext; }

0 个答案:

没有答案