SE250:lab-9:npit006:tokeniser.c

From Marks Wiki
Revision as of 05:20, 3 November 2008 by Mark (Sọ̀rọ̀ | contribs) (5 revision(s))
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <assert.h>
#include <stdio.h>
#include <ctype.h>
#include "tokenise.h"


/*
  ============
  Token stream
  ============
 */

void init_TokenStream( TokenStream* tokens, char* input ) {
  //*tokens = input;
}

bool eqToken( Token a, Token b ) {
	if (a.type!=b.type){
		return false;
	}

	switch (a.type){
		case T_FLOAT:
			if (a.val.fltval==b.val.fltval){ 
				return true;
			}
 			break;
		case T_INTEGER:
			if (a.val.intval==b.val.intval){
				return true;
			}
		default:
			if (a.val.strval==b.val.strval){
				return true;
			}
	}
}

Token current( TokenStream* tokens ) {
  return **tokens;
}

void advance( TokenStream* tokens ) {
 //(*tokens)++;

 (*tokens)+=8;
 
}

bool end_of_tokens( TokenStream* tokens ) {
  return current( tokens ).val.strval == '\0';
}

bool isVariable( Token tok ) {
 	// THIS FUNCTION SUCKS
	// return isalpha( tok );

	if (tok.type==T_IDENT){
		return true;
	}else{
		return false;
	}
}

bool isConstant( Token tok ) {
	if (tok.type==T_INTEGER){
		return tok.val.intval;
	}
	if (tok.type==T_FLOAT){
		return tok.val.fltval;
	}



  //return isdigit( tok );
}


void print_token( Token tok ) {
	
	
	if (tok.type==T_INTEGER){
		printf( "%d", tok.val.intval );
	}else if (tok.type==T_FLOAT){
		printf( "%f", tok.val.fltval );
	}else{
		printf( "%s", tok.val.strval );
	}

	//printf( "%c", tok );
}


void expect( TokenStream* tokens, Token expected ) {
  if( eqToken( current( tokens ), expected ) )
    advance( tokens );
  else {
    error( "Expected '%c', but found '%c', near \"%.40s\"",
           expected,
           current( tokens ),
           *tokens );
  }
}


void init_predefined_tokens( ) {
TOK_ADD.type = T_SYMBOL;
	TOK_ADD.val.strval = "+";

	TOK_ASSIGN.type = T_SYMBOL;
	TOK_ASSIGN.val.strval = "=";

	TOK_CLOSEBRACE.type = T_SYMBOL;
	TOK_CLOSEBRACE.val.strval = "}";

	TOK_DIV.type = T_SYMBOL;
	TOK_DIV.val.strval = "/";

	TOK_DO.type = T_SYMBOL;
	TOK_DO.val.strval = "d";

	TOK_ELSE.type = T_SYMBOL;
	TOK_ELSE.val.strval = "e";

	TOK_EQ.type = T_SYMBOL;
	TOK_EQ.val.strval = "=";

	TOK_ERROR.type = T_SYMBOL;
	TOK_ERROR.val.strval = "#";

 	TOK_IF.type = T_SYMBOL;
	TOK_IF.val.strval = "i";

	TOK_MUL.type = T_SYMBOL;
	TOK_MUL.val.strval = "*";

	TOK_NOT.type = T_SYMBOL;
	TOK_NOT.val.strval = "!";

	TOK_OPENBRACE.type = T_SYMBOL;
	TOK_OPENBRACE.val.strval = "{";

	TOK_PCLOSE.type = T_SYMBOL;
	TOK_PCLOSE.val.strval = ")";

	TOK_POPEN.type = T_SYMBOL;
	TOK_POPEN.val.strval = "(";

	TOK_PRINT.type = T_SYMBOL;
	TOK_PRINT.val.strval = "p";

	TOK_SEMICOLON.type = T_SYMBOL;
	TOK_SEMICOLON.val.strval = ";";
 
	TOK_SKIP.type = T_SYMBOL;
	TOK_SKIP.val.strval = "k";

	TOK_SUB.type = T_SYMBOL;
	TOK_SUB.val.strval = "-";

	TOK_THEN.type = T_SYMBOL;
	TOK_THEN.val.strval = "t";

	TOK_WHILE.type = T_SYMBOL;
	TOK_WHILE.val.strval = "w";	

}

	


void error( char* fmt, ... ) {
  va_list args;
  va_start( args, fmt );
  vprintf( fmt, args );

 va_end( args );
 printf( "\n" );
}


void test_tokeniser( char* str ) {
  TokenStream tokens;
  init_TokenStream( &tokens, str );
  for( ; ! end_of_tokens( &tokens ); advance( &tokens ) ) {
    print_token( current( &tokens ) );
    printf( "\n" );
  }
}