Path: utzoo!utgpu!jarvis.csri.toronto.edu!rutgers!tut.cis.ohio-state.edu!brutus.cs.uiuc.edu!wuarchive!texbell!sugar!ficc!peter
From: peter@ficc.uu.net (Peter da Silva)
Newsgroups: comp.lang.misc
Subject: Re: What I'd really like to see in an if-statement...
Message-ID: <5669@ficc.uu.net>
Date: 14 Aug 89 12:01:37 GMT
References: <8577@batcomputer.tn.cornell.edu> <14251@haddock.ima.isc.com> <14278@haddock.ima.isc.com>
Organization: Xenix Support, FICC
Lines: 76

In article <14278@haddock.ima.isc.com>, karl@haddock.ima.isc.com (Karl Heuer) writes:
> Okay, then, here's one way to parse such constructs.  [ complex explanation
  of run-time evaluation of !a < b <= c! using pairs of values ]

Well, that's one way of implementing the run-time code. Doesn't say anything
about parsing it, though. Parsing is easy... in yacc you'd do something like
this:

boolean		: expression
		| boolean relop expression
		;

In a recursive-descent parser:

	parse_relop()	/* Called on seeing a relation operator */
	{
		while(is_relop(next_token)) {
			shift();
			expression();
		}
	}

Code generation, now. You want to end up with something like this:

For the expression !a < b <= c!...

	evaluate A
	evaluate B
	cmp A,B
	bge FAIL
	evaluate C, with A possibly scratched.
	cmp B,C
	ble SUCCEED
FAIL:	action on failure (go to end of if stmt, push 0, whatever)
	...
SUCCEED:action on success (may be inside if stmt, push 1, whatever)

For a stupid stack machine compiler, putting it in the RD parser above:

	parse_relop()
	{
		LABEL fail = genlab();
		LABEL succeed = genlab();
		LABEL end = genlab();

		while(1) {
			TOKEN saved;
			
			saved = next_token;
			shift();

			expression();

			if(is_relop(next_token)) {
				gen(SAVE_TOP); /* copies top under second */
				gen_branch(reverse_sense(saved), fail);
				continue;
			} else {
				gen_branch(saved, succeed);
				break;
			}
		}
		gen_target(fail);
		gen_push(FALSE);
		gen_branch(always, end);
		gen_target(succeed);
		gen_push(TRUE);
		gen_target(end);
	}

You will note that there is considerable room for optimisation :->.
-- 
Peter da Silva, Xenix Support, Ferranti International Controls Corporation.
Business: peter@ficc.uu.net, +1 713 274 5180. | "The sentence I am now
Personal: peter@sugar.hackercorp.com.   `-_-' |  writing is the sentence
Quote: Have you hugged your wolf today?  'U`  |  you are now reading"