<?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-8%3Arwan064</id>
	<title>SE250:lab-8:rwan064 - 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-8%3Arwan064"/>
	<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-8:rwan064&amp;action=history"/>
	<updated>2026-04-28T15:04:53Z</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-8:rwan064&amp;diff=8316&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-8:rwan064&amp;diff=8316&amp;oldid=prev"/>
		<updated>2008-11-03T05:20:30Z</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;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Thanks to [[User:Jhor053|Jhor053]] for fixing the problem with Graphviz and putting it on the wiki ([[250:lab-8:graphvizsoln|Graphviz Solution]])&lt;br /&gt;
&lt;br /&gt;
== Task 2 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Construct an expression (calling mkNode) that, when passed to prefix tree, produces the output -(-(a b))&lt;br /&gt;
Graph the tree using tree to graph.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Code:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int main( void )&lt;br /&gt;
{&lt;br /&gt;
    ParseTree* t = mkNode( &amp;#039;-&amp;#039;, mkNode( &amp;#039;-&amp;#039;, mkNode( &amp;#039;a&amp;#039;, 0 ), mkNode( &amp;#039;b&amp;#039;, 0 ), 0 ), 0);&lt;br /&gt;
    tree_to_graph( t, &amp;quot;output.png&amp;quot; );&lt;br /&gt;
    prefix_tree( t );&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ make &amp;amp;&amp;amp; ./parsetree.exe&lt;br /&gt;
gcc -Wall parsetree.c -o parsetree.exe&lt;br /&gt;
-(-(a b))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;The graph:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://studwww.cs.auckland.ac.nz/~rwan064/lab8/task1.png&amp;quot; width=&amp;quot;179&amp;quot; height=&amp;quot;293&amp;quot; alt=&amp;quot;Task 1 Graph&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This task was quite easy since the example given on the lab handout was very similar.&lt;br /&gt;
&lt;br /&gt;
== Task 3 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Now, construct an expression that produces&lt;br /&gt;
?(&amp;gt;(+(a b) c) *(z +(y b)) ?(=(a 2) -(x y) -(y x)))&lt;br /&gt;
Hint: the ? is a ternary node.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Code:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ParseTree* t = mkNode( &amp;#039;?&amp;#039;, mkNode( &amp;#039;&amp;gt;&amp;#039;, mkNode( &amp;#039;+&amp;#039;, mkNode( &amp;#039;a&amp;#039;, 0 ), mkNode( &amp;#039;b&amp;#039;, 0 ), 0 ), mkNode( &amp;#039;c&amp;#039;, 0 ), 0 ),&lt;br /&gt;
               mkNode( &amp;#039;*&amp;#039;, mkNode( &amp;#039;z&amp;#039;, 0 ), mkNode( &amp;#039;+&amp;#039;, mkNode( &amp;#039;y&amp;#039;, 0 ), mkNode( &amp;#039;b&amp;#039;, 0 ), 0 ), 0 ),&lt;br /&gt;
               mkNode( &amp;#039;?&amp;#039;, mkNode( &amp;#039;=&amp;#039;, mkNode( &amp;#039;a&amp;#039;, 0 ), mkNode( &amp;#039;2&amp;#039;, 0 ), 0 ),&lt;br /&gt;
               mkNode( &amp;#039;-&amp;#039;, mkNode( &amp;#039;x&amp;#039;, 0 ), mkNode( &amp;#039;y&amp;#039;, 0 ), 0 ),&lt;br /&gt;
               mkNode( &amp;#039;-&amp;#039;, mkNode( &amp;#039;y&amp;#039;, 0 ), mkNode( &amp;#039;x&amp;#039;, 0 ), 0 ), 0 ), 0 );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
?(&amp;gt;(+(a b) c) *(z +(y b)) ?(=(a 2) -(x y) -(y x)))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This task was much harder than task 1 since the expression we had to generate the tree for was much bigger. At first I couldn&amp;#039;t figure out what part of the expression given in the question came after the colon in the ternary operator. But then I found that this was just seperated by a space since the colon wasn&amp;#039;t in the tree expression in the question.&lt;br /&gt;
&lt;br /&gt;
What I then did was figure out what code actually might produce this tree. I came with this answer:&lt;br /&gt;
(a + b) &amp;gt; c ? ( y + b ) * z : ( a = 2 ) ? ( x - y ) : ( y - x )&lt;br /&gt;
&lt;br /&gt;
After figuring this out it was quite easy to write the code to create the parse tree and also draw the graph in task 4.&lt;br /&gt;
&lt;br /&gt;
== Task 4 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Draw a picture of what you expect the graph of this tree to look&lt;br /&gt;
like, then graph the tree using tree to graph and compare the&lt;br /&gt;
result with your prediction.&lt;br /&gt;
Discuss any discrepancies in your report.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Graph:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://studwww.cs.auckland.ac.nz/~rwan064/lab8/task2.png&amp;quot; width=&amp;quot;768&amp;quot; height=&amp;quot;317&amp;quot; alt=&amp;quot;Task 2 Graph&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The graph actually came out the way i drew it, so no discrepancies there.&lt;br /&gt;
&lt;br /&gt;
== Task 5 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;The ? corresponds to the C conditional expression, which has the&lt;br /&gt;
form cond ? e1 : e2. Why does the parse tree not need to include&lt;br /&gt;
the colon (:)?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Task 6 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Write a (recursive) function to evaluate a parse tree that consists&lt;br /&gt;
of nodes that are either digits or the operators +, 􀀀, * and /. For&lt;br /&gt;
example,&lt;br /&gt;
&lt;br /&gt;
int v = eval( mkNode(’+’, mkNode(’1’,0), mkNode(’2’,0), 0) );&lt;br /&gt;
&lt;br /&gt;
should set v to the value 3.&lt;br /&gt;
Think about what to do if an operator does not have exactly two&lt;br /&gt;
arguments, or if a digit has arguments. Justify your decisions in&lt;br /&gt;
your report.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;My first attempt:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int eval( ParseTree *t ) {&lt;br /&gt;
    if ( (t-&amp;gt;name &amp;gt;= &amp;#039;0&amp;#039;) &amp;amp;&amp;amp; (t-&amp;gt;name &amp;lt;= &amp;#039;9&amp;#039; ) ) {&lt;br /&gt;
        // it&amp;#039;s a digit&lt;br /&gt;
        return t-&amp;gt;name - &amp;#039;0&amp;#039;;	// Return that digit&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        // it&amp;#039;s an operator - must have exactly two arguments&lt;br /&gt;
        int left = eval( t-&amp;gt;arg[0] );	// evaluate left side&lt;br /&gt;
        int right = eval( t-&amp;gt;arg[1] );	// evaluate right side&lt;br /&gt;
        // do the operation&lt;br /&gt;
        switch ( t-&amp;gt;name ) {&lt;br /&gt;
            case &amp;#039;+&amp;#039;:&lt;br /&gt;
                return left + right;&lt;br /&gt;
                break;&lt;br /&gt;
            case &amp;#039;-&amp;#039;:&lt;br /&gt;
                return left - right;&lt;br /&gt;
                break;&lt;br /&gt;
            case &amp;#039;*&amp;#039;:&lt;br /&gt;
                return left * right;&lt;br /&gt;
                break;&lt;br /&gt;
            case &amp;#039;/&amp;#039;:&lt;br /&gt;
                return left / right;&lt;br /&gt;
                break;&lt;br /&gt;
            default:&lt;br /&gt;
                // it&amp;#039;s something else we don&amp;#039;t want.&lt;br /&gt;
                // what to do?&lt;br /&gt;
                break;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ParseTree* t = mkNode( &amp;#039;*&amp;#039;, mkNode( &amp;#039;3&amp;#039;, 0 ), mkNode( &amp;#039;-&amp;#039;, mkNode( &amp;#039;7&amp;#039;, 0 ), mkNode( &amp;#039;2&amp;#039;, 0 ) , 0 ), 0 );&lt;br /&gt;
printf( &amp;quot;eval &amp;quot; );&lt;br /&gt;
prefix_tree( t );&lt;br /&gt;
printf( &amp;quot; : %d\n&amp;quot;, eval( t ) );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Output:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
eval *(3 -(7 2)) : 15&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mark</name></author>
	</entry>
</feed>