我的 lex 文件有问题。它会在文件末尾捕获一个额外的 '\n',即使它没有 '\n'。我有一个 3 行示例, lex 说第 3 行末尾有一个 '\n',而实际上没有。有人能帮助我吗?
谢谢
输入:
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; }