Compiler: Design Lab Manual
Compiler: Design Lab Manual
(PermanentlyAffiliatedtoJNTUH,ApprovedbyAICTEAccreditedbyNBA&NAACAGrade;ISO9001:2008Certified)
Maisammaguda,DhulapallyPost,ViaHakimpet,Secunderabad500100
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CompilerDesignLab(A50587)Manual
TABLE OF CONTENTS
Sl.
No
Descriptionoftheitem/title
PageNo.
Remarks
1.
Importance/RationalebehindtheCDLab
2.
GeneralLaboratoryInstructions
3.
Objectives&Outcomes
4.
Software/HardwareRequirements
5.
6.
7.
CaseStudy:DescriptionoftheSyntaxofthesource
Language(minilanguage)forwhichthecompiler
componentsaredesigned
Designalexicalanalyzerforthegivenlanguage.
Thelexicalanalyzershouldignoreredundant
spaces,tabsandnewlines,commentsetc.
ImplementthelexicalanalyzerusingJLex,flexor
otherlexicalanalyzergeneratingtools.
8
12
8.
DesignPredictiveParserforthegivenlanguage
14
9.
DesignaLALRbottomupparserforthegiven
language
19
10
11
ConverttheBNFrulesintoYaccformand
writecodetogenerateabstractsyntaxtree.
Aprogramtogeneratemachinecodefromthe
abstractsyntaxtreegeneratedbytheparser.
AdditionalTasks/Programs
12
13
21
28
ImplementationofFiniteStatemachinesDFA,
NFAsetc.
Writealexprogramtofindouttotalnumberof
vowels,andconsonantsfromthegiveninputsting.
14
ComputationofLeading&TrailingSets
15
RecursiveDescent,SLRParsers
16
IntermediateCodeGeneration
Every software has to be translated to its equivalent machine instruction form so that it will be
executed by the underlying machine. There are many different types of system softwares that help
during this translation process. Compiler is one such an important System Software that converts
High level language programs to its equivalent machine (low level) language. It is impossible to
learn and use machine language in software development for the users. Therefore we use high level
computer languages to write programs and then convert such programs into machine
understandable form with the help of mediator softwares such as compilers, interpreters,
assemblers etc.Thus compiler bridges the gap between the user and the machine, i.e., computer.
It's a very complicated piece of software which took 18 man years to build first compiler .To build
this software we must understand the principles, tools, and techniques used in its working. The
compiler goes through the following sequence of steps called phases of a compiler.
1) Lexical Analysis
2) Syntax Analysis
3) Semantic Analysis
4) Intermediate Code Generation
5) Code Optimization
6) Code Generation.
In performing its role, compiler also uses the services of two essential components namely, Symbol
Table and Error Handler
The objective of the Compiler Design Laboratory is to understand and implement the principles,
techniques, and also available tools used in compiler construction process. Thiswillenablethe
studentstoworkinthedevelopmentphaseofnewcomputerlanguagesinindustry.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1. Students are advised to come to the laboratory at least 5 minutes before (to the starting time),
those who come after 5 minutes will not be allowed into the lab.
2. Plan your task properly much before to the commencement, come prepared to the lab with the
synopsis / program / experiment details.
3. Student should enter into the laboratory with:
a. Laboratory observation notes with all the details (Problem statement, Aim, Algorithm,
Procedure, Program, Expected Output, etc.,) filled in for the lab session.
b. Laboratory Record updated up to the last session experiments and other utensils (if any) needed
in the lab.
c. Proper Dress code and Identity card.
4. Sign in the laboratory login register, write the TIME-IN, and occupy the computer system
allotted to you by the faculty.
5. Execute your task in the laboratory, and record the results / output in the lab observation note
book, and get certified by the concerned faculty.
6. All the students should be polite and cooperative with the laboratory staff, must maintain the
discipline and decency in the laboratory.
7. Computer labs are established with sophisticated and high end branded systems, which should be
utilized properly.
8. Students / Faculty must keep their mobile phones in SWITCHED OFF mode during the lab
sessions.Misuse of the equipment, misbehaviors with the staff and systems etc., will attract
severe punishment.
9. Students must take the permission of the faculty in case of any urgency to go out ; if anybody
found loitering outside the lab / class without permission during working hours will be treated
seriously and punished appropriately.
10. Students should LOG OFF/ SHUT DOWN the computer system before he/she leaves the lab
after completing the task (experiment) in all aspects. He/she must ensure the system / seat is kept
properly.
Principal
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
OBJECTIVESANDOUTCOMES
OBJECTIVES:
ToprovideanUnderstandingofthelanguagetranslationpeculiaritiesby
designingcompletetranslatorforminilanguage.
OUTCOMES:
Bythislaboratory,studentswillunderstandthepracticalapproachofhowa
compilerworks.
Thiswillenablehimtoworkinthedevelopmentphaseofnewcomputerlanguages
inindustry
RECOMMENDEDSYSTEM/SOFTWAREREQUIREMENTS:
1.
IntelbaseddesktopPCwithminimumof166MHzorfasterprocessorwithatleast
64MBRAMand100MBfreediskspace.
2.
C++CompilerandJDKkit,LexorFlexandYACCtools(Unix/Linuxutilities)
USEFULTEXTBOOKS/REFERECES/WEBSITES:
1. ModerncompilerimplementationinC,Andreww.Appel,RevisedEdn,Cambridge
UniversityPress
2. Principles of Compiler Design. A.V Aho, J.D Ullman ; Pearson Education.
3. lex&yacc , -John R Levine, Tony Mason, Doug Brown; Oreilly.
4. Compiler Construction,- LOUDEN, Thomson.
5. Engineering a compiler Cooper& Linda, Elsevier
6. Modern Compiler Design Dick Grune,Henry E.Bal, Cariel TH Jacobs, Wiley Dreatech
SOURCELANGUAGE(ACaseStdudy)
Considerthefollowingminilanguage,asimpleproceduralHighLevelLanguage,
operatingonintegerdatawithasyntaxlookingvaguelylikeasimpleCcrossedwith
Pascal.ThesyntaxofthelanguageisdefinedbythefollowingBNFgrammar:
<program>::=<block>
<block>::={<variabledefinition><slist>}
|{<slist>}
<variabledefinition>::=int<vardeflist>;
<vardeflist>::=<vardec>|<vardec>,<vardeflist>
<vardec>::=<identifier>|<identifier>[<constant>]
<slist>::=<statement>|<statement>;<slist>
<statement>::=<assignment>|<ifstatement>|<whilestatement>|<block>
|<printstatement>|<empty>
<assignment>::=<identifier>=<expression>
|<identifier>[<expression>]=[<expression>
<ifstatement>::=if<bexpression>then<slist>else<slist>endif
|if<bexpression>then<slist>endif
<whilestatement>::=while<bexpression>do<slist>enddo
<printstatement>::=print{<expression>}
<expression>::=<expression><addingop><term>|<term>|<addingop><term>
<bexpression>::=<expression><relop><expression>
<relop>::=<|<=|==|>=|>|!=
<addingop>::=+|
<term>::=<term><multop><factor>|<factor>
<multop>::=*|/
<factor>::=<constant>|<identifier>|<identifier>[<expression>
|(<expression>)
<constant>::=<digit>|<digit><constant>
<identifier>::=<identifier><letterordigit>|<letter>
<letterordigit>::=a|b|c|.|y|z
<digit>::=0|1|2|3||8|9
<empty>::=hastheobviousmeaning
Comments:zeroormorecharactersenclosedbetweenthestandardC/Javastylecomment
brockets/**/.Thelanguagehastherudimentarysupportfor1Dimensionalarrays.Ex:int
a[3]declaresaasanarrayof3elements,referencedasa[0],a[1],a[2].
SampleProgramwritteninthislanguageis:
{
inta[3],t1,t2;
t1=2;
a[0]=1;a[1]=2;a[t1]=3;
t2=(a[2]+t1*6)/a[2]t1);
ift2>5then
print(t2);
else
5
{
intt3;
t3=99;
t2=25;
print(11+t2*t3);/*thisisnotacommentontwolines*/
}
endif
}
1.
2.
3.
4.
5.
6.
DesignaLexicalanalyzerfortheabovelanguage.Thelexicalanalyzershouldignore
redundantspaces,tabsandnewlines.Itshouldalsoignorecomments.Althoughthe
syntaxspecificationstatesthatidentifierscanbearbitrarilylong,youmayrestrictthe
lengthtosomereasonablevalue.
ImplementthelexicalanalyzerusingJLex,flex,flexorlexorotherlexicalanalyzer
generatingtools.
DesignPredictiveparserforthegivenlanguage
DesignLALRbottomupparserfortheabovelanguage.
ConverttheBNFrulesintoYaccformandwritecodetogenerateabstractsyntax
tree.
Writeprogramtogeneratemachinecodefromtheabstractsyntaxtreegeneratedby
theparser.Thefollowinginstructionsetmaybeconsideredastargetcode.
Thefollowingisasimpleregisterbasedmachine,supportingatotalof17instructions.It
hasthreedistinctinternalstorageareas.Thefirstisthesetof8registers,usedbythe
individualinstructionsasdetailedbelow,thesecondisanareausedforthestorageof
variablesandthethirdisanareausedforthestorageofprogram.Theinstructionscanbe
precededbyalabel.Thisconsistsofanintegerintherange1to9999andthelabelis
followedbyacolontoseparateitfromtherestoftheinstruction.Thenumericallabelcan
beusedastheargumenttoajumpinstruction,asdetailedbelow.
Inthedescriptionoftheindividualinstructionsbelow,instructionargumenttypesare
specifiedasfollows:
RspecifiesaregisterintheformR0,R1,R2,R3,R4,R5,R6orR7(orr0,r1,etc).
Lspecifiesanumericallabel(intherange1to9999).
Vspecifiesavariablelocation(avariablenumber,oravariablelocationpointedtobya
registerseebelow).
Aspecifiesaconstantvalue,avariablelocation,aregisteroravariablelocationpointedto
byaregister(anindirectaddress).Constantvaluesarespecifiedasanintegervalue,
optionallyprecededbyaminussign,precededbya#symbol.Anindirectaddressis
specifiedbyan@followedbyaregister.
So,forexampleanAtypeargumentcouldhavetheform4(variablenumber4),#4(the
constantvalue4),r4(register4)or@r4(thecontentsofregister4identifiesthevariable
locationtobeaccessed).
6
Theinstructionsetisdefinedasfollows:
LOADA,R
loadstheintegervaluespecifiedbyAintoregisterR.
STORER,V
storesthevalueinregisterRtovariableV.
OUTR
outputsthevalueinregisterR.
NEGR
negatesthevalueinregisterR.
ADDA,R
addsthevaluespecifiedbyAtoregisterR,leavingtheresultinregisterR.
SUBA,R
subtractsthevaluespecifiedbyAfromregisterR,leavingtheresultinregisterR.
MULA,R
multipliesthevaluespecifiedbyAbyregisterR,leavingtheresultinregisterR.
DIVA,R
dividesregisterRbythevaluespecifiedbyA,leavingtheresultinregisterR.
JMPL
causesanunconditionaljumptotheinstructionwiththelabelL.
JEQR,L
jumpstotheinstructionwiththelabelLifthevalueinregisterRiszero.
JNER,L
jumpstotheinstructionwiththelabelLifthevalueinregisterRisnotzero.
JGER,L
jumpstotheinstructionwiththelabelLifthevalueinregisterRisgreaterthanorequalto
zero.
JGTR,L
jumpstotheinstructionwiththelabelLifthevalueinregisterRisgreaterthanzero.
JLER,L
jumpstotheinstructionwiththelabelLifthevalueinregisterRislessthanorequalto
zero.
JLTR,L
jumpstotheinstructionwiththelabelLifthevalueinregisterRislessthanzero.
NOP
isaninstructionwithnoeffect.Itcanbetaggedbyalabel.
STOP
stopsexecutionofthemachine.AllprogramsshouldterminatebyexecutingaSTOP
instruction.
1.ProblemStatement: DesignaLexicalanalyzer.Thelexicalanalyzershouldignoreredundantstabs
and new lines. It should also ignore comments. Although the syntax specification s those identifiers can be
arbitrarilylong,youmayrestrictthelengthtosomereasonableValue.
AIM:WriteaC/C++programtoimplementthedesignofaLexicalanalyzertorecognize
thetokensdefinedbythegivengrammar.
ALGORITHM/PROCEDURE:
Wemakeuseofthefollowingtwofunctionsintheprocess.
look up() it takes string as argument and checks its presence in the symbol table. If the
stringisfoundthenreturnstheaddresselseitreturnsNULL.
insert()ittakesstringasitsargumentandthesameisinsertedintothesymboltableand
thecorrespondingaddressisreturned.
1. Start
2. Declare an array of characters, an input file to store the input;
3. Read the character from the input file and put it into character type of variable, say c.
4. If c is blank then do nothing.
5. If c is new line character line=line+1.
6. If c is digit, set token Val, the value assigned for a digit and return the NUMBER.
7. If c is proper token then assign the token value.
8. Print the complete table with
Token entered by the user,
Associated token value.
9. Stop
FILE *f1,*f2,*f3;
char c, str[10], st1[10];
int num[100], lineno=0, tokenvalue=0,i=0,j=0,k=0;
printf("\n Enter the c program : ");/*gets(st1);*/
f1=fopen("input","w");
while((c=getchar())!=EOF)
putc(c,f1);
fclose(f1);
f1=fopen("input","r");
f2=fopen("identifier","w");
f3=fopen("specialchar","w");
while((c=getc(f1))!=EOF)
{
if(isdigit(c))
{
tokenvalue=c-'0';
c=getc(f1);
while(isdigit(c))
{
tokenvalue*=10+c-'0';
c=getc(f1);
}
num[i++]=tokenvalue;
ungetc(c,f1);
}
else
if(isalpha(c))
{
putc(c,f2);
c=getc(f1);
while(isdigit(c)||isalpha(c)||c=='_'||c=='$')
{
putc(c,f2);
c=getc(f1);
}
putc(' ',f2);
9
ungetc(c,f1);
}
else
if(c==' '||c=='\t')
printf(" ");
else
if(c=='\n')
lineno++;
else
putc(c,f3);
}
fclose(f2);
fclose(f3);
fclose(f1);
printf("\n The no's in the program are :");
for(j=0; j<i; j++)
printf("%d", num[j]);
printf("\n");
f2=fopen("identifier", "r");
k=0;
printf("The keywords and identifiers are:");
while((c=getc(f2))!=EOF)
{
if(c!=' ')
str[k++]=c;
else
{
str[k]='\0';
keyword(str);
k=0;
}
}
fclose(f2);
f3=fopen("specialchar","r");
printf("\n Special characters are : ");
while((c=getc(f3))!=EOF)
10
printf("%c",c);
printf("\n");
fclose(f3);
printf("Total no. of lines are:%d", lineno);
}
Output :
Enter the C program:
a+b*c
Ctrl-D
The nos in the program are:
The keywords and identifiers are:
a is an identifier and terminal
b is an identifier and terminal
c is an identifier and terminal
Special characters are:
+*
Total no. of lines are: 1
[VivaQuestions]
1.
2.
3.
4.
5.
Whatislexicalanalyzer?
Whichcompilerisusedforlexicalanalysis?
WhatistheoutputofLexicalanalyzer?
WhichFinitestatemachinesareusedinlexicalanalyzerdesign?
Whatistheroleofregularexpressions,grammarsinLexicalAnalizer?
11
2.ProblemStatement:ImplementthelexicalanalyzerusingJLex,flexorotherlexical
Analyzergeneratingtools.
AIM:ToImplementthelexicalanalyzerusingJLex,flexorlexotherlexicalanalyzergenerating
Tools.
ALGORITHM/PROCEDURE:
Input:LEXspecificationfilesforthetoken
Output:ProducesthesourcecodefortheLexicalAnalyzerwiththenamelex.yy.cand
displaysthetokensfromaninputfile.
1. Start
2. Openafileintexteditor
4. Savefilewith.lextensione.g.mylex.l
5. Calllextoolontheterminale.g.[root@localhost]#lexmylex.l.Thislextoolwill
convert
.lfileinto.clanguagecodefilei.e.,lex.yy.c
6. Compilethefilelex.yy.cusingC/C++compiler.e.g.gcclex.yy.c.Aftercompilation
thefilelex.yy.c,theoutputfileisina.out
7. Runthefilea.outgivinganinput(text/file)e.g../a.out.
8. Uponprocessing,thesequenceoftokenswillbedisplayedasoutput.
9. Stop
LEXSPECDIFICATIONPROGRAM/SOURCECODE(lexprog.l):
//*********LEXToolprogramtoidentifyCTokens*****************//
DIGIT
[09]
LETTER
[AZaz]
DELIM
[\t\n]
WS
{DELIM}+ID{(LETTER)[LETTER/DIGIT]}+INTEGER{DIGIT}+
%%
{WS}
{printf(\nspecialcharacters\n);}
{ID}
{printf(\nIdentifiers\n);}
{DIGIT}
{printf(\nIntgers\n);}
If
{printf(\nKeywords\n);}
12
else
>
<
<=
=>
=
!=
&&
||
!
*
/
%
%%
main()
{
yylex();
}
{printf(\nkeywords\n);}
{printf(\nLogicalOperators\n);}
{printf(\nLogicalOperators\n);}
{printf(\nLogicalOperators\n);}
{printf(\nLogicalOperators\n);}
{printf(\nLogicalOperators\n);}
{printf(\nLogicalOperators\n);}
{printf(\nRelational\n);}
{printf(\nRelationalOperatos\n);}
{printf(\nRelationalOperators\n);}
{printf(\nArthmeticOperator\n);}
{printf(\nArthmeticOperator\n);}
{printf(\nArthmeticOperator\n);}
{printf(\nArthmeticOperator\n);}
{printf(\nArthmeticOperator\n);}
OUTPUT
[root@localhost]#lexlexprog.l
[root@localhost]#cclex.yy.c
[root@localhost]#./a.outlexprog
[VivaQuestions]
1.
2.
3.
4.
5.
WhatisarethefunctionsofaScanner?
WhatisToken?
Whatislexeme,Pattern?
WhatispurposeofLex?
WhataretheothertoolsusedinLexicalAnalysis?
13
3.ProblemStatement:DesignaPredictiveParserforthefollowinggrammar
G:{E>TE,E>+TE|0,T>FT,T>*FT|0,F>(E)|id}
AIM:TowriteaCProgramtoimplementforthePredictiveParser(NonRecursiveDescentparser)forthe
givengrammar,
GiventheparseTable:
id
+
E
E>TE
E>+TE
T
T>FT
T>0
(
E>TE
E>0
E>0
T>0
T>0
T>FT
T>*FT
F
F>id
F>(E)
ALGORITHM/PROCEDURE:
Input:stringw$,PredictiveParsingtableM
Output:ALeftMostDerivationoftheinputstringifitisvalid,errorotherwise.
Step1:
Step2:
Step3:
Step4:
Step5:
Step6:
Start
Declareacharacterarrayw[10]andZasanarray
Enterthestringwith$attheend
if(A(w[z])thenincrementzandcheckfor(B(w[z]))andifsatisfiesincrementzandcheckfor
difdispresentthenincrementandcheckfor(D(w[z]))
ifstep4issatisfiedthenthestringisaccepted
Elsestringisnot
Exit
SOURCECODE:
//***IMPLEMENTATIONOFPREDICTIVE/NONRECURSIVEDESCENTPARSING*****//
#include<stdio.h>
#include<conio.h>
#include<ctype.h>
charch;
#defineid0
#defineCONST1
#definemulop2
#defineaddop3
#defineop4
#definecp5
#defineerr6
14
#definecol7
#definesize50
inttoken;
charlexbuff[size];
intlookahead=0;
intmain()
{
clrscr();
printf(Enterthestring:);
gets(lexbuff);
parser();
return0;
}
parser()
{
if(E())
printf(validstring);
else
printf(invalidstring);
getch();
return0;
}
E()
{
if(T())
{
if(EPRIME())
return1;
else
return0;
}
else
return0;
}
T()
{
if(F())
{
if(TPRIME())
return1;
else
return0;
}
else
return0;
}
EPRIME()
{
token=lexer();
if(token==addop)
{
lookahead++;
if(T())
15
{
if(EPRIME())
return1;
else
return0;
}
else
return0;
}
else
return1;
}
TPRIME()
{
token=lexer();
if(token==mulop)
{
lookahead++;
if(F())
{
if(TPRIME())
return1;
else
return0;
}
elsereturn0;
}
elsereturn1;
}
F()
{
token=lexer();
if(token==id)
return1;
else
{
if(token==4)
{
if(E())
{
if(token==5)
return1;
elsereturn0;
}
elsereturn0;
}
elsereturn0;
}
}
lexer()
{
if(lexbuff[lookahead]!=\n)
{
16
while(lexbuff[lookahead]==\t)
lookahead++;
if(isalpha(lexbuff[lookahead]))
{
while(isalnum(lexbuff[lookahead]))
lookahead++;
return(id);
}
else
{
if(isdigit(lexbuff[lookahead]))
{
while(isdigit(lexbuff[lookahead]))
lookahead++;
returnCONST;
}
else
{
if(lexbuff[lookahead]==+)
{
return(addop);
}
else
{
if(lexbuff[lookahead]==*)
return(mulop);
else
if(lexbuff[lookahead]==()
lookahead++;
return(op);
else
if(lexbuff[lookahead]==))
return(op);
else
return(err);
}
}
}
else
return(col);
17
OUTPUT:
VivaQuestions:
1. WhatisaparserandstatetheRoleofit?
2. Typesofparsers?Examplestoeach
3. WhataretheToolsavailableforimplementation?
4. HowdoyoucalculateFIRST(),FOLLOW()setsusedinParsingTableconstruction?
18
4. ProblemStatement:DesignaLALRBottomUpParserforthegivengrammar
Aim:ToDesignandimplementanLALRbottomupParserforcheckingthesyntaxofthe
Statementsinthegivenlanguage.
ALGORITHM/PROCEDURE:
SourceCode:LALRBottomUpParser
<parser.l>
%{
#include<stdio.h>
#includey.tab.h
%}
%%
[09]+{yylval.dval=atof(yytext);
returnDIGIT;
}
\n|.returnyytext[0];
%%
<parser.y>
%{
/*ThisYACCspecificationfilegeneratestheLALRparserfortheprogram
consideredinexperiment4.*/
#include<stdio.h>
%}
%union
{
doubledval;
}
%token<dval>DIGIT
%type<dval>expr
%type<dval>term
%type<dval>factor
%%
line:expr\n{
;
printf(%g\n,$1);
}
expr:expr+term{$$=$1+$3;}
|term
;
term:term*factor{$$=$1*$3;}
|factor
;
19
factor:(expr){$$=$2;}
|DIGIT
;
%%
intmain()
{
yyparse();
}
yyerror(char*s)
{
printf(%s,s);
}
Output:
$lexparser.l
$yaccdparser.y
$cclex.yy.cy.tab.clllm
$./a.out
2+3
5.0000
VivaQuestions?
1. Whatisyacc?Arethereanyothertoolsavilableforparsergeneration?
2. Howdoyouuseit?
3. Structureofparserspecificationprogram
4.
20
5. Problemstatement:ConvertTheBNFrulesintoYaccformandwritecodetogenerate
abstractsyntaxtree.
Aim:ToImplementtheprocessofconversionfromBNFrulestoYaccformand
generateAbstractSyntaxTree.
ALGORITHM/PROCEDURE
<int.l>
%{
#includey.tab.h
#include<stdio.h>
#include<string.h>
intLineNo=1;
%}
identifier[azAZ][_azAZ09]*
number[09]+|([09]*\.[09]+)
%%
main\(\)returnMAIN;
ifreturnIF;
elsereturnELSE;
whilereturnWHILE;
int|
char|
floatreturnTYPE;
{identifier}{strcpy(yylval.var,yytext);
returnVAR;}
{number}{strcpy(yylval.var,yytext);
returnNUM;}
\<|
\>|
\>=|
\<=|
=={strcpy(yylval.var,yytext);
returnRELOP;}
[\t];
\nLineNo++;
.returnyytext[0];
%%
<int.y>
%{
#include<string.h>
#include<stdio.h>
structquad
21
charop[5];
chararg1[10];
chararg2[10];
charresult[10];
}QUAD[30];
structstack
{
intitems[100];
inttop;
}stk;
intIndex=0,tIndex=0,StNo,Ind,tInd;
externintLineNo;
%}
%union
{
charvar[10];
}
%token<var>NUMVARRELOP
%tokenMAINIFELSEWHILETYPE
%type<var>EXPRASSIGNMENTCONDITIONIFSTELSESTWHILELOOP
%left+
%left*/
%%
PROGRAM:MAINBLOCK
;
BLOCK:{CODE}
;
CODE:BLOCK
|STATEMENTCODE
|STATEMENT
;
STATEMENT:DESCT;
|ASSIGNMENT;
|CONDST
|WHILEST
;
DESCT:TYPEVARLIST
;
VARLIST:VAR,VARLIST
|VAR
;
ASSIGNMENT:VAR=EXPR{
strcpy(QUAD[Index].op,=);
22
strcpy(QUAD[Index].arg1,$3);
strcpy(QUAD[Index].arg2,);
strcpy(QUAD[Index].result,$1);
strcpy($$,QUAD[Index++].result);
}
;
EXPR:EXPR+EXPR{AddQuadruple(+,$1,$3,$$);}
|EXPREXPR{AddQuadruple(,$1,$3,$$);}
|EXPR*EXPR{AddQuadruple(*,$1,$3,$$);}
|EXPR/EXPR{AddQuadruple(/,$1,$3,$$);}
|EXPR{AddQuadruple(UMIN,$2,,$$);}
|(EXPR){strcpy($$,$2);}
|VAR
|NUM
;
CONDST:IFST{
Ind=pop();
sprintf(QUAD[Ind].result,%d,Index);
Ind=pop();
sprintf(QUAD[Ind].result,%d,Index);
}
|IFSTELSEST
;
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);
23
}
BLOCK{
Ind=pop();
sprintf(QUAD[Ind].result,%d,Index);
};
CONDITION:VARRELOPVAR{AddQuadruple($2,$1,$3,$$);
StNo=Index1;
}
|VAR
|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++;
}
;
%%
externFILE*yyin;
intmain(intargc,char*argv[])
{
FILE*fp;
inti;
if(argc>1)
{
fp=fopen(argv[1],r);
24
if(!fp)
{
printf(\nFilenotfound);
exit(0);
}
yyin=fp;
}
yyparse();
printf(\n\n\t\t\n\t\tPosOperatorArg1Arg2Result\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);
return0;
}
voidpush(intdata)
{
stk.top++;
if(stk.top==100)
{
printf(\nStackoverflow\n);
exit(0);
}
stk.items[stk.top]=data;
}
intpop()
{
intdata;
if(stk.top==1)
{
printf(\nStackunderflow\n);
exit(0);
}
data=stk.items[stk.top];
returndata;
}
voidAddQuadruple(charop[5],chararg1[10],chararg2[10],charresult[10])
{
strcpy(QUAD[Index].op,op);
strcpy(QUAD[Index].arg1,arg1);
25
strcpy(QUAD[Index].arg2,arg2);
sprintf(QUAD[Index].result,t%d,tIndex++);
strcpy(result,QUAD[Index++].result);
}
yyerror()
{
printf(\nErroronlineno:%d,LineNo);
}
Input:
$vitest.c
main()
{
inta,b,c;
if(a<b)
{
a=a+b;
}
while(a<b)
{
a=a+b;
}
if(a<=b)
{
c=ab;
}
else
{
c=a+b;
}
}
Output:
$lexint.l
$yaccdint.y
$gcclex.yy.cy.tab.clllm
$./a.outtest.c
OUTPUT:
26
VivaQuestions:
1. Whatisabstractsyntaxtree?
2.
27
6. ProblemStatement:Aprogramtogeneratemachinecodefromtheabstractsyntaxtree
generatedbytheparser.
Aim:TowriteaCProgramtoGenerateMachineCodefromtheAbstractSyntaxTree
usingthespecifiedmachineinstructionformats.
ALGORITHM/PROCEDURE/SOURCECODE:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
intlabel[20];
intno=0;
intmain()
{
FILE*fp1,*fp2;
charfname[10],op[10],ch;
charoperand1[8],operand2[8],result[8];
inti=0,j=0;
printf(\nEnterfilenameoftheintermediatecode);
scanf(%s,&fname);
fp1=fopen(fname,r);
fp2=fopen(target.txt,w);
if(fp1==NULL||fp2==NULL)
{
printf(\nErroropeningthefile);
exit(0);
}
while(!feof(fp1))
{
fprintf(fp2,\n);
fscanf(fp1,%s,op);
i++;
if(check_label(i))
fprintf(fp2,\nlabel#%d,i);
if(strcmp(op,print)==0)
{
fscanf(fp1,%s,result);
fprintf(fp2,\n\tOUT%s,result);
}
if(strcmp(op,goto)==0)
{
fscanf(fp1,%s%s,operand1,operand2);
fprintf(fp2,\n\tJMP%s,label#%s,operand1,operand2);
label[no++]=atoi(operand2);
28
}
if(strcmp(op,[]=)==0)18
29
{
fscanf(fp1,%s%s%s,operand1,operand2,result);
fprintf(fp2,\n\tSTORE%s[%s],%s,operand1,operand2,result);
}
if(strcmp(op,uminus)==0)
{
fscanf(fp1,%s%s,operand1,result);
fprintf(fp2,\n\tLOAD%s,R1,operand1);
fprintf(fp2,\n\tSTORER1,%s,result);
}s
witch(op[0])
{
case*:fscanf(fp1,%s%s%s,operand1,operand2,result);
fprintf(fp2,\n\tLOAD,operand1);
fprintf(fp2,\n\tLOAD%s,R1,operand2);
fprintf(fp2,\n\tMULR1,R0);
fprintf(fp2,\n\tSTORER0,%s,result);
break;
case+:fscanf(fp1,%s%s%s,operand1,operand2,result);
fprintf(fp2,\n\tLOAD%s,R0,operand1);
fprintf(fp2,\n\tLOAD%s,R1,operand2);
fprintf(fp2,\n\tADDR1,R0);
fprintf(fp2,\n\tSTORER0,%s,result);
break;
case:fscanf(fp1,%s%s%s,operand1,operand2,result);
fprintf(fp2,\n\tLOAD%s,R0,operand1);
fprintf(fp2,\n\tLOAD%s,R1,operand2);
fprintf(fp2,\n\tSUBR1,R0);
fprintf(fp2,\n\tSTORER0,%s,result);
break;
case/:fscanf(fp1,%s%s%s,operand1,operand2,result);
fprintf(fp2,\n\tLOAD%s,R0,operand1);
fprintf(fp2,\n\tLOAD%s,R1,operand2);
fprintf(fp2,\n\tDIVR1,R0);
fprintf(fp2,\n\tSTORER0,%s,result);
break;
case%:fscanf(fp1,%s%s%s,operand1,operand2,result);
fprintf(fp2,\n\tLOAD%s,R0,operand1);
fprintf(fp2,\n\tLOAD%s,R1,operand2);
fprintf(fp2,\n\tDIVR1,R0);
fprintf(fp2,\n\tSTORER0,%s,result);19
30
break;
case=:fscanf(fp1,%s%s,operand1,result);
fprintf(fp2,\n\tSTORE%s%s,operand1,result);
break;
case>:j++;
fscanf(fp1,%s%s%s,operand1,operand2,result);
fprintf(fp2,\n\tLOAD%s,R0,operand1);
fprintf(fp2,\n\tJGT%s,label#%s,operand2,result);
label[no++]=atoi(result);
break;
case<:fscanf(fp1,%s%s%s,operand1,operand2,result);
fprintf(fp2,\n\tLOAD%s,R0,operand1);fprintf(fp2,\n\t
JLT%s,label#%d,operand2,result);
label[no++]=atoi(result);
break;
}
}
fclose(fp2);fclose(fp1);
fp2=fopen(target.txt,r);
if(fp2==NULL)
{
printf(Erroropeningthefile\n);
exit(0);
}
do
{
ch=fgetc(fp2);
printf(%c,ch);
}while(ch!=EOF);
fclose(fp1);
return0;
}
intcheck_label(intk)
{
inti;
for(i=0;i<no;i++)
{
if(k==label[i])
return1;
}
return0;20
31
}
Input:
$viint.txt
=t12
[]=a01
[]=a12
[]=a23
*t16t2
+a[2]t2t3
a[2]t1t2
/t3t2t2
uminust2t2
printt2
gotot2t3
=t399
uminus25t2
*t2t3t3
uminust1t1
+t1t3t4
printt4
Output:
Enterfilenameoftheintermediatecode:int.txt
STOREt1,2
STOREa[0],1
STOREa[1],2
STOREa[2],3
LOADt1,R0
LOAD6,R1
ADDR1,R0
STORER0,t3
LOADa[2],R0
LOADt2,R1
ADDR1,R0
STORER0,t3
LOADa[t2],R0
LOADt1,R1
SUBR1,R0
STORER0,t2
LOADt3,R0
LOADt2,R121
32
DIVR1,R0
STORER0,t2
LOADt2,R1
STORER1,t2
LOADt2,R0
JGT5,label#11
Label#11:OUTt2
JMPt2,label#13
Label#13:STOREt3,99
LOAD25,R1
STORER1,t2
LOADt2,R0
LOADt3,R1
MULR1,R0
STORER0,t3
LOADt1,R1
STORER1,t1
LOADt1,R0
LOADt3,R1
ADDR1,R0
STORER0,t4
OUTt4
AdditionalPrograms/Tasks:
7.ProblemStatement:ImplementRECURSIVEDESCENTPARSER
AIM:ToImplementtheRECURSIVEDESCENTPARSERforthegivengrammar/language
ALGORITHM/PROCEDURE:
Input:Astringw$,wherewisastringofterminals
Output:wisacceptedifitcanbederivedbythegivengrammar,elsenotaccepted.
Step1:
Step2:
Step3:
Step4:
Step5:
Step6:
Step7S:
Step8:
Step9:
Start
declarew[10]ascharandZasanarray
enterthestringwith$attheend
if(A(w[z])thenincrementzandcheckfor(B(w[z]))andifsatisfiesincrementzandcheckfor
difdispresentthenincrementandcheckfor(D(w[z]))
ifstep4issatisfiedthenthestringisaccepted
Elsestringisnot
giveforthegrammarAbc/abintheloopA(intk)
Describethegrammarbc/dintheloopB(intk)
SimilarlydescribethegrammarDd/abcd
ifsteps7,8,9aresatisfiedaccordinglystringisaccepted
Elsestringisnotaccepted
33
Step10:
Stop
.NameoftheExperiment:DesignSLR
AIM:DesignSLRbottomupparserfortheabovelanguage
ALGORITHM
SStep1:
Step2:
Step3:
Step4:
Step5:
Step6:
Step7:
Step8:
Step9:
Step10:
Start
Initiallytheparserhass0onthestackwheres0istheinitialstateandw$isinbuffer
Setippointtothefirstsymbolofw$
repeatforever,begin
LetSbethestateontopofthestackandasymbolpointedtobyip
Ifaction[S,a]=shiftSthenbegin
PushS1ontothetopofthestack
Advanceiptonextinputsymbol
Elseifaction[S,a],reduceA>Bthenbegin
Pop2*|B|symbolsofthestack
LetS1bethestatenowonthetopofthestack
OutputtheproductionAB
End
elseifaction[S,a]=accepted,thenreturn
Else
Error()
End
Stop
SOURCECODE
//***********IMPLEMENTATIONOFLALRPARSINGPROGRAM****************//
#include<stdio.h>
#include<conio.h>
#include<string.h>
#defineMAX50
voidpush(charitem);
charpop(void);
inttop=1;
intcall(charc);
charstack[MAX],input[10],str2[15],str1[8]=,c;
voidprn(intj)
{
inti;
for(i=j;input[i]!=\0;i++)
printf(%c,input[i]);
}
34
voidprnstack(inttop)
{
inti;
for(i=0;i<top;i++)
printf(%c,stack[i]);
}
voidmain()
{
charstr1[6],*cmp=,c[8]=;
inti=0,cn=0,k,j;
FILE*ptr,*gptr;
clrscr();
printf(\n\nentertheexpression:\n);
scanf(%s,input);
push(0);
printf(\n\n\tSTACK\t\tCOMPARISION\t\tOUTPUT\n\n);
do
{
printf();
prnstack(top);
printf(\t\t);
prn(i);
if(strcmp(cmp,1$)==0)
{
strcpy(str2,accepted);
printf(\n\ntheinputisaccepted);
getch();
exit(0);
}
else
{
cmp[0]=stack[top];
cmp[1]=input[i];
cmp[2]=\0;
if((ptr=fopen(d:\\lrtable.doc,r))==NULL)
printf(\n\nFILECANNOTBEOPEN);
else
while(!feof(ptr))
fscanf(ptr,%s%s,str1,str2);
if(strcmp(str1,cmp)==0)
if(str2[0]==s)
push(input[i]);
push(str2[1]);
i++;
break;
elseif(str2[0]==r)
cn=call(str2[1]);
35
for(k=0;k<(cn*2);k++)
pop();
c[0]=stack[top];
push(str2[0]);
c[1]=stack[top];
c[2]=\0;
if(strcmp(c,0E)==0)
push(1);
elseif(strcmp(c,0T)==0)
push(2);
elseif(strcmp(c,0F)==0)
push(3);
elseif(strcmp(c,0E)==0)
push(8);
elseif(strcmp(c,0T)==0)
push(2);
elseif(strcmp(c,0F)==0)
push(3);
elseif(strcmp(c,0T)==0)
push(9);
elseif(strcmp(c,0F)==0)
push(3);
elseif(strcmp(c,0F)==0)
push(t);
elseif(strcmp(str2,0)==0)
printf(\n\nthestringisnotaccepted);
break;
}
fclose(ptr);
}
printf(\t\t%s\t\t\n,cmp,str2);
}
while(input[i]!=\0);
getch();
}
intcall(charc)
{
intcount=0;
switch(c)
{
case1:strcpy(str2,E>E+T);
count=3;
break;
case2:strcpy(str2,E>T);
count=1;
break;
36
case3:strcpy(str2,T>T*F);
count=3;
break;
case4:strcpy(str2,T>F);
count=1;
break;
case5:strcpy(str2,F>(E));
count=3;
break;
case6:strcpy(str2,F>id);
count=1;
break;
}
returncount;
}
voidpush(charitem)
{
if(top==MAX)
printf(\n\nstackoverflow);
else
{
top=top+1;
stack[top]=item;
}
}
charpop(void)
{
charitem;
if(top==1)
printf(\n\nstackunderlow);
else
{
item=stack[top];
top;
}
returnitem;
}
WehavetodownloadfromdriveD:\\lrtable.txt
Lrtable.txt
SLRPARSERTABLE
States Action
Id +
GOTO
)
E
37
S5
S4
accept
R2
S7
R2
R2
R4
R4
R4
R4
S5
R6
R6
S5
S4
S5
S4
S6
S11
R1
S7
R1
R1
10
R3
R3
R3
R3
11
R5
R5
R5
R5
R6
S4
R6
10
OUTPUT:
Id*(id+id)$
Grammeraccepted
Aim: To calculate trailing for all the non- terminals of the given grammmar
ALGORITHM :
1. Start
2. For each non terminal A and terminal a do L(A,a) : = false;
3. For each production of the form A->a(alpha) or A-> Ba(alpha) do INSTALL(A,a)
4. While STACK not empty repeat 5 and 6
5. Pop top pair from stack
6. For each production of the form A-> B(alpha) do
INSTALL(A,a)
7. Stop
Algorithm For INSTALL(A,a)
1. Start
38
COMPILERDESIGN
39
3)ImplementationofPredictiveParser.
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
#defineSIZE128
#defineNONE1
#defineEOS'\0'
#defineNUM257
#defineKEYWORD258
#defineID259
#defineDONE260
#defineMAX999
charlexemes[MAX];
charbuffer[SIZE];
intlastchar=1;
intlastentry=0;
inttokenval=DONE;
intlineno=1;
intlookahead;
structentry
{
char*lexptr;
inttoken;
}symtable[100];structentry
keywords[]={"if",KEYWORD,"else",KEYWORD,"for",KEYWORD,"int",KEYWORD,
"float",KEYWORD,"double",KEYWORD,"char",KEYWORD,"struct",KEYWORD,"ret
urn",KEYWORD,0,0};
voidError_Message(char*m)
{
fprintf(stderr,"line%d,%s\n",lineno,m);
exit(1);
}
intlook_up(chars[])
{
intk;for(k=lastentry;k>0;k)
if(strcmp(symtable[k].lexptr,s)==0)
returnk;
return0;
}10
40
intinsert(chars[],inttok)
{
intlen;
len=strlen(s);if(lastentry+1>=MAX)
Error_Message("Symbpltableisfull");
if(lastchar+len+1>=MAX)
Error_Message("Lexemesarrayisfull");
lastentry=lastentry+1;
symtable[lastentry].token=tok;
symtable[lastentry].lexptr=&lexemes[lastchar+1];
lastchar=lastchar+len+1;
strcpy(symtable[lastentry].lexptr,s);
returnlastentry;
}
/*voidInitialize()
{
structentry*ptr;
for(ptr=keywords;ptr>token;ptr+1)
insert(ptr>lexptr,ptr>token);
}*/
intlexer()
{
intt;
intval,i=0;
while(1)
{
t=getchar();
if(t==''||t=='\t');
elseif(t=='\n')
lineno=lineno+1;
elseif(isdigit(t))
{
ungetc(t,stdin);
scanf("%d",&tokenval);
returnNUM;
}
elseif(isalpha(t))
{
while(isalnum(t))
{
buffer[i]=t;11
41
t=getchar();
i=i+1;
if(i>=SIZE)
Error_Message("Compilererror");
}
buffer[i]=EOS;if(t!=EOF)
ungetc(t,stdin);
val=look_up(buffer);
if(val==0)
val=insert(buffer,ID);
tokenval=val;
returnsymtable[val].token;
}
elseif(t==EOF)
returnDONE;
else
{
tokenval=NONE;
returnt;
}
}
}
voidMatch(intt)
{
if(lookahead==t)
lookahead=lexer();
else
Error_Message("Syntaxerror");
}
voiddisplay(intt,inttval)
{
if(t=='+'||t==''||t=='*'||t=='/')
printf("\nArithmeticOperator:%c",t);
elseif(t==NUM)
printf("\nNumber:%d",tval);
elseif(t==ID)
printf("\nIdentifier:%s",symtable[tval].lexptr);
else
printf("\nToken%dtokenval%d",t,tokenval);
}
voidF()12
42
{
//voidE();
switch(lookahead)
{
case'(':Match('(');
E();
Match(')');
break;
caseNUM:display(NUM,tokenval);
Match(NUM);
break;
caseID:display(ID,tokenval);
Match(ID);
break;
default:Error_Message("Syntaxerror");
}
}
voidT()
{
intt;
F();
while(1)
{
switch(lookahead)
{
case'*':t=lookahead;
Match(lookahead);
F();
display(t,NONE);
continue;
case'/':t=lookahead;
Match(lookahead);
display(t,NONE);
continue;
default:return;
}
}
}
voidE()
{
intt;13
43
T();
while(1)
{
switch(lookahead)
{
case'+':t=lookahead;
Match(lookahead);
T();
display(t,NONE);
continue;
case'':t=lookahead;
Match(lookahead);
T();
display(t,NONE);
continue;
default:return;
}
}
}
voidparser()
{
lookahead=lexer();
while(lookahead!=DONE)
{
E();
Match(';');
}
}
main()
{
charans[10];
printf("\nProgramforrecursivedecentparsing");
printf("\nEntertheexpression");
printf("Andplace;attheend\n");
printf("PressCtrlZtoterminate\n");
parser();
}
Output:
Programforrecursivedecentparsing
EntertheexpressionAndplace;attheend
PressCtrlZtoterminate14
44
a+b*c;
Identifier:a
Identifier:b
Identifier:c
ArithmeticOperator:*
ArithmeticOperator:+
2*3;
Number:2
Number:3
ArithmeticOperator:*
+3;
line5,Syntaxerror
CtrlZ
45
5)AProgramtoGenerateMachineCode.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
intlabel[20];
intno=0;
intmain()
{
FILE*fp1,*fp2;
charfname[10],op[10],ch;
charoperand1[8],operand2[8],result[8];
inti=0,j=0;
printf("\nEnterfilenameoftheintermediatecode");
scanf("%s",&fname);
fp1=fopen(fname,"r");
fp2=fopen("target.txt","w");
if(fp1==NULL||fp2==NULL)
{
printf("\nErroropeningthefile");
exit(0);
}
while(!feof(fp1))
{
fprintf(fp2,"\n");
fscanf(fp1,"%s",op);
i++;
if(check_label(i))
fprintf(fp2,"\nlabel#%d",i);
if(strcmp(op,"print")==0)
{
fscanf(fp1,"%s",result);
fprintf(fp2,"\n\tOUT%s",result);
}
if(strcmp(op,"goto")==0)
{
fscanf(fp1,"%s%s",operand1,operand2);
fprintf(fp2,"\n\tJMP%s,label#%s",operand1,operand2);
label[no++]=atoi(operand2);
}
if(strcmp(op,"[]=")==0)18
46
{
fscanf(fp1,"%s%s%s",operand1,operand2,result);
fprintf(fp2,"\n\tSTORE%s[%s],%s",operand1,operand2,result);
}
if(strcmp(op,"uminus")==0)
{
fscanf(fp1,"%s%s",operand1,result);
fprintf(fp2,"\n\tLOAD%s,R1",operand1);
fprintf(fp2,"\n\tSTORER1,%s",result);
}s
witch(op[0])
{
case'*':fscanf(fp1,"%s%s%s",operand1,operand2,result);
fprintf(fp2,"\n\tLOAD",operand1);
fprintf(fp2,"\n\tLOAD%s,R1",operand2);
fprintf(fp2,"\n\tMULR1,R0");
fprintf(fp2,"\n\tSTORER0,%s",result);
break;
case'+':fscanf(fp1,"%s%s%s",operand1,operand2,result);
fprintf(fp2,"\n\tLOAD%s,R0",operand1);
fprintf(fp2,"\n\tLOAD%s,R1",operand2);
fprintf(fp2,"\n\tADDR1,R0");
fprintf(fp2,"\n\tSTORER0,%s",result);
break;
case'':fscanf(fp1,"%s%s%s",operand1,operand2,result);
fprintf(fp2,"\n\tLOAD%s,R0",operand1);
fprintf(fp2,"\n\tLOAD%s,R1",operand2);
fprintf(fp2,"\n\tSUBR1,R0");
fprintf(fp2,"\n\tSTORER0,%s",result);
break;
case'/':fscanf(fp1,"%s%s%s",operand1,operand2,result);
fprintf(fp2,"\n\tLOAD%s,R0",operand1);
fprintf(fp2,"\n\tLOAD%s,R1",operand2);
fprintf(fp2,"\n\tDIVR1,R0");
fprintf(fp2,"\n\tSTORER0,%s",result);
break;
case'%':fscanf(fp1,"%s%s%s",operand1,operand2,result);
fprintf(fp2,"\n\tLOAD%s,R0",operand1);
fprintf(fp2,"\n\tLOAD%s,R1",operand2);
fprintf(fp2,"\n\tDIVR1,R0");
fprintf(fp2,"\n\tSTORER0,%s",result);19
47
break;
case'=':fscanf(fp1,"%s%s",operand1,result);
fprintf(fp2,"\n\tSTORE%s%s",operand1,result);
break;
case'>':j++;
fscanf(fp1,"%s%s%s",operand1,operand2,result);
fprintf(fp2,"\n\tLOAD%s,R0",operand1);
fprintf(fp2,"\n\tJGT%s,label#%s",operand2,result);
label[no++]=atoi(result);
break;
case'<':fscanf(fp1,"%s%s%s",operand1,operand2,result);
fprintf(fp2,"\n\tLOAD%s,R0",operand1);fprintf(fp2,"\n\t
JLT%s,label#%d",operand2,result);
label[no++]=atoi(result);
break;
}
}
fclose(fp2);fclose(fp1);
fp2=fopen("target.txt","r");
if(fp2==NULL)
{
printf("Erroropeningthefile\n");
exit(0);
}
do
{
ch=fgetc(fp2);
printf("%c",ch);
}while(ch!=EOF);
fclose(fp1);
return0;
}
intcheck_label(intk)
{
inti;
for(i=0;i<no;i++)
{
if(k==label[i])
return1;
}
return0;
48
Input:
$viint.txt
=t12
[]=a01
[]=a12
[]=a23
*t16t2
+a[2]t2t3
a[2]t1t2
/t3t2t2
uminust2t2
printt2
gotot2t3
=t399
uminus25t2
*t2t3t3
uminust1t1
+t1t3t4
printt4
Output:
Enterfilenameoftheintermediatecode:int.txt
STOREt1,2
STOREa[0],1
STOREa[1],2
STOREa[2],3
LOADt1,R0
LOAD6,R1
ADDR1,R0
STORER0,t3
LOADa[2],R0
LOADt2,R1
ADDR1,R0
STORER0,t3
LOADa[t2],R0
LOADt1,R1
SUBR1,R0
STORER0,t2
LOADt3,R0
LOADt2,R121
49
DIVR1,R0
STORER0,t2
LOADt2,R1
STORER1,t2
LOADt2,R0
JGT5,label#11
Label#11:OUTt2
JMPt2,label#13
Label#13:STOREt3,99
LOAD25,R1
STORER1,t2
LOADt2,R0
LOADt3,R1
MULR1,R0
STORER0,t3
LOADt1,R1
STORER1,t1
LOADt1,R0
LOADt3,R1
ADDR1,R0
STORER0,t4
OUTt422
50
6).WriteaLEXProgramtoconvertthesubstringabctoABCfromthegiven
inputstring.
LexProgram
%{
/*TheProgramreplacesthesubstringabcbyABCfrom
thegiveninputstring*/
#include<stdio.h>
#include<sting.h>
inti;
%}
%%
[azAZ]*{
for(i=0;i<=yyleng;i++)
{
If((yytext[i]==a)&&(yytext[i+1]==b)&&(yytext[i+2]==c))
{
yytext[i]=A;
yytext[i+1]=B;
yytext[i+2]=C;
}
}
Printf(%s,yytext);
}
[\t]*return;
.*{ECHO;}
\n{printf(%s,yytext);}
%%
main()
{
yytext();
}
intyywrap()
{
return1;
}23
51
7).Writealexprogramtofindouttotalnumberofvowelsandconsonants
fromthegiveninputsting.
LexProgram
%{
/*Definitionsection*/
intvowel_cnt=0,consonant_cnt=0;
%}
vowel[aeiou]+
consonant[^aeiou]
eol\n
%%
{eol}return0;
[\t]+;
{vowel}{vowel_cnt++;}
%%
intmain()
{
printf(\nEntersomeinputstring\n);
yylex();
printf(vowels=%dandconsonant=%d\n,vowel_cnt,consonant_cnt);
return0;
}
Intyywrap()
{
return1;
}
%{
/*Definitionsection*/
intvowel_cnt=0,consonant_cnt=0;
%}
vowel[aeiou]+
consonant[^aeiou]
eol\n
%%
{eol}return0;
[\t]+;
{vowel}{vowel_cnt++;}
%%
intmain()
{
printf(\nEntersomeinputstring\n);
yylex();
52
printf(vowels=%dandconsonant=%d\n,vowel_cnt,consonant_cnt);
return0;
}
Intyywrap()
{
return1;
}
53