diff options
author | Rafael G. Martins <rafael@rafaelmartins.eng.br> | 2015-04-17 01:47:41 -0300 |
---|---|---|
committer | Rafael G. Martins <rafael@rafaelmartins.eng.br> | 2015-04-17 01:47:41 -0300 |
commit | 047e4e3753c597628024847a524d44ca67fa1382 (patch) | |
tree | 8c0d63ecd8d395815a4eee155c2ce6283e0e7fab /src/source-grammar.leg | |
parent | f5da9cc42acc79d7dda78e57fab8a1b8d7aa6a7d (diff) | |
download | blogc-047e4e3753c597628024847a524d44ca67fa1382.tar.gz blogc-047e4e3753c597628024847a524d44ca67fa1382.tar.bz2 blogc-047e4e3753c597628024847a524d44ca67fa1382.zip |
replaced leg-based parser with handmade parser for source files
Diffstat (limited to 'src/source-grammar.leg')
-rw-r--r-- | src/source-grammar.leg | 116 |
1 files changed, 0 insertions, 116 deletions
diff --git a/src/source-grammar.leg b/src/source-grammar.leg deleted file mode 100644 index faab9a4..0000000 --- a/src/source-grammar.leg +++ /dev/null @@ -1,116 +0,0 @@ -# -# blogc: A balde compiler. -# Copyright (C) 2015 Rafael G. Martins <rafael@rafaelmartins.eng.br> -# -# This program can be distributed under the terms of the BSD License. -# See the file COPYING. -# - -%{ - -#include <stdio.h> -#include "utils/utils.h" -#include "source-grammar.h" - -#define YY_INPUT(buf, result, max_size) \ -{ \ - int yyc = (charbuf && *charbuf != '\0') ? *charbuf++ : EOF; \ - result = (EOF == yyc) ? 0 : (*buf = yyc, 1); \ -} - - -static b_trie_t *config = NULL; -static const char *charbuf = NULL; -static char *key = NULL; -static char *content = NULL; - - -static void -blogc_source_config_key(const char *value) -{ - if (key != NULL) { - fprintf(stderr, "Syntax error: configuration key already set: %s\n", key); - exit(1); - } - key = b_strdup(value); -} - - -static void -blogc_source_config_value(const char *value) -{ - if (key == NULL) { - fprintf(stderr, "Syntax error: configuration value without a key: %s\n", value); - exit(1); - } - b_trie_insert(config, key, b_str_strip(b_strdup(value))); - free(key); - key = NULL; -} - - -static void -blogc_source_content(const char *value) -{ - if (content != NULL) { - fprintf(stderr, "Syntax error: content set twice\n"); - exit(1); - } - content = b_strdup(value); -} - -%} - -page = ( ( - eol )* ( config ( - eol )* )+ '----' '-'* eol content eof ) | anything - { fprintf(stderr, "Syntax error near: %s\n", yytext); exit(1); } - -# Useful rules -eol = '\n' | '\r\n' | '\r' -eof = !. -- = [\t ]* -id = [A-Z][A-Z0-9_]* -anything = < ( !eol . )* > eol - -# Configuration -config_key = < id > { blogc_source_config_key(yytext); } -config_value = < anything > { blogc_source_config_value(yytext); } -config = config_key ':' ' '+ config_value - -# Generic content -content = < ( !eof . )+ > { blogc_source_content(yytext); } - -%% - - -void -blogc_source_free(blogc_source_t *source) -{ - if (source == NULL) - return; - free(source->content); - b_trie_free(source->config); - free(source); -} - - -static void -blogc_source_config_free(void *ptr) -{ - free(ptr); -} - - -blogc_source_t* -blogc_source_parse(const char *tmpl) -{ - charbuf = tmpl; - config = b_trie_new(blogc_source_config_free); - key = NULL; - content = NULL; - while(yyparse()); - blogc_source_t *rv = malloc(sizeof(blogc_source_t)); - rv->content = content; - rv->config = config; - charbuf = NULL; - return rv; -} |