Re: warning: assignment makes pointer from integer without a cast[enabled by default] yylval=atoi(yytext);

Danny Pereira <dannyjpereira@gmail.com>
Mon, 22 Feb 2016 09:28:49 +0530

          From comp.compilers

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)
| List of all articles for this month |

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]


Post a followup to this message

Return to the comp.compilers page.
Search the comp.compilers archives again.