警告:赋值从整数生成指针而不进行强制转换 yylval=atoi(yytext);
Warning : assignment makes pointer from integer without a cast yylval=atoi(yytext);
我正在尝试使用可重入 lex 和 yacc 编写一个简单的计算器应用程序。在这里我希望创建两个线程(解析器)来解析输入文件中提供的输入。输入文件中要解析的行被分成两个线程..
我的简单计算器 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", );}
|
;
expr: INTEGER {$$=;}
|expr '+' expr {$$=+;}
|expr '-' expr {$$=-;}
;
%%
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);
我不知道如何调试这个程序。
在这方面的帮助表示赞赏。
谢谢
解决了警告问题:赋值从整数生成指针而不进行强制转换 yylval=atoi(yytext);
推荐 Making bison/flex parser reentrant with integral YYSTYPE post 以了解我必须对代码进行以下更改才能消除警告。
*yylval=atoi(yytex)
谢谢
我正在尝试使用可重入 lex 和 yacc 编写一个简单的计算器应用程序。在这里我希望创建两个线程(解析器)来解析输入文件中提供的输入。输入文件中要解析的行被分成两个线程..
我的简单计算器 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", );}
|
;
expr: INTEGER {$$=;}
|expr '+' expr {$$=+;}
|expr '-' expr {$$=-;}
;
%%
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);
我不知道如何调试这个程序。 在这方面的帮助表示赞赏。 谢谢
解决了警告问题:赋值从整数生成指针而不进行强制转换 yylval=atoi(yytext);
推荐 Making bison/flex parser reentrant with integral YYSTYPE post 以了解我必须对代码进行以下更改才能消除警告。
*yylval=atoi(yytex)
谢谢