3

再入可能な lex と yacc を使用して単純な電卓アプリケーションを作成しようとしています。ここでは、入力ファイルで提供された入力を解析する必要がある 2 つのスレッド (パーサー) を作成します。入力ファイルで解析される行は、2 つのスレッドに分割されます。

簡単な電卓の私のlexコードは

%option reentrant bison-bridge
%option noyywrap
%{
#include<stdio.h>
void yyerror(char *);
#include "y.tab.h"
%}

%%

[0-9]+ {
        yylval=atoi(yytext);
        return INTEGER;
        }

[-+\n]  return *yytext;

[ \t]   ;/* Skip whitespaces*/

.       ;

%%

単純な計算機(再入可能)用の私のyaccファイルは

%pure-parser
%lex-param {void * scanner}
%parse-param {void * scanner}
%{
        #include <pthread.h>
        #include <sys/types.h>
        #include <sys/stat.h>
        #include <fcntl.h>
        #include<stdio.h>
        #include <stdlib.h>
        int f[2];
        pthread_mutex_t lock;
        int cnt=0;
        void* scanfunc(void * );
%}

%token INTEGER

%%

program: program expr '\n'      {printf("%d\n", $2);}
        |
        ;

expr:   INTEGER                 {$$=$1;}
        |expr '+' expr          {$$=$1+$3;}
        |expr '-' expr          {$$=$1-$3;}
        ;

%%

void yyerror(char *s){
        fprintf(stderr,"%s\n",s);
}
int main(int argc, char *argv[]){
        pthread_t threads[2];
        int n=2,i;//Number of threads to be created
        //set_file_ptr();

        if(argc!=2){
                printf("Insufficient nos. of arguments\n");
                exit(0);
        }
        for(i=0;i<n;i++){
                f[i]=open(argv[1],O_RDONLY);
                lseek(f[i],i*30,SEEK_SET);
        }
        printf("File pointer set\n");

        pthread_mutex_init(&lock,NULL);
        for(i=0;i<n;i++){
                pthread_create(&threads[i], NULL, (void *)scanfunc, (void *)&i);
        }

        //join all threads
        for(i=0;i<n;i++){
                pthread_join(threads[i],NULL);
        }

        pthread_mutex_destroy(&lock);
        //yyparse();
        return 0;
}
void* scanfunc(void * i)
{
    void * scanner;
   // printf("Value of i is %d\n",*(int *)i);
    printf("Starting thread %d...\n", *(int *)i);
    yylex_init(&scanner);
    printf("Done scanner init\n");
    pthread_mutex_lock(&lock);
    printf("Thread with id %d obtained lock\n",cnt);
    yyset_in(f[cnt],scanner);
    cnt++;
    pthread_mutex_unlock(&lock);
    yyparse(scanner);
    yylex_destroy(scanner);
}

私の入力ファイルは

12+12
14-12
23-11
12-12
23-45
67+45
11+23
45-12
67-12
90-34
56-56
90-45

このプログラムをコンパイルして実行すると、次の出力が得られます

File pointer set
Starting thread 0...
Starting thread 0...
Done scanner init
Thread with id 0 obtained lock
Done scanner init
Thread with id 1 obtained lock
Segmentation fault (core dumped)

gdb を使用してこのプログラムをデバッグすると、プログラムがシグナル SIGSEGV を受信したと表示されます。

yyparse(scanner);

このプログラムをデバッグする方法がわかりません。彼に関して助けていただければ幸いです。ありがとうございました

4

1 に答える 1

1

警告 : 割り当てにより、キャストなしで整数からポインターが作成される yylval=atoi(yytext);の問題を解決しました。

警告を取り除くためにコードに次の変更を加える必要があることを知るために、組み込みの YYSTYPE 投稿でbison/flex パーサーを再入可能にすることを参照しました。

*yylval=atoi(yytex)

ありがとうございました

于 2016-02-23T04:33:00.027 に答える