Monday, 5 September 2016

code generation using LEX and YACC

-----------------------------------LEX FILE--------------------------------------
%{
#include<stdio.h>
#include<string.h>
#include "y.tab.h"
%}

%%
[a-z][a-z0-9]* {strcpy(yylval.var,yytext);return NAME;}
[+]  {strcpy(yylval.var,yytext);return PLUS;}
[=]  {strcpy(yylval.var,yytext);return EQUAL;}
[-] {strcpy(yylval.var,yytext);return SUBT;}
[*] {strcpy(yylval.var,yytext);return MULT;}
[/]    {strcpy(yylval.var,yytext);return DIVI;}
[\n\t] {return yytext[0];}
%%

------------------------------YACC FILE----------------------------------------
%{
#include<stdio.h>
#include<ctype.h>
#include<string.h>
FILE *fout;
%}

%token<var> NAME PLUS EQUAL MULT DIVI SUBT
%type<var> exp
%union
{
char var[10];
}
%right EQUAL
%left PLUS SUNT
%left MULT DIVI


%%    
      
input:line'\n'input
     |'\n'input
     |/*empty*/
     ;
line:NAME EQUAL exp {fprintf(fout,"MOV %s,AX\n",$1);}
    ;
exp:NAME PLUS NAME {fprintf(fout,"MOV AX,%s \n ADD AX,%s\n",$1,$3);}
    |NAME SUBT NAME {fprintf(fout,"MOV AX,%s \n SUB AX,%s\n",$1,$3);}
    |NAME MULT NAME {fprintf(fout,"MOV AX,%s \n MUL AX,%s\n",$1,$3);}
    |NAME DIVI NAME {fprintf(fout,"MOV AX,%s \n DIV AX,%s\n",$1,$3);}
    |NAME      {strcpy($$,$1);}
    ;
%%

extern yylineno;

yyerror()
{
       printf("\neroor %d",yylineno);   
}
yywrap()
{
return 1;
}
extern FILE *yyin;
main()

{

FILE *fin;
fin=fopen("input.txt","r");
fout=fopen("out.txt","w");

yyin=fin;

yyparse();
fcloseall(); 
return 0;
}
------------------------------------INPUT FILE-----------------------
t1=a+b
t2=b+t1
c=t2

--------------------------------OUTPUT FILE---------------------------
MOV AX,a
ADD AX,b
MOV t1,AX
MOV AX,b
ADD AX,t1
MOV t2,AX

MOV c,AX

No comments:

Post a Comment