<?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%3Anpit006%3Atokeniser.c</id>
	<title>SE250:lab-9:npit006:tokeniser.c - 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%3Anpit006%3Atokeniser.c"/>
	<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-9:npit006:tokeniser.c&amp;action=history"/>
	<updated>2026-09-16T13:42:06Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wiki.kram.nz/index.php?title=SE250:lab-9:npit006:tokeniser.c&amp;diff=8645&amp;oldid=prev</id>
		<title>Mark: 5 revision(s)</title>
		<link rel="alternate" type="text/html" href="https://wiki.kram.nz/index.php?title=SE250:lab-9:npit006:tokeniser.c&amp;diff=8645&amp;oldid=prev"/>
		<updated>2008-11-03T05:20:36Z</updated>

		<summary type="html">&lt;p&gt;5 revision(s)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt; #include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdarg.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;string.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;assert.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;ctype.h&amp;gt;&lt;br /&gt;
 #include &amp;quot;tokenise.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 /*&lt;br /&gt;
   ============&lt;br /&gt;
   Token stream&lt;br /&gt;
   ============&lt;br /&gt;
  */&lt;br /&gt;
 &lt;br /&gt;
 void init_TokenStream( TokenStream* tokens, char* input ) {&lt;br /&gt;
   //*tokens = input;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 bool eqToken( Token a, Token b ) {&lt;br /&gt;
 	if (a.type!=b.type){&lt;br /&gt;
 		return false;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	switch (a.type){&lt;br /&gt;
 		case T_FLOAT:&lt;br /&gt;
 			if (a.val.fltval==b.val.fltval){ &lt;br /&gt;
 				return true;&lt;br /&gt;
 			}&lt;br /&gt;
  			break;&lt;br /&gt;
 		case T_INTEGER:&lt;br /&gt;
 			if (a.val.intval==b.val.intval){&lt;br /&gt;
 				return true;&lt;br /&gt;
 			}&lt;br /&gt;
 		default:&lt;br /&gt;
 			if (a.val.strval==b.val.strval){&lt;br /&gt;
 				return true;&lt;br /&gt;
 			}&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 Token current( TokenStream* tokens ) {&lt;br /&gt;
   return **tokens;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void advance( TokenStream* tokens ) {&lt;br /&gt;
  //(*tokens)++;&lt;br /&gt;
 &lt;br /&gt;
  (*tokens)+=8;&lt;br /&gt;
  &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 bool end_of_tokens( TokenStream* tokens ) {&lt;br /&gt;
   return current( tokens ).val.strval == &amp;#039;\0&amp;#039;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 bool isVariable( Token tok ) {&lt;br /&gt;
  	// THIS FUNCTION SUCKS&lt;br /&gt;
 	// return isalpha( tok );&lt;br /&gt;
 &lt;br /&gt;
 	if (tok.type==T_IDENT){&lt;br /&gt;
 		return true;&lt;br /&gt;
 	}else{&lt;br /&gt;
 		return false;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 bool isConstant( Token tok ) {&lt;br /&gt;
 	if (tok.type==T_INTEGER){&lt;br /&gt;
 		return tok.val.intval;&lt;br /&gt;
 	}&lt;br /&gt;
 	if (tok.type==T_FLOAT){&lt;br /&gt;
 		return tok.val.fltval;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
   //return isdigit( tok );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void print_token( Token tok ) {&lt;br /&gt;
 	&lt;br /&gt;
 	&lt;br /&gt;
 	if (tok.type==T_INTEGER){&lt;br /&gt;
 		printf( &amp;quot;%d&amp;quot;, tok.val.intval );&lt;br /&gt;
 	}else if (tok.type==T_FLOAT){&lt;br /&gt;
 		printf( &amp;quot;%f&amp;quot;, tok.val.fltval );&lt;br /&gt;
 	}else{&lt;br /&gt;
 		printf( &amp;quot;%s&amp;quot;, tok.val.strval );&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	//printf( &amp;quot;%c&amp;quot;, tok );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void expect( TokenStream* tokens, Token expected ) {&lt;br /&gt;
   if( eqToken( current( tokens ), expected ) )&lt;br /&gt;
     advance( tokens );&lt;br /&gt;
   else {&lt;br /&gt;
     error( &amp;quot;Expected &amp;#039;%c&amp;#039;, but found &amp;#039;%c&amp;#039;, near \&amp;quot;%.40s\&amp;quot;&amp;quot;,&lt;br /&gt;
            expected,&lt;br /&gt;
            current( tokens ),&lt;br /&gt;
            *tokens );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void init_predefined_tokens( ) {&lt;br /&gt;
 TOK_ADD.type = T_SYMBOL;&lt;br /&gt;
 	TOK_ADD.val.strval = &amp;quot;+&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 	TOK_ASSIGN.type = T_SYMBOL;&lt;br /&gt;
 	TOK_ASSIGN.val.strval = &amp;quot;=&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 	TOK_CLOSEBRACE.type = T_SYMBOL;&lt;br /&gt;
 	TOK_CLOSEBRACE.val.strval = &amp;quot;}&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 	TOK_DIV.type = T_SYMBOL;&lt;br /&gt;
 	TOK_DIV.val.strval = &amp;quot;/&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 	TOK_DO.type = T_SYMBOL;&lt;br /&gt;
 	TOK_DO.val.strval = &amp;quot;d&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 	TOK_ELSE.type = T_SYMBOL;&lt;br /&gt;
 	TOK_ELSE.val.strval = &amp;quot;e&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 	TOK_EQ.type = T_SYMBOL;&lt;br /&gt;
 	TOK_EQ.val.strval = &amp;quot;=&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 	TOK_ERROR.type = T_SYMBOL;&lt;br /&gt;
 	TOK_ERROR.val.strval = &amp;quot;#&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
  	TOK_IF.type = T_SYMBOL;&lt;br /&gt;
 	TOK_IF.val.strval = &amp;quot;i&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 	TOK_MUL.type = T_SYMBOL;&lt;br /&gt;
 	TOK_MUL.val.strval = &amp;quot;*&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 	TOK_NOT.type = T_SYMBOL;&lt;br /&gt;
 	TOK_NOT.val.strval = &amp;quot;!&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 	TOK_OPENBRACE.type = T_SYMBOL;&lt;br /&gt;
 	TOK_OPENBRACE.val.strval = &amp;quot;{&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 	TOK_PCLOSE.type = T_SYMBOL;&lt;br /&gt;
 	TOK_PCLOSE.val.strval = &amp;quot;)&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 	TOK_POPEN.type = T_SYMBOL;&lt;br /&gt;
 	TOK_POPEN.val.strval = &amp;quot;(&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 	TOK_PRINT.type = T_SYMBOL;&lt;br /&gt;
 	TOK_PRINT.val.strval = &amp;quot;p&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 	TOK_SEMICOLON.type = T_SYMBOL;&lt;br /&gt;
 	TOK_SEMICOLON.val.strval = &amp;quot;;&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
 	TOK_SKIP.type = T_SYMBOL;&lt;br /&gt;
 	TOK_SKIP.val.strval = &amp;quot;k&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 	TOK_SUB.type = T_SYMBOL;&lt;br /&gt;
 	TOK_SUB.val.strval = &amp;quot;-&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 	TOK_THEN.type = T_SYMBOL;&lt;br /&gt;
 	TOK_THEN.val.strval = &amp;quot;t&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 	TOK_WHILE.type = T_SYMBOL;&lt;br /&gt;
 	TOK_WHILE.val.strval = &amp;quot;w&amp;quot;;	&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 	&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void error( char* fmt, ... ) {&lt;br /&gt;
   va_list args;&lt;br /&gt;
   va_start( args, fmt );&lt;br /&gt;
   vprintf( fmt, args );&lt;br /&gt;
 &lt;br /&gt;
  va_end( args );&lt;br /&gt;
  printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 void test_tokeniser( char* str ) {&lt;br /&gt;
   TokenStream tokens;&lt;br /&gt;
   init_TokenStream( &amp;amp;tokens, str );&lt;br /&gt;
   for( ; ! end_of_tokens( &amp;amp;tokens ); advance( &amp;amp;tokens ) ) {&lt;br /&gt;
     print_token( current( &amp;amp;tokens ) );&lt;br /&gt;
     printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Mark</name></author>
	</entry>
</feed>