2016-02-17 122 views
2

我正在嘗試使用折返lex和yacc編寫一個簡單的計算器應用程序。在這裏我想創建兩個線程(解析器),它應該解析輸入文件中提供的輸入。線路輸入文件解析兩個線程之間劃分..警告:賦值使整數指針沒有投射yylval = atoi(yytext);

我的簡單的計算器代碼法是

%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 

當我編譯和當我調試用gdb它說,計劃接收信號SIGSEGV,分割過錯低於行這個程序運行這個程序,我得到followign輸出

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) 

yyparse(scanner); 

我無法找到如何調試此程序。 幫助他的方面表示讚賞。 謝謝

回答

0

yyin必須是FILE*而不是int。通過int預計FILE*不會有令人滿意的結果;段錯誤並非意外。

我很驚訝你沒有得到一堆警告,當你試圖編譯該代碼。

+0

我在文件作出必要的修改,按照你的建議。現在我得到所有的零值作爲輸出。我期待在輸入文件中提供的算術表達式的結果作爲輸出。當我編譯時,我得到以下警告'purelex.l:12:8:warning:賦值使得整型指針沒有轉換[缺省情況下啓用] yylval = atoi(yytext);'我也想限制第一個線程來證明第一行第六行和第二行,處理接下來的六行,目前沒有發生。 – user2201980

+0

我正在編譯以上程序** $ lex purelex.l **,後跟** $ yacc pureyacc.y **和** $ gcc -o purecalc lex.yy.c y.tab.c -lpthread ** – user2201980

相關問題