shithub: scc

Download patch

ref: 3134fea3e8d461d77eb23d8f91291e985f28d4ba
parent: 5e5442e6bf058c1f8b7b9674ae008670cdadeae2
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Thu Mar 27 17:13:37 EDT 2014

Refactorize operator function in lex.c

This new version is more readable and clear than previous

--- a/lex.c
+++ b/lex.c
@@ -165,48 +165,17 @@
 }
 
 static uint8_t
-follow(uint8_t op, uint8_t eq, uint8_t rep)
+follow(int expect, int ifyes, int ifno)
 {
 	register int c = getc(yyin);
 
-	yybuf[1] = c;
-	yybuf[2] = '\0';
-	if (c == '=')
-		return eq;
-	else if (c == op && rep)
-		return rep;
-
-	yybuf[1] = '\0';
-	ungetc(c, yyin);
-	return op;
-}
-
-static uint8_t
-rel_shift(uint8_t op)
-{
-	static uint8_t tokens[2][3] = {
-		{GE, SHL, SHL_EQ},
-		{LE, SHR, SHR_EQ}
-	};
-	register int c = getc(yyin);
-	register char *tp = tokens[op == '>'];
-
-	yybuf[1] = c;
-	yybuf[2] = '\0';
-	if (c == '=') {
-		return tp[0];
-	} else if (c == op) {
-		if ((c = getc(yyin)) == '=')  {
-			yybuf[2] = c;
-			yybuf[3] = '\0';
-			return tp[2];
-		}
-		op = tp[1];
-	} else {
-		yybuf[1] = '\0';
+	if (c == expect) {
+		yybuf[1] = c;
+		yybuf[2] = 0;
+		return ifyes;
 	}
 	ungetc(c, yyin);
-	return op;
+	return ifno;
 }
 
 static uint8_t
@@ -227,6 +196,23 @@
 }
 
 static uint8_t
+relational(uint8_t op, uint8_t equal, uint8_t shift, uint8_t assig)
+{
+	register int c = getc(yyin);
+
+	yybuf[1] = c;
+	yybuf[2] = '\0';
+
+	if (c == '=')
+		return equal;
+	if (c == op)
+		return follow('=', assig, shift);
+	ungetc(c, yyin);
+	yybuf[1] = '\0';
+	return op;
+}
+
+static uint8_t
 operator(void)
 {
 	register uint8_t c = getc(yyin);
@@ -234,15 +220,15 @@
 	yybuf[0] = c;
 	yybuf[1] = '\0';
 	switch (c) {
-	case '=': return follow('=', EQ, 0);
-	case '^': return follow('^', XOR_EQ, 0);
-	case '*': return follow('*', MUL_EQ, 0);
-	case '!': return follow('!', NE, 0);
-	case '+': return follow('+', ADD_EQ, INC);
-	case '&': return follow('&', AND_EQ, AND);
-	case '|': return follow('|', OR_EQ, OR);
-	case '<': return rel_shift('<');
-	case '>': return rel_shift('>');
+	case '<': return relational('<', LE, SHL, SHL_EQ);
+	case '>': return relational('>', GE, SHR, SHR_EQ);
+	case '+': return follow('+', INC, follow('=', ADD_EQ, '+'));
+	case '=': return follow('=', EQ, '=');
+	case '^': return follow('=', XOR_EQ, '^');
+	case '*': return follow('=', MUL_EQ, '*');
+	case '!': return follow('=', NE, '!');
+	case '&': return follow('=', AND_EQ, AND);
+	case '|': return follow('=', OR_EQ, OR);
 	case '-': return minus();
 	default: return c;
 	}
--