shithub: scc

Download patch

ref: aea5de4f99d00f5ca4c7f7503be3208f9666e623
parent: 80244a46e09e3ce670be5c94ecc836659bff404c
author: Roberto E. Vargas Caballero <[email protected]>
date: Tue Jun 12 17:06:16 EDT 2012

Add ahead function

This function is needed in order to can look ahead one token without lose
the actual one.

--- a/lex.c
+++ b/lex.c
@@ -12,6 +12,7 @@
 
 static FILE *yyin;
 union yyval yyval;
+static unsigned char aheadtok = NOTOK;
 unsigned char yytoken;
 unsigned char yyhash;
 char yytext[TOKSIZ_MAX + 1];
@@ -132,32 +133,46 @@
 {
 	register unsigned char c;
 
-	if (!skip()) {
-		c = EOFTOK;
+	if (aheadtok != NOTOK) {
+		yytoken = aheadtok;
+		aheadtok = NOTOK;
+	} else if (!skip()) {
+		yytoken = EOFTOK;
 	} else if (isalpha(c = getc(yyin)) || c == '_') {
 		ungetc(c, yyin);
-		c = iden();
+		yytoken = iden();
 	} else if (isdigit(c)) {
 		ungetc(c, yyin);
-		c = number();
+		yytoken = number();
 	} else {
 		switch (c) {
-		case '=': c = follow('=', EQ, 0); break;
-		case '^': c = follow('^', XOR_EQ, 0); break;
-		case '*': c = follow('*', MUL_EQ, 0); break;
-		case '!': c = follow('!', NE, 0); break;
-		case '+': c = follow('+', ADD_EQ, INC); break;
-		case '&': c = follow('&', AND_EQ, AND); break;
-		case '|': c = follow('|', OR_EQ, OR); break;
-		case '<': c = rel_shift('<'); break;
-		case '>': c = rel_shift('>'); break;
-		case '-': c = minus(); break;
+		case '=': yytoken = follow('=', EQ, 0); break;
+		case '^': yytoken = follow('^', XOR_EQ, 0); break;
+		case '*': yytoken = follow('*', MUL_EQ, 0); break;
+		case '!': yytoken = follow('!', NE, 0); break;
+		case '+': yytoken = follow('+', ADD_EQ, INC); break;
+		case '&': yytoken = follow('&', AND_EQ, AND); break;
+		case '|': yytoken = follow('|', OR_EQ, OR); break;
+		case '<': yytoken = rel_shift('<'); break;
+		case '>': yytoken = rel_shift('>'); break;
+		case '-': yytoken = minus(); break;
+		default: yytoken = c;
 		}
 	}
-	return yytoken = c;
 }
 
-char accept(unsigned char tok)
+unsigned char ahead(void)
+{
+	static unsigned char oldtok;
+
+	oldtok = yytoken;
+	next();
+	aheadtok = yytoken;
+	yytoken = oldtok;
+	return aheadtok;
+}
+
+char accept(register unsigned char tok)
 {
 	if (yytoken == tok) {
 		next();
--- a/tokens.h
+++ b/tokens.h
@@ -29,7 +29,7 @@
 	XOR_EQ, OR_EQ, LSHIFT_EQ, RSHIFT_EQ,
 	TYPE_NAME, ELLIPSIS,
 	CASE, DEFAULT, IF, ELSE, SWITCH, WHILE, DO, FOR, GOTO,
-	CONTINUE, BREAK, RETURN, EOFTOK
+	CONTINUE, BREAK, RETURN, EOFTOK, NOTOK
 };
 
 
@@ -52,4 +52,5 @@
 extern char accept(unsigned char tok);
 extern void expect(unsigned char tok);
 extern void init_keywords(void);
+extern unsigned char ahead(void);
 #endif