Related articles |
---|
Re: warning: assignment makes pointer from integer without a cast[enab dannyjpereira@gmail.com (Danny Pereira) (2016-02-22) |
Re: warning: assignment makes pointer from integer without a cast[enab 330-706-9395@kylheku.com (Kaz Kylheku) (2016-02-24) |
Re: warning: assignment makes pointer from integer without a cast[enab gneuner2@comcast.net (George Neuner) (2016-02-24) |
From: | Danny Pereira <dannyjpereira@gmail.com> |
Newsgroups: | comp.compilers |
Date: | Mon, 22 Feb 2016 09:28:49 +0530 |
Organization: | Compilers Central |
Injection-Info: | miucha.iecc.com; posting-host="news.iecc.com:2001:470:1f07:1126:0:676f:7373:6970"; logging-data="15928"; mail-complaints-to="abuse@iecc.com" |
Keywords: | yacc, question, comment |
Posted-Date: | 24 Feb 2016 08:23:20 EST |
Hello all,
I am trying to write a simple calculator application using re-entrant lex
and yacc. Here I wish to create two threads (parsers) which should parse
input provided in input file. Lines to be parsed in input file are divided
among two threads..
My lex code for simple calculator is
%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*/
. ;
%%
*My yacc file for simple calculator(reentrant) is*
%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>
FILE * 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]=fopen(argv[1],O_RDONLY);
fseek(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);
}
*and my input file is*
12+12
14-12
23-11
12-12
23-45
67+45
11+23
45-12
67-12
90-34
56-56
90-45
*I am compiling above programs as *
*$lex purelex.l followed with *
*$ yacc pureyacc.y and*
* $gcc -o purecalc lex.yy.c y.tab.c -lpthread*
*I am getting all zero values as output. I am expecting results of
arithmetic expressions provided in input file as output . When I compile
using gcc I am getting following warning *
*purelex.l:12:8: warning: assignment makes pointer from integer without a
cast [enabled by default] yylval=atoi(yytext); *
*Also I would like to restrict first thread to process fist 6 line and
second thread to process next six lines which is not happening right now..*
*Help to resolve this issue is appreciated..*
*Thank you..*
>> I have posted my question on stack-overflow. Link of question is
>> http://stackoverflow.com/questions/35459610/segmentation-fault-in-re-entrant-yacc-parser-code
--
Regards
Pereira Danny Jeron
I/c Head,Department Of Computer Engineering,
Govt. College of Engg and Research, Avasari(Kd),
Pune
[I suggested he debug it the usual way, by putting breakpoints in the
C code to narrow down the places where it was smashing stuff. -John]
Return to the
comp.compilers page.
Search the
comp.compilers archives again.