Почему yyparse () вызывает сбой моей программы? - PullRequest
0 голосов
/ 05 мая 2019

я делаю ассемблер. Я использую зубров и гибких, чтобы сделать это. У меня также есть файл C, в котором у меня есть моя основная функция. Но по какой-то причине после вызова функции yyparse () происходит сбой программы.

Это пример моего кода. Но это имеет тот же результат.

Мой файл lexer.l (lex)

%{
#include <stdio.h>
#include "y.tab.h"
%}
%option nounput yylineno
%%
"sub"               return SUB;
";"                 return SEMICOLON;
.                   ;
[ \t]+              ;
%%
int yywrap()
{
    return 0;
}

Мой файл grammar.y (yacc).

%{
#include <stdio.h>
#include <string.h>
void yyerror(const char *str)
{
        fprintf(stderr,"error: %s\n",str);
}

%}
%token SUB SEMICOLON
%%
commands: /* empty */
    | commands command
    ;

command:
    sub
    ;
sub:
    SUB SEMICOLON
    {
        printf("\tSub Detected\n");
    }
    ;
%%

Мой файл main.c.

#include <stdio.h>

extern int yyparse();
extern yy_scan_bytes ( const char *, int);
//My input buffer
char * memblock = "sub;\n";

int main()
{
    yy_scan_bytes(memblock, strlen(memblock));
    yyparse();
    return 0;
}

Наконец, как я скомпилирую.

bison -y -d grammar.y
flex lexer.l
gcc y.tab.c lex.yy.c -c
gcc main.c y.tab.o lex.yy.o

Это результат.

    Sub Detected

Segmentation fault

Я хотел бы знать, как исправить ошибку Segmentation fault. Спасибо.

1 Ответ

2 голосов
/ 05 мая 2019

Проблема в том, что ваша функция yywrap возвращает 0 (false == еще не завершена, необходимо прочитать больше ввода), но не настраивает ввод, поэтому, когда сканер пытается прочитать больше данных, происходит сбой.

Пусть yywrap вернет 1 (true), и вы получите EOF, и yyparser вернется, и все будет хорошо.

В качестве альтернативы используйте %option noyywrap и избавьтесь от него.

...