Implment #define

By using the recently-imported hash_table implementation.
diff --git a/glcpp-parse.y b/glcpp-parse.y
index a2d1094..89dc464 100644
--- a/glcpp-parse.y
+++ b/glcpp-parse.y
@@ -27,30 +27,46 @@
 
 #include "glcpp.h"
 
-#define YYSTYPE int
+#define YYLEX_PARAM parser->scanner
 
 void
 yyerror (void *scanner, const char *error);
 
 %}
 
-%parse-param {void *scanner}
+%parse-param {glcpp_parser_t *parser}
 %lex-param {void *scanner}
 
+%token DEFINE
+%token DEFVAL
+%token IDENTIFIER
 %token TOKEN
 
 %%
 
 input:		/* empty */
-	|	tokens
+	|	content
 ;
 
-
-tokens:		token
-	|	tokens token
+content:	token
+	|	directive
+	|	content token
+	|	content directive
 ;
 
-token:		TOKEN
+directive:	DEFINE IDENTIFIER DEFVAL {
+	hash_table_insert (parser->defines, $3, $2);
+}
+;
+
+token:		TOKEN {
+	char *value = hash_table_find (parser->defines, $1);
+	if (value)
+		printf ("%s", value);
+	else
+		printf ("%s", $1);
+	free ($1);
+}
 ;
 
 %%
@@ -60,3 +76,24 @@
 {
 	fprintf (stderr, "Parse error: %s\n", error);
 }
+
+void
+glcpp_parser_init (glcpp_parser_t *parser)
+{
+	yylex_init (&parser->scanner);
+	parser->defines = hash_table_ctor (32, hash_table_string_hash,
+					   hash_table_string_compare);
+}
+
+int
+glcpp_parser_parse (glcpp_parser_t *parser)
+{
+	return yyparse (parser);
+}
+
+void
+glcpp_parser_fini (glcpp_parser_t *parser)
+{
+	yylex_destroy (parser->scanner);
+	hash_table_dtor (parser->defines);
+}