<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.kram.nz/index.php?action=history&amp;feed=atom&amp;title=SE250%3Alab-9%3Ahpan027</id>
	<title>SE250:lab-9:hpan027 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.kram.nz/index.php?action=history&amp;feed=atom&amp;title=SE250%3Alab-9%3Ahpan027"/>
	<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-9:hpan027&amp;action=history"/>
	<updated>2026-04-28T13:25:33Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.kram.nz/index.php?title=SE250:lab-9:hpan027&amp;diff=8570&amp;oldid=prev</id>
		<title>Mark: 22 revision(s)</title>
		<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-9:hpan027&amp;diff=8570&amp;oldid=prev"/>
		<updated>2008-11-03T05:20:35Z</updated>

		<summary type="html">&lt;p&gt;22 revision(s)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[SE250:lab-9]]&lt;br /&gt;
&lt;br /&gt;
== Starting up ==&lt;br /&gt;
&lt;br /&gt;
*Chose first task&lt;br /&gt;
*10 minutes in, considering switching tasks.&lt;br /&gt;
*Chose second task&lt;br /&gt;
&lt;br /&gt;
== Reading the code ==&lt;br /&gt;
&lt;br /&gt;
Parse by default calls the function for if-then-else statements - which has not been written. Hence code does not run.&lt;br /&gt;
&lt;br /&gt;
Need to recode Parse into something like:&lt;br /&gt;
 Given an input&lt;br /&gt;
 Work out what type of statement it is &amp;lt;- hard part&lt;br /&gt;
 Call appropriate method&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Looking at the various inputs and attempting to translate them into code&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;a=1&amp;quot;,&lt;br /&gt;
 &amp;quot;a=1;b=2;k;k;k&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Self explanatory?&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;ia&amp;gt;btwtda=a*2ek&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
 if (a &amp;gt; b)&lt;br /&gt;
   then   while (t)&lt;br /&gt;
          do (a = a * 2)&lt;br /&gt;
   else k&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;ict{x=1;wtda=a*2}ek&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
 if ( c )&lt;br /&gt;
 then {&lt;br /&gt;
    x = 1;&lt;br /&gt;
    while (t)&lt;br /&gt;
      do (a = a*2);&lt;br /&gt;
 }&lt;br /&gt;
 else k;&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;junk that won&amp;#039;t parse&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
Lols.&lt;br /&gt;
&lt;br /&gt;
*Getting &amp;quot;a=2&amp;quot; to parse is pretty easy.&lt;br /&gt;
*Call Exp(tokens,2)&lt;br /&gt;
*Output&lt;br /&gt;
 Parse(&amp;quot;a=1&amp;quot;):&lt;br /&gt;
 	=(a 1)&lt;br /&gt;
 	a 1 =2&lt;br /&gt;
&lt;br /&gt;
== Onto the actual task ==&lt;br /&gt;
&lt;br /&gt;
   S ::= &amp;quot;if&amp;quot; E &amp;quot;then&amp;quot; S [ &amp;quot;else&amp;quot; S ]&lt;br /&gt;
       | &amp;quot;while&amp;quot; E &amp;quot;do&amp;quot; S&lt;br /&gt;
       | &amp;quot;{&amp;quot; Ss &amp;quot;}&amp;quot;&lt;br /&gt;
       | Ide &amp;quot;=&amp;quot; E&lt;br /&gt;
       | &amp;quot;skip&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Code will need a series of if statements to check for the keywords&lt;br /&gt;
&lt;br /&gt;
 //if (&amp;quot;if&amp;quot;)&lt;br /&gt;
 //parse for if statements&lt;br /&gt;
 //else if (&amp;quot;while&amp;quot;)&lt;br /&gt;
 //parse for while statements&lt;br /&gt;
