<int.l>
%{
#include"y.tab.h"
#include<stdio.h>
#include<string.h>
int LineNo=1;
%}
identifier [a-zA-Z][_a-zA-Z0-9]*
number [0-9]+|([0-9]*\
.[0-9]+) %%
main\(\) return MAIN;
if return IF;
else return ELSE;
while return WHILE;
int |
char |
{identifier
} {strcpy
(yylval
.var,yytext
); return NUM;}
< |> |>= |<= |== {strcpy
(yylval
.var,yytext
); return RELOP;}
[ \t] ;
\n LineNo++;
. return yytext[0];
%%
<int.y>
%{
#include<string.h>
#include<stdio.h>
struct quad{
char arg1[10];
char arg2[10];
charresult[10];
}QUAD[30];
struct stack{
int items[100];
int top;
}stk;
int Index=0,tIndex=0,StNo,Ind,tInd;
extern int LineNo;
%}
%union{
}
%token <var> NUM VAR RELOP
%token MAIN IF ELSE WHILE TYPE
%type <var> EXPR ASSIGNMENT CONDITION IFST ELSEST WHILELOOP
%left '-' '+'
%left '*' '/'
%%
PROGRAM : MAIN BLOCK
;
BLOCK: '{' CODE '}'
;
CODE: BLOCK
| STATEMENT CODE
| STATEMENT
;
STATEMENT: DESCT ';'
| ASSIGNMENT ';'
| CONDST
| WHILEST
;
DESCT: TYPE VARLIST
;
;
ASSIGNMENT
: VAR '=' EXPR
{strcpy
(QUAD
[Index
].op,"
="
);strcpy(QUAD[Index].arg1,$3);
strcpy(QUAD[Index].arg2,"");
strcpy(QUAD[Index].result,$1);
strcpy($$,QUAD[Index++].result);
}
;
EXPR: EXPR '+' EXPR {AddQuadruple("+",$1,$3,$$);}
| EXPR '-' EXPR {AddQuadruple("-",$1,$3,$$);}
| EXPR '*' EXPR {AddQuadruple("*",$1,$3,$$);}
| EXPR '/' EXPR {AddQuadruple("/",$1,$3,$$);}
| '-' EXPR {AddQuadruple("UMIN",$2,"",$$);}
| '(' EXPR ')' {strcpy($$,$2);}
| NUM
;
CONDST: IFST{
Ind=pop();
sprintf(QUAD[Ind].result,"%d",Index);
Ind=pop();
sprintf(QUAD[Ind].result,"%d",Index);
}
| IFST ELSEST
;
IFST: IF '(' CONDITION ')' {
strcpy
(QUAD
[Index
].op,"
=="
);strcpy(QUAD[Index].arg1,$3);
strcpy(QUAD[Index].arg2,"FALSE");
strcpy(QUAD[Index].result,"-1");
push(Index);
Index++;
}
BLOCK {
strcpy
(QUAD
[Index
].op,"GOTO"
);strcpy(QUAD[Index].arg1,"");
strcpy(QUAD[Index].arg2,"");
strcpy(QUAD[Index].result,"-1");
push(Index);
Index++;
};
ELSEST: ELSE{
tInd=pop();
Ind=pop();
push(tInd);
sprintf(QUAD[Ind].result,"%d",Index);
}
BLOCK{
Ind=pop();
sprintf(QUAD[Ind].result,"%d",Index);
};
CONDITION
: VAR RELOP
VAR {AddQuadruple
($
2,$
1,$
3,$$
);StNo=Index-1;
}
| NUM
;
WHILEST: WHILELOOP{
Ind=pop();
sprintf(QUAD[Ind].result,"%d",StNo);
Ind=pop();
sprintf(QUAD[Ind].result,"%d",Index);
}
;
WHILELOOP: WHILE '(' CONDITION ')' {
strcpy
(QUAD
[Index
].op,"
=="
);strcpy(QUAD[Index].arg1,$3);
strcpy(QUAD[Index].arg2,"FALSE");
strcpy(QUAD[Index].result,"-1");
push(Index);
Index++;
}
BLOCK {
strcpy
(QUAD
[Index
].op,"GOTO"
);strcpy(QUAD[Index].arg1,"");
strcpy(QUAD[Index].arg2,"");
strcpy(QUAD[Index].result,"-1");
push(Index);
Index++;
}
;
%%
extern FILE *yyin;
int main(int argc,char *argv[]) {
FILE *fp;
int i;
if(argc>1){
fp=fopen(argv[1],"r");
if(!fp) {
printf("\n File not found");
exit(0);
}
yyin=fp;
}
yyparse();
printf("\n\n\t\t---------------------------- ""\n\t\t Pos Operator Arg1 Arg2 Result" "\n\t\t
");
for(i=0;i<Index;i++)
{
printf("\n\t\t %d\t %s\t %s\t %s\t
%s",i,QUAD[i].op,QUAD[i].arg1,QUAD[i].arg2,QUAD[i].result);
}
printf("\n\t\t ");
printf("\n\n");
return 0;
}
void push(int data){
stk.top++;
if(stk.top==100)
{
printf("\n Stack overflow\n");
exit(0);
}
stk.items[stk.top]=data;
}
int pop()
{
int data;
if(stk.top==-1){
printf("\n Stack underflow\n");
exit(0);}
data=stk.items[stk.top--];
return data;
}
void AddQuadruple
(char
op[5],char arg1
[10],char arg2
[10],char result
[10]){
strcpy
(QUAD
[Index
].op,op);strcpy(QUAD[Index].arg1,arg1);
strcpy(QUAD[Index].arg2,arg2);
sprintf(QUAD[Index].result,"t%d",tIndex++);
strcpy(result,QUAD[Index++].result);
}
yyerror()
{
printf("\n Error on line no:%d",LineNo);
}
PGludC5sPgolewojaW5jbHVkZSJ5LnRhYi5oIgojaW5jbHVkZTxzdGRpby5oPgojaW5jbHVkZTxzdHJpbmcuaD4KaW50IExpbmVObz0xOwolfQppZGVudGlmaWVyIFthLXpBLVpdW19hLXpBLVowLTldKgpudW1iZXIgWzAtOV0rfChbMC05XSpcLlswLTldKykKJSUKbWFpblwoXCkgcmV0dXJuIE1BSU47CmlmIHJldHVybiBJRjsKZWxzZSByZXR1cm4gRUxTRTsKd2hpbGUgcmV0dXJuIFdISUxFOwppbnQgfApjaGFyIHwKZmxvYXQgcmV0dXJuIFRZUEU7CntpZGVudGlmaWVyfSB7c3RyY3B5KHl5bHZhbC52YXIseXl0ZXh0KTsKcmV0dXJuIFZBUjt9CntudW1iZXJ9IHtzdHJjcHkoeXlsdmFsLnZhcix5eXRleHQpOwpyZXR1cm4gTlVNO30KPCB8PiB8Pj0gfDw9IHw9PSB7c3RyY3B5KHl5bHZhbC52YXIseXl0ZXh0KTsKcmV0dXJuIFJFTE9QO30KWyBcdF0gOwpcbiBMaW5lTm8rKzsKLiByZXR1cm4geXl0ZXh0WzBdOwolJQo8aW50Lnk+CiV7CiNpbmNsdWRlPHN0cmluZy5oPgojaW5jbHVkZTxzdGRpby5oPgpzdHJ1Y3QgcXVhZHsKY2hhciBvcFs1XTsKY2hhciBhcmcxWzEwXTsKY2hhciBhcmcyWzEwXTsKY2hhcnJlc3VsdFsxMF07Cn1RVUFEWzMwXTsKc3RydWN0IHN0YWNrewppbnQgaXRlbXNbMTAwXTsKaW50IHRvcDsKfXN0azsKaW50IEluZGV4PTAsdEluZGV4PTAsU3RObyxJbmQsdEluZDsKCmV4dGVybiBpbnQgTGluZU5vOwolfQoldW5pb257CmNoYXIgdmFyWzEwXTsKfQoldG9rZW4gPHZhcj4gTlVNIFZBUiBSRUxPUAoldG9rZW4gTUFJTiBJRiBFTFNFIFdISUxFIFRZUEUKJXR5cGUgPHZhcj4gRVhQUiBBU1NJR05NRU5UIENPTkRJVElPTiBJRlNUIEVMU0VTVCBXSElMRUxPT1AKJWxlZnQgJy0nICcrJwolbGVmdCAnKicgJy8nCiUlClBST0dSQU0gOiBNQUlOIEJMT0NLCjsKQkxPQ0s6ICd7JyBDT0RFICd9Jwo7CkNPREU6IEJMT0NLCnwgU1RBVEVNRU5UIENPREUKfCBTVEFURU1FTlQKOwpTVEFURU1FTlQ6IERFU0NUICc7Jwp8IEFTU0lHTk1FTlQgJzsnCnwgQ09ORFNUCnwgV0hJTEVTVAo7CkRFU0NUOiBUWVBFIFZBUkxJU1QKOwpWQVJMSVNUOiBWQVIgJywnIFZBUkxJU1QKfCBWQVIKOwpBU1NJR05NRU5UOiBWQVIgJz0nIEVYUFJ7CnN0cmNweShRVUFEW0luZGV4XS5vcCwiPSIpOwpzdHJjcHkoUVVBRFtJbmRleF0uYXJnMSwkMyk7CnN0cmNweShRVUFEW0luZGV4XS5hcmcyLCIiKTsKc3RyY3B5KFFVQURbSW5kZXhdLnJlc3VsdCwkMSk7CnN0cmNweSgkJCxRVUFEW0luZGV4KytdLnJlc3VsdCk7Cn0KOwpFWFBSOiBFWFBSICcrJyBFWFBSIHtBZGRRdWFkcnVwbGUoIisiLCQxLCQzLCQkKTt9CnwgRVhQUiAnLScgRVhQUiB7QWRkUXVhZHJ1cGxlKCItIiwkMSwkMywkJCk7fQp8IEVYUFIgJyonIEVYUFIge0FkZFF1YWRydXBsZSgiKiIsJDEsJDMsJCQpO30KfCBFWFBSICcvJyBFWFBSIHtBZGRRdWFkcnVwbGUoIi8iLCQxLCQzLCQkKTt9CnwgJy0nIEVYUFIge0FkZFF1YWRydXBsZSgiVU1JTiIsJDIsIiIsJCQpO30KfCAnKCcgRVhQUiAnKScge3N0cmNweSgkJCwkMik7fQp8IFZBUgp8IE5VTQo7CkNPTkRTVDogSUZTVHsKSW5kPXBvcCgpOwpzcHJpbnRmKFFVQURbSW5kXS5yZXN1bHQsIiVkIixJbmRleCk7CkluZD1wb3AoKTsKc3ByaW50ZihRVUFEW0luZF0ucmVzdWx0LCIlZCIsSW5kZXgpOwp9CnwgSUZTVCBFTFNFU1QKOwpJRlNUOiBJRiAnKCcgQ09ORElUSU9OICcpJyB7CnN0cmNweShRVUFEW0luZGV4XS5vcCwiPT0iKTsKc3RyY3B5KFFVQURbSW5kZXhdLmFyZzEsJDMpOwpzdHJjcHkoUVVBRFtJbmRleF0uYXJnMiwiRkFMU0UiKTsKc3RyY3B5KFFVQURbSW5kZXhdLnJlc3VsdCwiLTEiKTsKcHVzaChJbmRleCk7CgpJbmRleCsrOwp9CkJMT0NLIHsKc3RyY3B5KFFVQURbSW5kZXhdLm9wLCJHT1RPIik7CnN0cmNweShRVUFEW0luZGV4XS5hcmcxLCIiKTsKc3RyY3B5KFFVQURbSW5kZXhdLmFyZzIsIiIpOwpzdHJjcHkoUVVBRFtJbmRleF0ucmVzdWx0LCItMSIpOwpwdXNoKEluZGV4KTsKSW5kZXgrKzsKfTsKRUxTRVNUOiBFTFNFewp0SW5kPXBvcCgpOwpJbmQ9cG9wKCk7CnB1c2godEluZCk7CnNwcmludGYoUVVBRFtJbmRdLnJlc3VsdCwiJWQiLEluZGV4KTsKfQpCTE9DS3sKSW5kPXBvcCgpOwpzcHJpbnRmKFFVQURbSW5kXS5yZXN1bHQsIiVkIixJbmRleCk7Cn07CkNPTkRJVElPTjogVkFSIFJFTE9QIFZBUiB7QWRkUXVhZHJ1cGxlKCQyLCQxLCQzLCQkKTsKU3RObz1JbmRleC0xOwp9CnwgVkFSCnwgTlVNCjsKV0hJTEVTVDogV0hJTEVMT09QewpJbmQ9cG9wKCk7CnNwcmludGYoUVVBRFtJbmRdLnJlc3VsdCwiJWQiLFN0Tm8pOwpJbmQ9cG9wKCk7CnNwcmludGYoUVVBRFtJbmRdLnJlc3VsdCwiJWQiLEluZGV4KTsKfQo7CldISUxFTE9PUDogV0hJTEUgJygnIENPTkRJVElPTiAnKScgewpzdHJjcHkoUVVBRFtJbmRleF0ub3AsIj09Iik7CnN0cmNweShRVUFEW0luZGV4XS5hcmcxLCQzKTsKc3RyY3B5KFFVQURbSW5kZXhdLmFyZzIsIkZBTFNFIik7CnN0cmNweShRVUFEW0luZGV4XS5yZXN1bHQsIi0xIik7CnB1c2goSW5kZXgpOwpJbmRleCsrOwp9CkJMT0NLIHsKc3RyY3B5KFFVQURbSW5kZXhdLm9wLCJHT1RPIik7CnN0cmNweShRVUFEW0luZGV4XS5hcmcxLCIiKTsKc3RyY3B5KFFVQURbSW5kZXhdLmFyZzIsIiIpOwpzdHJjcHkoUVVBRFtJbmRleF0ucmVzdWx0LCItMSIpOwpwdXNoKEluZGV4KTsKSW5kZXgrKzsKfQo7CiUlCmV4dGVybiBGSUxFICp5eWluOwppbnQgbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pIHsKRklMRSAqZnA7CmludCBpOwppZihhcmdjPjEpewpmcD1mb3Blbihhcmd2WzFdLCJyIik7CmlmKCFmcCkgewpwcmludGYoIlxuIEZpbGUgbm90IGZvdW5kIik7CmV4aXQoMCk7Cgp9Cnl5aW49ZnA7Cn0KeXlwYXJzZSgpOwpwcmludGYoIlxuXG5cdFx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAiIlxuXHRcdCBQb3MgT3BlcmF0b3IgQXJnMSBBcmcyIFJlc3VsdCIgIlxuXHRcdAoiKTsKZm9yKGk9MDtpPEluZGV4O2krKykKewpwcmludGYoIlxuXHRcdCAlZFx0ICVzXHQgJXNcdCAlc1x0CiVzIixpLFFVQURbaV0ub3AsUVVBRFtpXS5hcmcxLFFVQURbaV0uYXJnMixRVUFEW2ldLnJlc3VsdCk7Cn0KcHJpbnRmKCJcblx0XHQgIik7CnByaW50ZigiXG5cbiIpOwpyZXR1cm4gMDsKfQp2b2lkIHB1c2goaW50IGRhdGEpewpzdGsudG9wKys7CmlmKHN0ay50b3A9PTEwMCkKewpwcmludGYoIlxuIFN0YWNrIG92ZXJmbG93XG4iKTsKZXhpdCgwKTsKfQpzdGsuaXRlbXNbc3RrLnRvcF09ZGF0YTsKfQppbnQgcG9wKCkKewppbnQgZGF0YTsKaWYoc3RrLnRvcD09LTEpewpwcmludGYoIlxuIFN0YWNrIHVuZGVyZmxvd1xuIik7CmV4aXQoMCk7fQpkYXRhPXN0ay5pdGVtc1tzdGsudG9wLS1dOwpyZXR1cm4gZGF0YTsKfQp2b2lkIEFkZFF1YWRydXBsZShjaGFyIG9wWzVdLGNoYXIgYXJnMVsxMF0sY2hhciBhcmcyWzEwXSxjaGFyIHJlc3VsdFsxMF0pCnsKc3RyY3B5KFFVQURbSW5kZXhdLm9wLG9wKTsKc3RyY3B5KFFVQURbSW5kZXhdLmFyZzEsYXJnMSk7CnN0cmNweShRVUFEW0luZGV4XS5hcmcyLGFyZzIpOwpzcHJpbnRmKFFVQURbSW5kZXhdLnJlc3VsdCwidCVkIix0SW5kZXgrKyk7CnN0cmNweShyZXN1bHQsUVVBRFtJbmRleCsrXS5yZXN1bHQpOwp9Cnl5ZXJyb3IoKQp7CnByaW50ZigiXG4gRXJyb3Igb24gbGluZSBubzolZCIsTGluZU5vKTsKfQ==