From 77dab85b82be5ac55f85085c5e56438212ea40ef Mon Sep 17 00:00:00 2001 From: overflowerror Date: Thu, 27 May 2021 20:18:25 +0200 Subject: [PATCH] begin of strucutre blocks --- src/parser.y | 1 + src/scanner.l | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/src/parser.y b/src/parser.y index 56f4ea0..6445dfb 100644 --- a/src/parser.y +++ b/src/parser.y @@ -42,6 +42,7 @@ extern struct template result; %token SECTION COMMA END %token PARAMS_BEGIN PARAMS_END %token STATEMENT_BEGIN STATEMENT_END +%token STRUCTURE_BEGIN STRUCTURE_END %token OUTPUT_BEGIN OUTPUT_END %start template diff --git a/src/scanner.l b/src/scanner.l index d3d56ce..e99590b 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -11,6 +11,9 @@ statement_end "%}"[ \t]*"\n"? output_begin "{{" output_end "}}" +structure_begin "{#" +structure_end "#}" + block_end_token "end" block_end {whitespace}*{block_end_token}{whitespace}* @@ -31,6 +34,7 @@ type_or_id {type_prefix}?{id}{type_pointer}* %x PARAMS %x STATEMENT +%x STRUCTURE %x OUTPUT %{ @@ -51,6 +55,7 @@ type_or_id {type_prefix}?{id}{type_pointer}* {params_begin} { BEGIN(PARAMS); return PARAMS_BEGIN; } {statement_begin} { BEGIN(STATEMENT); return STATEMENT_BEGIN; } {section} { isMetaSection = false; BEGIN(MAIN_SECTION); return SECTION; } +{structure_begin} { BEGIN(STRUCTURE); return STRUCTURE_BEGIN; } {output_begin} { fprintf(stderr, "error: output block not allowed in meta section (line %d)\n", yylineno); exit(1); } {whitespace}+ { /* ignore whitespaces */ } . { fprintf(stderr, "error: raw text not allowed in meta section (line %d)\n", yylineno); exit(1); } @@ -67,8 +72,13 @@ type_or_id {type_prefix}?{id}{type_pointer}* "e" { yylval.text = strdup(yytext); return TEXT; /* catch e as text */ } {statement_end} { BEGIN(isMetaSection ? META_SECTION : MAIN_SECTION); return STATEMENT_END; } +[^#]+ { yylval.text = strdup(yytext); return TEXT; } +"#" { yylval.text = strdup(yytext); return TEXT; /* catch # as text */ } +{structure_end} { BEGIN(isMetaSection ? META_SECTION : MAIN_SECTION); return STRUCTURE_END; } + {params_begin} { fprintf(stderr, "warning: parameter block not allowed in main section (line %d); assuming to be text\n", yylineno); yylval.text = strdup(yytext); return TEXT; } {statement_begin} { BEGIN(STATEMENT); return STATEMENT_BEGIN; } +{structure_begin} { BEGIN(STRUCTURE); return STRUCTURE_BEGIN; } {output_begin} { BEGIN(OUTPUT); return OUTPUT_BEGIN; } \n { yylval.text = strdup(yytext); return TEXT; } . { yylval.text = strdup(yytext); return TEXT; }