&lt;br /&gt;
etc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Very basic if-then-else ==&lt;br /&gt;
&lt;br /&gt;
 Tree* Stmt( TokenStream* tokens ) { //if then else statements&lt;br /&gt;
 &lt;br /&gt;
     if( current( tokens ) == TOK_IF )&lt;br /&gt;
 	printf(&amp;quot;True\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
     advance( tokens );&lt;br /&gt;
     Tree* t1 = Exp( tokens, 1 );&lt;br /&gt;
 &lt;br /&gt;
     expect( tokens, TOK_THEN );&lt;br /&gt;
 &lt;br /&gt;
     Tree* t2 = Exp( tokens, 1 );&lt;br /&gt;
 &lt;br /&gt;
     expect( tokens, TOK_ELSE );&lt;br /&gt;
 &lt;br /&gt;
     Tree* t3 = Exp( tokens, 1 );&lt;br /&gt;
     &lt;br /&gt;
     Tree* t = mkNode3(&amp;#039;?&amp;#039;,t1,t2,t3);&lt;br /&gt;
    &lt;br /&gt;
     return t;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*Doesn&amp;#039;t work for anything except the most basic form of if-then-else.&lt;br /&gt;
*Need to change the Exp calls into Stmt calls - but can&amp;#039;t do that until the rest of the function is finished&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Revised if-then-else code ==&lt;br /&gt;
&lt;br /&gt;
 Tree* Stmt( TokenStream* tokens ) { //if then else statements&lt;br /&gt;
 &lt;br /&gt;
     if( current( tokens ) == TOK_IF ) {&lt;br /&gt;
 	advance( tokens );&lt;br /&gt;
 	Tree* t1 = Exp( tokens, 1 );&lt;br /&gt;
 	&lt;br /&gt;
 	expect( tokens, TOK_THEN );&lt;br /&gt;
 	&lt;br /&gt;
 	Tree* t2 = Stmt( tokens );&lt;br /&gt;
 	&lt;br /&gt;
 	if (!end_of_tokens(tokens)) {&lt;br /&gt;
 	    expect( tokens, TOK_ELSE );&lt;br /&gt;
  &lt;br /&gt;
 	    Tree* t3 = Stmt( tokens );&lt;br /&gt;
 	    &lt;br /&gt;
 	    return mkNode3(&amp;#039;?&amp;#039;,t1,t2,t3);&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	return  mkNode2(&amp;#039;?&amp;#039;,t1,t2);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     if( isVariable( current( tokens ) ) )&lt;br /&gt;
 	return Exp( tokens, 0 );&lt;br /&gt;
  &lt;br /&gt;
     return mkNode(&amp;#039;0&amp;#039;,0);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*Seems to work for the input &amp;quot;ia=1ta=2ea=3&amp;quot;&lt;br /&gt;
*Need to write the if blocks for other things defined under S&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other S grammar added ==&lt;br /&gt;
&lt;br /&gt;
 Tree* Stmt( TokenStream* tokens ) { //if then else statements&lt;br /&gt;
 &lt;br /&gt;
     /* IF */&lt;br /&gt;
     if( current( tokens ) == TOK_IF ) {&lt;br /&gt;
 	advance( tokens );&lt;br /&gt;
 	Tree* t1 = Exp( tokens, 0 );&lt;br /&gt;
 	expect( tokens, TOK_THEN );&lt;br /&gt;
 	Tree* t2 = Stmt( tokens );&lt;br /&gt;
 	if (!end_of_tokens(tokens)) {&lt;br /&gt;
 	    expect( tokens, TOK_ELSE );&lt;br /&gt;
 	    Tree* t3 = Stmt( tokens );&lt;br /&gt;
 	    return mkNode3(&amp;#039;?&amp;#039;,t1,t2,t3);&lt;br /&gt;
 	}&lt;br /&gt;
 	return  mkNode2(&amp;#039;?&amp;#039;,t1,t2);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     /* Variable assignment (e.g. a = 1) */&lt;br /&gt;
     if( isVariable( current( tokens ) ) )&lt;br /&gt;
 	return Exp( tokens, 0 );&lt;br /&gt;
 &lt;br /&gt;
     /* While loops */&lt;br /&gt;
     if( current( tokens ) == TOK_WHILE ) {&lt;br /&gt;
 	advance( tokens );&lt;br /&gt;
 	Tree* t1 = Exp( tokens, 0 );&lt;br /&gt;
 	expect( tokens, TOK_DO );&lt;br /&gt;
 	Tree* t2 = Stmt( tokens );&lt;br /&gt;
 	return mkNode2(TOK_WHILE,t1,t2);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     /* { Curly brackets } */&lt;br /&gt;
     if( current( tokens ) == TOK_OPENBRACE ) {&lt;br /&gt;
 	advance( tokens );&lt;br /&gt;
 	Tree* t = StmtSeq(tokens);&lt;br /&gt;
 	expect( tokens, TOK_CLOSEBRACE);&lt;br /&gt;
 	return t;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     /* SKIP */&lt;br /&gt;
     if( current( tokens ) == TOK_SKIP) {&lt;br /&gt;
 	return mkNode(0,0);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     /* Print */&lt;br /&gt;
     if( current( tokens ) == TOK_PRINT) {&lt;br /&gt;
 	return mkNode1(TOK_PRINT, Exp(tokens,0));&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     /* Base fail case */&lt;br /&gt;
     return mkNode(0,0);&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
*Trying to get this code to run with &amp;quot;ia=btwa=1da=a*2ek&amp;quot;&lt;br /&gt;
*Having some problems at the moment&lt;br /&gt;
*The default test cases do not work at all&lt;br /&gt;
*Variable assignment needed to be rewritten&lt;br /&gt;
&lt;br /&gt;
     if( isVariable( current( tokens ) ) ) {&lt;br /&gt;
 	Tree* t1 = P(tokens);&lt;br /&gt;
 	expect(tokens, TOK_EQ);&lt;br /&gt;
 	return mkNode2(TOK_EQ, t1, Exp(tokens,0));&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
*Still problems&lt;br /&gt;
&lt;br /&gt;
*Order matters...variable assignment should be right at bottom as i, p, e, etc are all considered variables&lt;br /&gt;
*/facepalm&lt;br /&gt;
*However getting there&lt;br /&gt;
*Output currently ?(=(a b) w(=(a 1) =(a *(a 2)))&lt;br /&gt;
**If statement seems to have been broken by the while&lt;br /&gt;
*Actually caused by the skip&lt;br /&gt;
*No idea how to produce an external node&lt;br /&gt;
&lt;br /&gt;
*Changing test case to  &amp;quot;ia=btwa=1da=a*2ea=2&amp;quot;&lt;br /&gt;
 Parse(&amp;quot;ia=btwa=1da=a*2ea=2&amp;quot;):&lt;br /&gt;
 	?(=(a b) w(=(a 1) =(a *(a 2))) =(a 2))&lt;br /&gt;
*Seems to work&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
Very long lab for 2 hours. Might finish later.&lt;/div&gt;</summary>
		<author><name>Mark</name></author>
	</entry>
</feed>