diff lwbasic/parser.c @ 34:bfea77812e64

Start of assignment code
author Lost Wizard (lost@starbug3)
date Fri, 04 Feb 2011 21:27:03 -0700
parents 890a8f688889
children cdb0175e1063
line wrap: on
line diff
--- a/lwbasic/parser.c	Thu Feb 03 22:15:57 2011 -0700
+++ b/lwbasic/parser.c	Fri Feb 04 21:27:03 2011 -0700
@@ -31,6 +31,13 @@
 #include "lwbasic.h"
 #include "symtab.h"
 
+static void expect(cstate *state, int tt)
+{
+	if (state -> lexer_token != tt)
+		lwb_error("Expecting %s, got %s\n", lexer_token_name(tt), lexer_return_token(state));
+	lexer(state);
+}
+
 
 /* size of a type */
 static int sizeof_type(int type)
@@ -98,11 +105,57 @@
 			
 			lw_free(vn);
 			break;
+		
+		/* blank lines allowed */
+		case token_eol:
+			break;
+			
 		default:
 			return;
 		}
 		if (state -> lexer_token != token_eol)
-			lwb_error("Expecting end of line; got %s", lexer_return_token(state));
+			lwb_error("Expecting end of line; got %s\n", lexer_return_token(state));
+		lexer(state);
+	}
+}
+
+static void parse_statements(cstate *state)
+{
+	symtab_entry_t *se;
+	
+	for (;;)
+	{
+		switch (state -> lexer_token)
+		{
+		/* blank lines allowed */
+		case token_eol:
+			break;
+		
+		/* variable assignment */
+		case token_identifier:
+			se = symtab_find(state -> local_syms, state -> lexer_token_string);
+			if (!se)
+			{
+				se = symtab_find(state -> global_syms, state -> lexer_token_string);
+			}
+			if (!se)
+				lwb_error("Unknown variable %s\n", state -> lexer_token_string);
+			lexer(state);
+			expect(state, token_op_assignment);
+
+			/* parse the expression */
+			/* parse_expression(state); */
+			
+			/* actually do the assignment */
+			
+			break;
+		
+		/* anything we don't recognize as a statement token breaks out */
+		default:
+			return;
+		}
+		if (state -> lexer_token != token_eol)
+			lwb_error("Expecting end of line; got %s\n", lexer_return_token(state));
 		lexer(state);
 	}
 }
@@ -229,7 +282,7 @@
 	emit_prolog(state, vis);
 	
 	/* parse statement block  */
-	/* parse_statements(state); */
+	parse_statements(state);
 	
 	if (issub)
 	{