aboutsummaryrefslogtreecommitdiffstats
path: root/src/template-grammar.leg
diff options
context:
space:
mode:
authorRafael G. Martins <rafael@rafaelmartins.eng.br>2015-04-17 23:49:55 -0300
committerRafael G. Martins <rafael@rafaelmartins.eng.br>2015-04-17 23:49:55 -0300
commitbf42a95568f5efffcc87a9b5a7683b7b270a098f (patch)
tree4d3ea13c85bc34b609271ce0bf3b35cdf5a98c6f /src/template-grammar.leg
parentda54782672331c68fc7c412f4ebe27a9738342eb (diff)
downloadblogc-bf42a95568f5efffcc87a9b5a7683b7b270a098f.tar.gz
blogc-bf42a95568f5efffcc87a9b5a7683b7b270a098f.tar.bz2
blogc-bf42a95568f5efffcc87a9b5a7683b7b270a098f.zip
replaced leg-based parser with handmade parser for templates
yay! no leg parser needed anymore. parsers still needs some work and error handling, though.
Diffstat (limited to 'src/template-grammar.leg')
-rw-r--r--src/template-grammar.leg200
1 files changed, 0 insertions, 200 deletions
diff --git a/src/template-grammar.leg b/src/template-grammar.leg
deleted file mode 100644
index 2425582..0000000
--- a/src/template-grammar.leg
+++ /dev/null
@@ -1,200 +0,0 @@
-#
-# blogc: A blog 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 "template-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_slist_t *stmts = NULL;
-static int if_count = 0;
-static int block_count = 0;
-static const char *charbuf = NULL;
-
-
-static void
-blogc_template_if_stmt(const char *value)
-{
- if (block_count <= 0) {
- fprintf(stderr, "Syntax error: {" "%% if ... %%" "} statement before "
- "any {" "%% block ... %%" "} statement\n");
- exit(1);
- }
- blogc_template_stmt_t *stmt = malloc(sizeof(blogc_template_stmt_t));
- stmt->value = b_strdup(value);
- stmt->type = BLOGC_TEMPLATE_IF_STMT;
- stmts = b_slist_append(stmts, stmt);
- if_count++;
-}
-
-
-static void
-blogc_template_else_stmt(void)
-{
- if (if_count <= 0) {
- fprintf(stderr, "Syntax error: {" "%% else %%" "} statement without "
- "any open {" "%% if ... %%" "} statement\n");
- exit(1);
- }
- blogc_template_stmt_t *stmt = malloc(sizeof(blogc_template_stmt_t));
- stmt->value = NULL;
- stmt->type = BLOGC_TEMPLATE_ELSE_STMT;
- stmts = b_slist_append(stmts, stmt);
-}
-
-
-static void
-blogc_template_endif_stmt(void)
-{
- if (if_count-- <= 0) {
- fprintf(stderr, "Syntax error: {" "%% endif %%" "} statement before "
- "any {" "%% if ... %%" "} statement\n");
- exit(1);
- }
- blogc_template_stmt_t *stmt = malloc(sizeof(blogc_template_stmt_t));
- stmt->value = NULL;
- stmt->type = BLOGC_TEMPLATE_ENDIF_STMT;
- stmts = b_slist_append(stmts, stmt);
-}
-
-
-static void
-blogc_template_block_stmt(const char *value)
-{
- if (block_count > 0) {
- fprintf(stderr, "Syntax error: {" "%% block %%" "} statements "
- "can't be nested\n");
- exit(1);
- }
- blogc_template_stmt_t *stmt = malloc(sizeof(blogc_template_stmt_t));
- stmt->value = b_strdup(value);
- stmt->type = BLOGC_TEMPLATE_BLOCK_STMT;
- stmts = b_slist_append(stmts, stmt);
- block_count++;
-}
-
-
-static void
-blogc_template_endblock_stmt(void)
-{
- if (block_count-- <= 0) {
- fprintf(stderr, "Syntax error: {" "%% endblock %%" "} statement before "
- "any {" "%% block ... %%" "} statement\n");
- exit(1);
- }
- blogc_template_stmt_t *stmt = malloc(sizeof(blogc_template_stmt_t));
- stmt->value = NULL;
- stmt->type = BLOGC_TEMPLATE_ENDBLOCK_STMT;
- stmts = b_slist_append(stmts, stmt);
-}
-
-
-static void
-blogc_template_variable_stmt(const char *value)
-{
- if (block_count <= 0) {
- fprintf(stderr, "Syntax error: {{ ... }} statement before "
- "any {" "%% block ... %%" "} statement\n");
- exit(1);
- }
- blogc_template_stmt_t *stmt = malloc(sizeof(blogc_template_stmt_t));
- stmt->value = b_strdup(value);
- stmt->type = BLOGC_TEMPLATE_VARIABLE_STMT;
- stmts = b_slist_append(stmts, stmt);
-}
-
-
-static void
-blogc_template_content_stmt(const char *value)
-{
- blogc_template_stmt_t *stmt = malloc(sizeof(blogc_template_stmt_t));
- stmt->value = b_strdup(value);
- stmt->type = BLOGC_TEMPLATE_CONTENT_STMT;
- stmts = b_slist_append(stmts, stmt);
-}
-
-%}
-
-page = if | else | endif | block | endblock | print | content | 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
-
-# Conditionals
-if_open = '{%' -
-if_close = - '%}'
-if = if_open 'if' ' '+ < id > if_close { blogc_template_if_stmt(yytext); }
-else = if_open 'else' if_close { blogc_template_else_stmt(); }
-endif = if_open 'endif' if_close { blogc_template_endif_stmt(); }
-
-# Blocks
-block_open = '{%' -
-block_close = - '%}'
-block_name = ( 'single_source' | 'multiple_sources_once' | 'multiple_sources' )
-block = block_open 'block' ' '+ < block_name > block_close { blogc_template_block_stmt(yytext); }
-endblock = block_open 'endblock' block_close { blogc_template_endblock_stmt(); }
-
-# Print calls
-print_open = '{{' -
-print_close = - '}}'
-print_var = < id > { blogc_template_variable_stmt(yytext); }
-print = print_open print_var print_close
-
-# Generic content
-content = < ( !eof !if_open !if_close !block_open !block_close !print_open !print_close . )+ >
- { blogc_template_content_stmt(yytext); }
-
-%%
-
-
-void
-blogc_template_free_stmts(b_slist_t *stmts)
-{
- for (b_slist_t *tmp = stmts; tmp != NULL; tmp = tmp->next) {
- blogc_template_stmt_t *data = tmp->data;
- free(data->value);
- free(data);
- }
- b_slist_free(stmts);
-}
-
-
-b_slist_t*
-blogc_template_parse(const char *tmpl)
-{
- if_count = 0;
- block_count = 0;
- charbuf = tmpl;
- while(yyparse());
- if (if_count != 0) {
- fprintf(stderr, "Syntax error: You left %d open {" "%% if ... %%" "} statements.\n", if_count);
- exit(1);
- }
- if (block_count != 0) {
- fprintf(stderr, "Syntax error: You left %d open {" "%% block ... %%" "} statements.\n", block_count);
- exit(1);
- }
- b_slist_t *rv = stmts;
- charbuf = NULL;
- stmts = NULL;
- return rv;
-}