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

		<summary type="html">&lt;p&gt;7 revision(s)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;So apparently, as provided, the parser recognises a grammar. Actually it just crashes if you try to run it, because the unimplemented functions don&amp;#039;t return anything. So I have to try to figure out how it&amp;#039;s meant to work before it will do anything. Fun.&lt;br /&gt;
&lt;br /&gt;
Right, I got some actual output using the code:&lt;br /&gt;
&amp;lt;pre&amp;gt;Tree* Stmt( TokenStream* tokens ) {&lt;br /&gt;
  if (isVariable(current(tokens))) {&lt;br /&gt;
	  Tree* var = mkNode0(current(tokens));&lt;br /&gt;
	  advance(tokens);&lt;br /&gt;
	  expect( tokens, TOK_ASSIGN );&lt;br /&gt;
	  return mkNode2(TOK_ASSIGN, var, Exp(tokens, 0));&lt;br /&gt;
  }&lt;br /&gt;
  error( &amp;quot;Bad statement&amp;quot; );&lt;br /&gt;
  return NULL;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Tree* StmtSeq( TokenStream* tokens ) {&lt;br /&gt;
  return Stmt(tokens);&lt;br /&gt;
}&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It only parses 1 statement, but at least it seems to work. I had to move the Tree* t declaration because someone was using a non-standard compiler when they wrote this *glare*.&lt;br /&gt;
&lt;br /&gt;
So I got multiple statements working. I don&amp;#039;t know what k;k;k was supposed to mean... It doesn&amp;#039;t seem to be in the grammar.&lt;br /&gt;
&lt;br /&gt;
So it looks like k is meant to be skip. Fixed that. I&amp;#039;m working on if statements and multiple statement groups, but the example input seems to be wrong. a&amp;gt;b is not a valid expression, there is no such binary operator as &amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Here&amp;#039;s my probably working code. I hope:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Tree* Stmt( TokenStream* tokens ) {&lt;br /&gt;
  Tree* A;&lt;br /&gt;
  Tree* B;&lt;br /&gt;
  if (eqToken(current(tokens), TOK_SKIP))&lt;br /&gt;
  {&lt;br /&gt;
	  advance(tokens);&lt;br /&gt;
	  return mkNode0(TOK_SKIP);&lt;br /&gt;
  }&lt;br /&gt;
  if (eqToken(current(tokens), TOK_OPENBRACE)) {&lt;br /&gt;
	  advance(tokens);&lt;br /&gt;
	  A = StmtSeq(tokens);&lt;br /&gt;
	  expect(tokens, TOK_CLOSEBRACE);&lt;br /&gt;
	  return A;&lt;br /&gt;
  }&lt;br /&gt;
  if (eqToken(current(tokens), TOK_IF)) {&lt;br /&gt;
	advance(tokens);&lt;br /&gt;
    A = Exp(tokens, 0);&lt;br /&gt;
	expect(tokens, TOK_THEN);&lt;br /&gt;
	B = Stmt(tokens);&lt;br /&gt;
	if (eqToken(current(tokens), TOK_ELSE)) {&lt;br /&gt;
		advance(tokens);&lt;br /&gt;
		return mkNode3(TOK_IF, A, B, Stmt(tokens));&lt;br /&gt;
	}&lt;br /&gt;
	return mkNode2(TOK_IF, A, B);&lt;br /&gt;
  }&lt;br /&gt;
  if (eqToken(current(tokens), TOK_WHILE)) {&lt;br /&gt;
	advance(tokens);&lt;br /&gt;
    A = Exp(tokens, 0);&lt;br /&gt;
	expect(tokens, TOK_DO);&lt;br /&gt;
	return mkNode2(TOK_WHILE, A, Stmt(tokens));&lt;br /&gt;
  }&lt;br /&gt;
  if (eqToken(current(tokens), TOK_PRINT)) {&lt;br /&gt;
	  advance(tokens);&lt;br /&gt;
	  return mkNode1(TOK_PRINT, Exp(tokens, 0));&lt;br /&gt;
  }&lt;br /&gt;
  if (isVariable(current(tokens))) {&lt;br /&gt;
	  A = mkNode0(current(tokens));&lt;br /&gt;
	  advance(tokens);&lt;br /&gt;
	  expect( tokens, TOK_ASSIGN );&lt;br /&gt;
	  return mkNode2(TOK_ASSIGN, A, Exp(tokens, 0));&lt;br /&gt;
  }&lt;br /&gt;
  return mkNode0(TOK_ERROR);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Tree* StmtSeq( TokenStream* tokens ) {&lt;br /&gt;
  Tree* statement = Stmt(tokens);&lt;br /&gt;
  if (eqToken(current(tokens), TOK_SEMICOLON)) {&lt;br /&gt;
    advance(tokens);&lt;br /&gt;
    return mkNode2(TOK_SEMICOLON, statement, StmtSeq(tokens));&lt;br /&gt;
  }&lt;br /&gt;
  return statement;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Spent a fair while discussing the three tasks with Braedon, trying to figure out how they go together. It looks like you can&amp;#039;t do task three without both task one and two, so I guess I&amp;#039;ll start on task 1.&lt;br /&gt;
&lt;br /&gt;
Update: Check out the tokeniser me and Braedon have been working on [[SE250:lab-9:dols008_2|here.]]&lt;/div&gt;</summary>
		<author><name>Mark</name></author>
	</entry>
</feed>