Я пытаюсь скомпилировать и запустить лексический анализатор, созданный с помощью flex.Я пробовал ar Repl.it e https://www.onlinegdb.com/,, но во всех случаях файл C, созданный flex, выдает ошибку «ошибка сегментации (сбрасывается ядро)» каждый раз, когда я делаю ввод строкового литерала (STRING {}), например: "aaaaaa"
Посмотрите на шаблон {STRING} и соответствующие действия, пожалуйста.
Мой файл .lex:
%option noyywrap
%{
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdbool.h>
int idCont = 0;
char ides[100][50];
%}
DIGIT [0-9]
ID [a-z][a-z | A-Z | 0-9]*
STRING [\".+\"]
%%
{DIGIT}+ { printf("[num, %s] (%d)\n", yytext, atoi(yytext));}
{DIGIT}+"."{DIGIT}+ {printf("[numFloat,(%f)]\n", atof(yytext));}
if|else|return|for|while|do|switch|case|break|null|const|int|float|double|bool|char|long|short|byte|string|void|private|public|protected {printf("[reserved_word, %s]\n", yytext);}
{ID} {
int tamArray = 100;
bool tem = false;
int x=0;
if (yytext[0] == '\"'){
}
else{
for (x=0; x<tamArray; x++){
if(strcmp(ides[x], yytext) == 0){
printf("[id, %d]\n", x);
tem = true;
break;
}
}
if(!tem) {
idCont++;
strcpy(ides[idCont], yytext);
printf("[id, %d]\n", idCont);
}
}
}
"<" | ">" | "<=" | ">=" | "==" | "!=" {printf ("[Relational_Op, %s]\n", yytext);}
"+" | "-" | "*" | "\\" | "%" {printf ("[Arith_Op, %s]\n", yytext);}
" " | "//.*\n" | "/*.*/" { }
{STRING} {
//Elimina as aspas
char charArray[strlen(yytext)-1];
//printf("%s", yytext);
//stpcpy(charArray, yytext);z
printf("%s", charArray);
int x;
for (x=1; x< strlen(yytext)-1; x++){
charArray[x-1] = yytext[x];
}
charArray[x] = '\0';
printf('[String_literal, %s]', charArray);
}
%%
int main(int argc, char *argv[]){
yyin = fopen(argv[1], "r");
yylex();
fclose(yyin);
return 0;
}
Пример:
Мой ввод: "aaaaaaa"
Вывод onlineGBD:
Analisador.lex: 73: 9: предупреждение: символьная константа слишком длинная для ее типа
Analisador.lex: 73: 9: предупреждение: передача аргумента 1 для printf делает указатель целым числом без преобразования [-Wint-преобразование]
/usr/include/stdio.h:362:12: note: ожидается'const char * restrict', но аргумент имеет тип 'int'
"aaaaaa"
Ошибка сегментации (ядро сброшено)
... Программа завершена с кодом завершения 139
Нажмите ENTER для выхода из консоли.