<?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%3Adcho040</id>
	<title>SE250:lab-8:dcho040 - 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%3Adcho040"/>
	<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-8:dcho040&amp;action=history"/>
	<updated>2026-06-04T21:31:15Z</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:dcho040&amp;diff=8108&amp;oldid=prev</id>
		<title>Mark: 14 revision(s)</title>
		<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-8:dcho040&amp;diff=8108&amp;oldid=prev"/>
		<updated>2008-11-03T05:20:27Z</updated>

		<summary type="html">&lt;p&gt;14 revision(s)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== check out the error ==&lt;br /&gt;
* parsetree.c line 111 &amp;#039;strcimp&amp;#039; to &amp;#039;strcmp&amp;#039;&lt;br /&gt;
* change the function &amp;#039;error&amp;#039; and &amp;#039;expect&amp;#039; because &amp;#039;error&amp;#039; function is used in &amp;#039;expect&amp;#039; function so have to define earlier.&lt;br /&gt;
&lt;br /&gt;
== task2 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
expression : -(-(a b))&lt;br /&gt;
fomula     : -(a-b)&lt;br /&gt;
code       : ParseTree* test = 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;
             prefix_tree(p);&lt;br /&gt;
             char filename[] = &amp;quot;task2.jpg&amp;quot;;&lt;br /&gt;
             tree_to_graph(p, filename);&lt;br /&gt;
