summaryrefslogtreecommitdiff
path: root/glcpp-parse.y
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2010-05-10 16:16:06 -0700
committerCarl Worth <cworth@cworth.org>2010-05-10 16:16:06 -0700
commit0b27b5f05191f07ed31e65ff07e5233672f3c33a (patch)
tree84c63c12942e748378d73ef734021f788f4cd569 /glcpp-parse.y
parent725c17a9266c1141508da623c8781412853b70e4 (diff)
Implment #define
By using the recently-imported hash_table implementation.
Diffstat (limited to 'glcpp-parse.y')
-rw-r--r--glcpp-parse.y49
1 files changed, 43 insertions, 6 deletions
diff --git a/glcpp-parse.y b/glcpp-parse.y
index a2d1094253..89dc46497f 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
;
+content: token
+ | directive
+ | content token
+ | content directive
+;
-tokens: token
- | tokens token
+directive: DEFINE IDENTIFIER DEFVAL {
+ hash_table_insert (parser->defines, $3, $2);
+}
;
-token: TOKEN
+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 @@ yyerror (void *scanner, const char *error)
{
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);
+}