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}* <INITIAL,META_SECTION>{params_begin} { BEGIN(PARAMS); return PARAMS_BEGIN; } <INITIAL,META_SECTION>{statement_begin} { BEGIN(STATEMENT); return STATEMENT_BEGIN; } <INITIAL,META_SECTION>{section} { isMetaSection = false; BEGIN(MAIN_SECTION); return SECTION; } +<INITIAL,META_SECTION>{structure_begin} { BEGIN(STRUCTURE); return STRUCTURE_BEGIN; } <INITIAL,META_SECTION>{output_begin} { fprintf(stderr, "error: output block not allowed in meta section (line %d)\n", yylineno); exit(1); } <INITIAL,META_SECTION>{whitespace}+ { /* ignore whitespaces */ } <INITIAL,META_SECTION>. { 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}* <STATEMENT>"e" { yylval.text = strdup(yytext); return TEXT; /* catch e as text */ } <STATEMENT>{statement_end} { BEGIN(isMetaSection ? META_SECTION : MAIN_SECTION); return STATEMENT_END; } +<STRUCTURE>[^#]+ { yylval.text = strdup(yytext); return TEXT; } +<STRUCTURE>"#" { yylval.text = strdup(yytext); return TEXT; /* catch # as text */ } +<STRUCTURE>{structure_end} { BEGIN(isMetaSection ? META_SECTION : MAIN_SECTION); return STRUCTURE_END; } + <MAIN_SECTION>{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; } <MAIN_SECTION>{statement_begin} { BEGIN(STATEMENT); return STATEMENT_BEGIN; } +<MAIN_SECTION>{structure_begin} { BEGIN(STRUCTURE); return STRUCTURE_BEGIN; } <MAIN_SECTION>{output_begin} { BEGIN(OUTPUT); return OUTPUT_BEGIN; } <MAIN_SECTION>\n { yylval.text = strdup(yytext); return TEXT; } <MAIN_SECTION>. { yylval.text = strdup(yytext); return TEXT; }