Skip to main content

YACC Program to check whether the arithmetic expression is valid or not

validexp.l

//LEX Program

/* declaration section in this sections we will declare the different value and include the header file which we are using in this program to run this program */

%{
#include"y.tab.h"
extern yylval;
%}

/* defined section */

%%
[0-9]+ {yylval=atoi(yytext); return NUMBER;}   //this is send to the yacc code as token INTEGER
[a-zA-Z]+ {return ID;}                                          //this is send to the yacc code as token  ID
[\t]+ ;
\n {return 0;}
. {return yytext[0];}
%%

  validexp.y 


//yacc program

//decelration section

%{
#include<stdio.h>
%}

//definition section


%token NUMBER ID                       // token from lex file
%left '+' '-'                                           // left associative 
%left '*' '/'
%%

expr: expr '+' expr                                        // grammer production rule 
     |expr '-' expr
     |expr '*' expr
     |expr '/' expr
     |'-'NUMBER
     |'-'ID
     |'('expr')'
     |NUMBER
     |ID
     ;
%%

//main function

main()
{
printf("Enter the expression\n");
yyparse();
printf("\nExpression is valid\n");
exit(0);
}

//if error occured 

int yyerror(char *s)
{
printf("\nExpression is invalid");
exit(0);
}

how to run 
    
     save the file  as given above 
     compile the yacc code "yacc -d validexp.y"
     compile the lex code  "flex  validexp.l" 
     now compile c file code  "cc lex.yy.c  y.tab.c  -o validexp  -ll"
     execute the file  "./validexp" 

   

     


Comments

Popular posts from this blog

LEX to count the no of "scanf" and "printf" statement in a c program. Replace them with "writf" and "readf" respectively.

/* declaration section in this sections we will declare the different value and include the header file which we are using in this program to run this program */ %{ #include<stdio.h> int sf=0,pf=0; %} /* defined section */ %% "scanf" { sf++; fprintf(yyout,"readf");}            // replace scanf  with readf "printf" { pf++; fprintf(yyout,"writef");}            // replace printf  with writef %% int main() { yyin=fopen("open.c","r");                            // input file open.c yyout=fopen("new.c","w");                            // output file new.c with replace  yylex();      //no of printf and scanf in the file printf("Number of scanfs=%d\nNumber of Printf's=%d\n",sf,pf); return 0; } download the file  ...

lex program to count the number of Positive and negative integer

/* decleration section in this sections we will decleared the different  value and include the header file which we are using in this program to run this program */ %{ #include<stdio.h> int p_count=0; int n_count=0; %} /* this sections is known as defined section in which we defined the rule and regulation of regular expression which will going to accept or not */ %% [+]?([0-9])+  { /* this is for increment and print the positive integer eg: 96, +36 */ p_count++; printf("Positive Integer:%s\n",yytext);} [-]([0-9])+   { /* this is for increment and print the negative integer eg: -96, -36 */ n_count++; printf("negative Integer:%s\n",yytext);} %% /* main function for calling the function */ void main(int argc[],char *argv[]) { yylex(); printf("the total number of Postive Integer are: %d\n" ,p_count); printf("the total number of Negative  Integer are:%d\n",n_count); }                ...