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)