<?xml version="1.0" encoding="ISO-8859-1" ?>
<?xml-stylesheet type="text/xsl" href="xsl/grammar.xsl"?>
<grammar name="PL02C#" eps="_eps" start="Program" lexspec="lex_specification.xml">
	<nterminals>
		<nterminal>Program</nterminal>
		<nterminal>Block</nterminal>
		<nterminal>Constdecl</nterminal>
		<nterminal>Vardecl</nterminal>
		<nterminal>Proceduredecl</nterminal>
		<nterminal>Statement</nterminal>
		<nterminal>Condition</nterminal>
		<nterminal>Expr</nterminal>
		<nterminal>Term</nterminal>
		<nterminal>Factor</nterminal>
		<nterminal>A</nterminal>
		<nterminal>B</nterminal>
		<nterminal>C</nterminal>
		<nterminal>D</nterminal>
		<nterminal>E</nterminal>
		<nterminal>F</nterminal>
	</nterminals>
	<terminals>
		<terminal>CONST</terminal>
		<terminal>VAR</terminal>
		<terminal>IF</terminal>
		<terminal>THEN</terminal>
		<terminal>ELSE</terminal>
		<terminal>WHILE</terminal>
		<terminal>DO</terminal>
		<terminal>ODD</terminal>
		<terminal>PROCEDURE</terminal>
		<terminal>BEGIN</terminal>
		<terminal>END</terminal>
		<terminal>CALL</terminal>
		<terminal>number</terminal>
		<terminal>ident</terminal>
		<terminal>.</terminal>
		<terminal>,</terminal>
		<terminal>;</terminal>
		<terminal>!</terminal>
		<terminal>?</terminal>
		<terminal>+</terminal>
		<terminal>-</terminal>
		<terminal>(</terminal>
		<terminal>)</terminal>
		<terminal>&lt;=</terminal>
		<terminal>&lt;</terminal>
		<terminal>=</terminal>
		<terminal>:=</terminal>
		<terminal>*</terminal>
		<terminal>/</terminal>
		<terminal>#</terminal>
		<terminal>>=</terminal>
		<terminal>></terminal>
		<terminal>_end</terminal>
	</terminals>
	<rules>
		<rule name="Program">
			<option>
				<syntax>Block .</syntax>
				<semantik>using _ System; $ using _ System.Collections; $ class _ Pl0Program $ { $ _ static _ int[] _ S=new _ int[100],V=new _ int[100]; $ _ static _ int _ SC=0; $ _ static _ void _ push(int _ i) _ {S[SC++]=V[i];} $ _ static _ void _ pop(int _ i) _ {V[i]=S[--SC];} $ Block _ public _ static _ int _ Main() $ _ { $ _ _ PL0_Main(); $ _ _ return _ 0; $ _ } $ }</semantik>
			</option>
		</rule>
		<rule name="Block">
			<option>
				<syntax>Constdecl Vardecl Proceduredecl Statement</syntax>
				<semantik>Proceduredecl _ static _ void _ _ResolveCurrentLevelToString(_) () $ _ { $ _All(_:_:push(:_ResolveAddress({Def}):);:$,const:int) Constdecl Vardecl Statement _AllR(_:_:pop(:_ResolveAddress({Def}):);:$,const:int) _ } $</semantik>
			</option>
		</rule>
		<rule name="Constdecl">
			<option>
				<syntax>_eps</syntax>
				<semantik></semantik>
			</option>
			<option>
				<syntax>CONST ident = number B ;</syntax>
				<semantik>_Define({1},const) _MakeAddress({1}) _ _ V[ _ResolveAddress({1}) ]={3}; $ B</semantik>
			</option>
		</rule>
		<rule name="Vardecl">
			<option>
				<syntax>_eps</syntax>
				<semantik></semantik>
			</option>
			<option>
				<syntax>VAR ident A ;</syntax>
				<semantik>_Define({1},int) _MakeAddress({1}) A</semantik>
			</option>
		</rule>
		<rule name="Proceduredecl">
			<option>
				<syntax>_eps</syntax>
				<semantik></semantik>
			</option>
			<option>
				<syntax>PROCEDURE ident ; Block ; Proceduredecl</syntax>
				<semantik>_Define({1},function) _EnterLevel({1}) Block _LeaveLevel() Proceduredecl</semantik>
			</option>
		</rule>
		<rule name="Statement">
			<option>
				<syntax>_eps</syntax>
				<semantik></semantik>
			</option>
			<option>
				<syntax>ident := Expr</syntax>
				<semantik>_CheckDefine({0},int) _ _ V[ _ResolveAddress({0}) ]= Expr ; $</semantik>
			</option>
			<option>
				<syntax>CALL ident</syntax>
				<semantik>_CheckDefine({1},function) _ _ _ResolveLevelToString({1},_) (); $</semantik>
			</option>
			<option>
				<syntax>? ident</syntax>
				<semantik>_CheckDefine({1},int) _ _ Console.Write("Please _ enter _  {1} _ > _ "); $ _ _ V[ _ResolveAddress({1}) ]=Convert.ToInt32(Console.ReadLine()); $</semantik>
			</option>
			<option>
				<syntax>! Expr</syntax>
				<semantik>_ _ Console.WriteLine( Expr ); $</semantik>
			</option>
			<option>
				<syntax>BEGIN Statement C END</syntax>
				<semantik>_ _ { $ Statement C _ _ } $</semantik>
			</option>
			<option>
				<syntax>IF Condition THEN Statement</syntax>
				<semantik>_ _ if( Condition ) $ _ _ { $ Statement _ _ } $</semantik>
			</option>
			<option>
				<syntax>WHILE Condition DO Statement</syntax>
				<semantik>_ _ while( Condition ) $ _ _ { $ Statement _ _ } $</semantik>
			</option>
		</rule>
		<rule name="Expr">
			<option>
				<syntax>Term D</syntax>
				<semantik>Term D</semantik>
			</option>
			<option>
				<syntax>+ Term D</syntax>
				<semantik>Term D</semantik>
			</option>
			<option>
				<syntax>- Term D</syntax>
				<semantik>- Term D</semantik>
			</option>
		</rule>
		<rule name="Term">
			<option>
				<syntax>Factor E</syntax>
				<semantik>Factor E</semantik>
			</option>
		</rule>
		<rule name="Factor">
			<option>
				<syntax>ident</syntax>
				<semantik>_CheckDefine({0},int:const) V[ _ResolveAddress({0}) ]</semantik>
			</option>
			<option>
				<syntax>number</syntax>
				<semantik>{0}</semantik>
			</option>
			<option>
				<syntax>( Expr )</syntax>
				<semantik>( Expr )</semantik>
			</option>
		</rule>
		<rule name="A">
			<option>
				<syntax>_eps</syntax>
				<semantik></semantik>
			</option>
			<option>
				<syntax>, ident A</syntax>
				<semantik>_Define({1},int) _MakeAddress({1}) A</semantik>
			</option>
		</rule>
		<rule name="B">
			<option>
				<syntax>_eps</syntax>
				<semantik></semantik>
			</option>
			<option>
				<syntax>, ident = number B</syntax>
				<semantik>_Define({1},const) _MakeAddress({1}) _ _ V[ _ResolveAddress({1}) ]={3}; $ B</semantik>
			</option>
		</rule>
		<rule name="C">
			<option>
				<syntax>_eps</syntax>
				<semantik></semantik>
			</option>
			<option>
				<syntax>; Statement C</syntax>
				<semantik>Statement C</semantik>
			</option>
		</rule>
		<rule name="Condition">
			<option>
				<syntax>Expr F</syntax>
				<semantik>Expr F</semantik>
			</option>
			<option>
				<syntax>ODD Expr</syntax>
				<semantik>( Expr )%2 _ == _ 1</semantik>
			</option>
		</rule>
		<rule name="D">
			<option>
				<syntax>_eps</syntax>
				<semantik></semantik>
			</option>
			<option>
				<syntax>+ Term D</syntax>
				<semantik>+ Term D</semantik>
			</option>
			<option>
				<syntax>- Term D</syntax>
				<semantik>- Term D</semantik>
			</option>
		</rule>
		<rule name="E">
			<option>
				<syntax>_eps</syntax>
				<semantik></semantik>
			</option>
			<option>
				<syntax>* Factor E</syntax>
				<semantik>* Factor E</semantik>
			</option>
			<option>
				<syntax>/ Factor E</syntax>
				<semantik>/ Factor E</semantik>
			</option>
		</rule>
		<rule name="F">			
			<option>
				<syntax>= Expr</syntax>
				<semantik>== Expr</semantik>
			</option>
			<option>
				<syntax># Expr</syntax>
				<semantik>!= Expr</semantik>
			</option>
			<option>
				<syntax>> Expr</syntax>
				<semantik>> Expr</semantik>
			</option>
			<option>
				<syntax>>= Expr</syntax>
				<semantik>>= Expr</semantik>
			</option>
			<option>
				<syntax>&lt; Expr</syntax>
				<semantik>&lt; Expr</semantik>
			</option>
			<option>
				<syntax>&lt;= Expr</syntax>
				<semantik>&lt;= Expr</semantik>
			</option>
		</rule>
	</rules>
</grammar>