Semantic Descriptions for PL/0 - 2000
Program -> Code (Block)
Block -> Gen(Jmp,0,Start) || // Gen(Jmp,0,0) back filled
{Code(procedures)}* ||
// do back fill then inc top of stack for local variables
Start Gen(Int,0,parameters + variables+ 3)||
Code(Statement) || // body of block
Gen(Opr,0,0); //return
StatementList -> Code(Statement) || {Code(Statement)}*
Statement -> Code(Expression);//assignment
address = Table[i].adr
if array item add subscript to address
Gen(Sto,lev - Table[i].level,address); // for variable
Gen(Cal,lev - Table[i].level,Table[i].adr); |// proc. call
Code(StatementList) |// begin-end
Code(Conditional) || // if
Gen(Opr,0,1) ||
Gen(Jmc,0,EndIf) ||
Code(Statement);
if ElseSym // else part of the if then else
Gen(Jmp,0,EndElse);
EndIf // Backfile here
Code (Statement);
EndElse// Backfill here
else
EndIf//Backfill here
Start: Code(Conditional) || // while
Gen(Opr,0,1) ||
Gen(JMC,0,End) ||
Code(Statement);
Gen(JMP,0,Start);
End: // Backfill here
MatchParameters -> if parameters
inc(lev)
paracount :=0
int varAddress = 3;
Gen(inb,0,0);
Gen(Int,0,3+ number of parameters);||
{
inc(paracount )
if array then
for each member of the array
pCode->gen(lod,lev-table.getLevel(index),table.getAddress(index)+i);
pCode->gen(sto,0,varAddress);
varAddress++;
else
code(Expression)
Gen(sto,0,varAddress);
} while more parameters
Gen(deb,0,0)
Expression -> Code(term)||
{Gen(Opr,0,1)} ||// possible code for unary minus
{ code(term) ||
Gen(Opr,0,2); | //code for addition
Gen(Opr,0,3); }* //code for subtraction
Term -> Code(factor) ||
{ Code(factor) ||
Gen(Opr,0,4); | //code for multiplication
Gen(Opr,0,5); }* //code for division
Factor ->address = Table[i].adr
if array item add subscript to address
(Gen(Lod,lev - Table[i].level,address);// for id of ovar kind
Gen(LIT, 0,Num); |
Code(Expression);
Conditional -> Code(Expression) || Code(Expression) || Gen(Opr,0,i)