Ошибка сегментации в .lex - PullRequest
       55

Ошибка сегментации в .lex

0 голосов
/ 26 сентября 2019

Я пытаюсь скомпилировать и запустить лексический анализатор, созданный с помощью 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 для выхода из консоли.

...