result     : -(-(a b))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
graph&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;#039;http://daniel.hosting.paran.com/task2.jpg&amp;#039;&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== task3 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
expression : ?(&amp;gt;(+(a b) c) * (z + (y b)) ?(=(a 2) - (x y) -(y x)&lt;br /&gt;
fomula     : a+b&amp;gt;c ? z*y+b : (a==2 ? z-y : y-x)&lt;br /&gt;
code       : ParseTree* first = 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); //(&amp;gt;(+(a b) c)&lt;br /&gt;
             ParseTree* second = 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); //* (z + (y b))&lt;br /&gt;
             ParseTree* thirdA = mkNode(&amp;#039;=&amp;#039;, mkNode(&amp;#039;a&amp;#039;, 0), mkNode(&amp;#039;2&amp;#039;, 0), 0); //=(a 2)&lt;br /&gt;
             ParseTree* thirdB = mkNode(&amp;#039;-&amp;#039;, mkNode(&amp;#039;x&amp;#039;, 0), mkNode(&amp;#039;y&amp;#039;, 0), 0); //-(x y)&lt;br /&gt;
             ParseTree* thirdC = mkNode(&amp;#039;-&amp;#039;, mkNode(&amp;#039;y&amp;#039;, 0), mkNode(&amp;#039;x&amp;#039;, 0), 0); //-(y x)&lt;br /&gt;
             &lt;br /&gt;
             ParseTree* third = mkNode(&amp;#039;?&amp;#039;, thirdA, thirdB, thirdC, 0); //?(=(a 2) - (x y) -(y x)&lt;br /&gt;
             ParseTree* final = mkNode(&amp;#039;?&amp;#039;, first, second, third, 0); // done&lt;br /&gt;
&lt;br /&gt;
             prefix_tree(final);&lt;br /&gt;
             char filename[] = &amp;quot;task3.jpg&amp;quot;;&lt;br /&gt;
             tree_to_graph(final, filename);&lt;br /&gt;
result     : ?(&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;
== task4 ==&lt;br /&gt;
graph&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;#039;http://daniel.hosting.paran.com/task3.jpg&amp;#039;&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The results are exactly same as what i expected.&lt;br /&gt;
&lt;br /&gt;
== task5 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* Because many argument can separate expression without using :&lt;br /&gt;
  mkNode(&amp;#039;?&amp;#039;, thirdA, thirdB, thirdC, 0) //it is clear thirdB : thirdC&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== task6 ==&lt;br /&gt;
* eval function plan&lt;br /&gt;
 Do the calculation (+ - * /)&lt;br /&gt;
 more than 2 arguments can be used&lt;br /&gt;
 more than one calculation can be used (ex 1+2-5*3) &lt;br /&gt;
&lt;br /&gt;
* code&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int eval(ParseTree* root) {&lt;br /&gt;
&lt;br /&gt;
 int i, division, result = 0;&lt;br /&gt;
 // number&lt;br /&gt;
 if ((root-&amp;gt;name &amp;gt;= &amp;#039;0&amp;#039;) &amp;amp;&amp;amp; (root-&amp;gt;name &amp;lt;= &amp;#039;9&amp;#039;)){&lt;br /&gt;
   return root-&amp;gt;name - &amp;#039;0&amp;#039;;&lt;br /&gt;
 // multiply&lt;br /&gt;
 }else if (root-&amp;gt;name == &amp;#039;*&amp;#039;) {&lt;br /&gt;
   result = 1;&lt;br /&gt;
   for (i=0; i&amp;lt;root-&amp;gt;arity; i++)&lt;br /&gt;
     result = result * eval(root-&amp;gt;arg[i]);&lt;br /&gt;
   return result;&lt;br /&gt;
 // division&lt;br /&gt;
 }else if (root-&amp;gt;name == &amp;#039;/&amp;#039;) {&lt;br /&gt;
   result = eval(root-&amp;gt;arg[0]);&lt;br /&gt;
   for (i=1; i&amp;lt;root-&amp;gt;arity; i++){&lt;br /&gt;
     division = eval(root-&amp;gt;arg[i]);&lt;br /&gt;
     if (division)&lt;br /&gt;
      result = result / division;&lt;br /&gt;
     else {&lt;br /&gt;
      printf(&amp;quot;the number was divided by 0 and put 0 for that result\n&amp;quot;);&lt;br /&gt;
      result = 0;&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
   return result;&lt;br /&gt;
 // addition&lt;br /&gt;
 }else if (root-&amp;gt;name == &amp;#039;+&amp;#039;) {&lt;br /&gt;
   for (i=0; i&amp;lt;root-&amp;gt;arity; i++)&lt;br /&gt;
     result += eval(root-&amp;gt;arg[i]);&lt;br /&gt;
   return result;&lt;br /&gt;
 // substraction&lt;br /&gt;
 }else if (root-&amp;gt;name == &amp;#039;-&amp;#039;) {&lt;br /&gt;
   result = eval(root-&amp;gt;arg[0]);&lt;br /&gt;
   for (i=1; i&amp;lt;root-&amp;gt;arity; i++)&lt;br /&gt;
     result -= eval(root-&amp;gt;arg[i]);&lt;br /&gt;
   return result;&lt;br /&gt;
 // else&lt;br /&gt;
 }else{&lt;br /&gt;
   printf(&amp;quot;unexpeted data&amp;quot;);&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;
* Test&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Test1&lt;br /&gt;
 - intput (v = 1+2)&lt;br /&gt;
    int v = eval( mkNode(&amp;#039;+&amp;#039;, mkNode(&amp;#039;1&amp;#039;, 0), mkNode(&amp;#039;2&amp;#039;, 0), 0));&lt;br /&gt;
 - output&lt;br /&gt;
    3&lt;br /&gt;
&lt;br /&gt;
 Test2 (v = 2*4*5)&lt;br /&gt;
 - intput&lt;br /&gt;
    int v = eval( mkNode(&amp;#039;*&amp;#039;, mkNode(&amp;#039;2&amp;#039;, 0), mkNode(&amp;#039;4&amp;#039;, 0), mkNode(&amp;#039;5&amp;#039;, 0), 0));&lt;br /&gt;
 - output&lt;br /&gt;
    40&lt;br /&gt;
&lt;br /&gt;
 Test3 (v = 8/2/2)&lt;br /&gt;
 - intput&lt;br /&gt;
    int v = eval( mkNode(&amp;#039;/&amp;#039;, mkNode(&amp;#039;8&amp;#039;, 0), mkNode(&amp;#039;2&amp;#039;, 0), mkNode(&amp;#039;2&amp;#039;, 0), 0));&lt;br /&gt;
 - output&lt;br /&gt;
    2&lt;br /&gt;
&lt;br /&gt;
 Test4 (v = 3-5-4)&lt;br /&gt;
 - intput&lt;br /&gt;
    int v = eval( mkNode(&amp;#039;-&amp;#039;, mkNode(&amp;#039;3&amp;#039;, 0), mkNode(&amp;#039;5&amp;#039;, 0), mkNode(&amp;#039;4&amp;#039;, 0), 0));&lt;br /&gt;
 - output&lt;br /&gt;
    -6&lt;br /&gt;
&lt;br /&gt;
 Test4 (v = 3-5+4*2)&lt;br /&gt;
 - intput&lt;br /&gt;
    int v = eval( mkNode(&amp;#039;-&amp;#039;, mkNode(&amp;#039;3&amp;#039;, 0), mkNode(&amp;#039;+&amp;#039;, mkNode(&amp;#039;5&amp;#039;, 0), mkNode(&amp;#039;*&amp;#039;, mkNode(&amp;#039;4&amp;#039;, 0), mkNode(&amp;#039;2&amp;#039;, 0) , 0) , 0) , 0));&lt;br /&gt;
 - output&lt;br /&gt;
    -10 (wrong!!)&lt;br /&gt;
 - discussion&lt;br /&gt;
    computer do 3-(5+(4*2))&lt;br /&gt;
 - solution&lt;br /&gt;
    (-) calculation should do from front to back so it need to recompose.&lt;br /&gt;
    (3-5)+(4*2)&lt;br /&gt;
    int v = eval( mkNode(&amp;#039;+&amp;#039;, mkNode(&amp;#039;-&amp;#039;, mkNode(&amp;#039;3&amp;#039;, 0), mkNode(&amp;#039;5&amp;#039;, 0), 0), mkNode(&amp;#039;*&amp;#039;, mkNode(&amp;#039;4&amp;#039;, 0), mkNode(&amp;#039;2&amp;#039;, 0), 0), 0));&lt;br /&gt;
    output : 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==From string to parse tree==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ParseTree* recogniseE( TokenStream* tokens ) {&lt;br /&gt;
  if ( current( tokens ) == ’(’ ) {&lt;br /&gt;
     ParseTree* e;&lt;br /&gt;
     advance( tokens );&lt;br /&gt;
     e = recogniseE( tokens );&lt;br /&gt;
     expect( tokens, ’)’ );&lt;br /&gt;
     return e;&lt;br /&gt;
 }&lt;br /&gt;
 else if ( isdigit( current( tokens ) ) ) {&lt;br /&gt;
     ParseTree* e = mkNode( current( tokens ), 0 );&lt;br /&gt;
     advance( tokens );&lt;br /&gt;
     return e;&lt;br /&gt;
 } else {&lt;br /&gt;
     ParseTree* lhs = recogniseE( tokens );&lt;br /&gt;
     ParseTree* rhs;&lt;br /&gt;
     char op = current( tokens );&lt;br /&gt;
      if ( ! isBinOp( op ) )&lt;br /&gt;
         error( ”BinOp expected” );&lt;br /&gt;
     advance( tokens );&lt;br /&gt;
     rhs = recogniseE( tokens );&lt;br /&gt;
     return mkNode( op, lhs, rhs, 0 );&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* this is not working because if &amp;#039;tokens&amp;#039; is operation, this code will repeat forever.&lt;br /&gt;
 ParseTree* lhs = recogniseE( tokens );&lt;br /&gt;
* and if there is &amp;#039;(&amp;#039;, unless &amp;#039;)&amp;#039; is next character, program can&amp;#039;t find &amp;#039;)&amp;#039;, because code stop before find&amp;#039;)&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==discussion==&lt;br /&gt;
even just calculate(+ - * /), there are a lot of things to deal with to get a right answer.&lt;/div&gt;</summary>
		<author><name>Mark</name></author>
	</entry>
</feed>