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

		<summary type="html">&lt;p&gt;12 revision(s)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== It&amp;#039;s done!!! ==&lt;br /&gt;
*Including this lab, I think that making a programme needs about 90% thinking and 10% computer work.&lt;br /&gt;
*My plan was doing all 3 options but only this option was completed so far.&lt;br /&gt;
*This lab requires quite a lot of time but it was worth.&lt;br /&gt;
&lt;br /&gt;
===Understanding mkNode funciton===&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;#039;http://daniel.hosting.paran.com/250_9_1.jpg&amp;#039;&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Understanding Exp and p funcitons===&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;#039;http://daniel.hosting.paran.com/250_9_3.jpg&amp;#039;&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Understanding Parse structure===&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;#039;http://daniel.hosting.paran.com/250_9_2.jpg&amp;#039;&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== code ==&lt;br /&gt;
=== add two more tokens ===&lt;br /&gt;
*tokenise.c&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  Token TOK_BT              = &amp;#039;&amp;gt;&amp;#039;;&lt;br /&gt;
  Token TOK_LT              = &amp;#039;&amp;lt;&amp;#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*tokenise.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  extern Token TOK_BT;&lt;br /&gt;
  extern Token TOK_LT;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*parse.c&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BinOp* lookupBinOp( Token tok ) {&lt;br /&gt;
  static BinOp ops[] = {&lt;br /&gt;
    { &amp;amp;TOK_EQ,   2, RIGHT_ASSOC },&lt;br /&gt;
   &lt;br /&gt;
    //added&lt;br /&gt;
    { &amp;amp;TOK_BT,   2, RIGHT_ASSOC },&lt;br /&gt;
    { &amp;amp;TOK_LT,   2, RIGHT_ASSOC },&lt;br /&gt;
&lt;br /&gt;
    { &amp;amp;TOK_ADD,  3, LEFT_ASSOC  },&lt;br /&gt;
    { &amp;amp;TOK_SUB,  3, LEFT_ASSOC  },&lt;br /&gt;
    { &amp;amp;TOK_MUL,  4, LEFT_ASSOC  },&lt;br /&gt;
    { &amp;amp;TOK_DIV,  4, LEFT_ASSOC  },&lt;br /&gt;
    { 0 }&lt;br /&gt;
  };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===add lookupStmtOp function to define the rules for Stmt===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
typedef&lt;br /&gt;
struct {&lt;br /&gt;
  Token* tok1;&lt;br /&gt;
  Token* tok2;&lt;br /&gt;
  Token* tok3;&lt;br /&gt;
} StmtOp;&lt;br /&gt;
&lt;br /&gt;
StmtOp* lookupStmtOp( Token tok ) {&lt;br /&gt;
  static StmtOp ops[] = {&lt;br /&gt;
    { &amp;amp;TOK_IF, &amp;amp;TOK_THEN, &amp;amp;TOK_ELSE },&lt;br /&gt;
    { &amp;amp;TOK_WHILE, &amp;amp;TOK_DO, 0 },&lt;br /&gt;
    { 0 }&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  StmtOp* p;&lt;br /&gt;
  for( p = ops; p-&amp;gt;tok1 != 0; p++ )&lt;br /&gt;
    if( eqToken( tok, *p-&amp;gt;tok1 ) )&lt;br /&gt;
      return p;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===create Stmt, StmtSeq functions===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Tree* Stmt( TokenStream* tokens ) {&lt;br /&gt;
  Token n = current( tokens );&lt;br /&gt;
  StmtOp* op = lookupStmtOp( n );&lt;br /&gt;
  advance( tokens );&lt;br /&gt;
&lt;br /&gt;
  if (op != 0) {&lt;br /&gt;
    Tree* parser1 = Exp( tokens, 0 );&lt;br /&gt;
    expect(tokens, *op-&amp;gt;tok2);&lt;br /&gt;
    Tree* parser2 = Stmt( tokens );&lt;br /&gt;
    if(( op-&amp;gt;tok3 == 0) || (!eqToken(*op-&amp;gt;tok3, current(tokens))))&lt;br /&gt;
      return mkNode2( n, parser1, parser2 );&lt;br /&gt;
    else{&lt;br /&gt;
      advance( tokens );&lt;br /&gt;
      Tree* parser3 = Exp( tokens, 0 );&lt;br /&gt;
      return mkNode3( n, parser1, parser2, parser3 );&lt;br /&gt;
    }&lt;br /&gt;
  } else if (eqToken( n, TOK_OPENBRACE)) {&lt;br /&gt;
    Tree* t = StmtSeq( tokens );&lt;br /&gt;
    expect( tokens , TOK_CLOSEBRACE );&lt;br /&gt;
    return t;&lt;br /&gt;
  } else if ((isVariable(n)) &amp;amp;&amp;amp; (eqToken(current(tokens), TOK_ASSIGN))) {&lt;br /&gt;
    Token m = current( tokens );&lt;br /&gt;
    advance( tokens );&lt;br /&gt;
    Tree* t = mkNode0(n);&lt;br /&gt;
    return mkNode2( m, t, Exp( tokens, 0 ));&lt;br /&gt;
  } else if ( eqToken( n, TOK_SKIP ) ) {&lt;br /&gt;
    return mkNode0( n );&lt;br /&gt;
  } else&lt;br /&gt;
    error(&amp;quot;no rules are applied in S parse&amp;quot;);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Tree* StmtSeq( TokenStream* tokens ) {&lt;br /&gt;
  Tree* t = Stmt( tokens );&lt;br /&gt;
  if (eqToken(current(tokens), TOK_SEMICOLON)) {&lt;br /&gt;
    Token n = current( tokens );&lt;br /&gt;
    advance( tokens);&lt;br /&gt;
    t = mkNode2(n, t, StmtSeq(tokens));&lt;br /&gt;
  }&lt;br /&gt;
  return t;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==result==&lt;br /&gt;
===result from Linux(ubuntu)===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gcc tokenise.c parser.c -o parser&amp;amp;&amp;amp; ./parser&lt;br /&gt;
Parse(&amp;quot;a=1&amp;quot;):&lt;br /&gt;
	=(a 1)&lt;br /&gt;
	a 1 =2&lt;br /&gt;
Parse(&amp;quot;a=1;b=2;k;k;k&amp;quot;):&lt;br /&gt;
	;(=(a 1) ;(=(b 2) ;(k ;(k k))))&lt;br /&gt;
	a 1 =2 b 2 =2 k k k ;2 ;2 ;2 ;2&lt;br /&gt;
Parse(&amp;quot;ia&amp;gt;btwtda=a*2ek&amp;quot;):&lt;br /&gt;
	i(&amp;gt;(a b) w(t =(a *(a 2))) k)&lt;br /&gt;
	a b &amp;gt;2 t a a 2 *2 =2 w2 k i3&lt;br /&gt;
Parse(&amp;quot;ict{x=1;wtda=a*2}ek&amp;quot;):&lt;br /&gt;
	i(c ;(=(x 1) w(t =(a *(a 2)))) k)&lt;br /&gt;
	c x 1 =2 t a a 2 *2 =2 w2 ;2 k i3&lt;br /&gt;
Parse(&amp;quot;junk that won&amp;#039;t parse&amp;quot;):&lt;br /&gt;
	no rules are applied in S parse&lt;br /&gt;
Incomplete parse&lt;br /&gt;
&amp;lt;###&amp;gt;&lt;br /&gt;
	&amp;lt;###&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compilation finished at Mon Jun  2 20:25:18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===results by diagram===&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;#039;http://daniel.hosting.paran.com/250_9_4.jpg&amp;#039;&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Discussion ==&lt;br /&gt;
*I think that, to learning or creating a programme, programmers should have some special ways to explain the codes&lt;br /&gt;
*Because the codes we are going to deal with are not be able to fully understand by just reading&lt;br /&gt;
*Understanding the theory, creating the codes based on theory... Programming is getting harder but more exciting.&lt;/div&gt;</summary>
		<author><name>Mark</name></author>
	</entry>
</feed>