SE250:lab-9:sdal039
comiler... ok so we need a different function (perhaps) for each thing we want to do. Load idents, strings, perform operations, evaluate statements.
and now there's a whole heap of undefined references
cygdrive/c/Users/sdal039/AppData/Local/Temp/ccDd1mQd.o:parser.c:(.text+0x202): undefined reference to `_end_of_tokens' /cygdrive/c/Users/sdal039/AppData/Local/Temp/ccDd1mQd.o:parser.c:(.text+0x212): undefined reference to `_error' /cygdrive/c/Users/sdal039/AppData/Local/Temp/ccDd1mQd.o:parser.c:(.text+0x240): undefined reference to `_current' /cygdrive/c/Users/sdal039/AppData/Local/Temp/ccDd1mQd.o:parser.c:(.text+0x2a6): undefined reference to `_advance'
and so on...
aha.. toy tokeniser is up now. errors gone.
ok this is stupidly hard :P code so far:
static int strCount = 0;
void identifiers( Tree* pTree )
 {
      if (pTree != 0) {
	  if (isVariable( pTree->name )) {    //variable assignment
	      printf(".globl %c\n\t%c .long 0\n", pTree->name, pTree->name );
	  }
	  if (isConstant( pTree->name )) {   //string assignment
	      printf("S%d:\n\t.ascii \"%c\"\n", strCount, pTree->name);
	      strCount++;
	  }
     }
     int i;
     for (i = 0; i < pTree->arity ; i++)
	  identifiers( pTree->arg[i] );
}
Well it does do something.. given the token stream 'a=1' it outputs
.globl a a .long 0 S0: .ascii "1"
adding two numbers...
Tree* compile(Tree* t) 
{
   if (t != 0) {
	if (eqToken( t->name, TOK_ADD )) {//addition
		Tree* left = compile( t->arg[0] );//get first opperand
		Tree* right = compile( t->arg[1] );//get second opperand
		printf("pop\%%c\npop\%%c\nadd \%%c, \%%c\npush\%%c", left->name, right->name,  right->name, left->name, left->name);
	    }
   }
	return t;
}
segmentation fault...yaaaayyyy. >_<
What makes this task hard is that without proper implementations of the tokeniser and parse tree it's really hard to write. toy-tokeniser doesn't really allow you to test things, similarly with the parse tree. for example, it can't easily differentiate between a variable 'i' and and if statement as it tokenises ifs to just 'i'. Can't represent quoted strings either as each token is simply 1 character.
Mark suggested doing these three tasks (or at least the first two) over two/three separate labs, in the order than they are used. this would make it easier at each stage and at the end we'd have a pretty solid parser with everyone working on one bit at a time.