From fdc425e0b353cbd99c00f01b8b44226d94280a79 Mon Sep 17 00:00:00 2001 From: overflowerror Date: Mon, 7 Jun 2021 21:12:42 +0200 Subject: [PATCH] added parsing for child and extends (maybe change to parent) structure commands --- src/parser.y | 35 +++++++++++++++++++++++++++++++---- src/scanner.l | 9 ++++++++- src/tree.c | 7 ++++++- src/tree.h | 3 +++ 4 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/parser.y b/src/parser.y index 54fa1ca..116417b 100644 --- a/src/parser.y +++ b/src/parser.y @@ -48,7 +48,7 @@ extern struct template result; %token STATEMENT_BEGIN STATEMENT_END %token STRUCTURE_BEGIN STRUCTURE_END %token OUTPUT_BEGIN OUTPUT_END -%token RENDER OPEN_PARENTHESES CLOSE_PARENTHESES +%token RENDER EXTENDS CHILD OPEN_PARENTHESES CLOSE_PARENTHESES %start template @@ -85,10 +85,23 @@ metaSection: /* empty */ $$ = $4; addStat(&$$.stats, $2); } - | STRUCTURE_BEGIN + | STRUCTURE_BEGIN optionalWhitespaces structureType optionalWhitespaces OPEN_PARENTHESES text CLOSE_PARENTHESES optionalWhitespaces metaSection { - yyerror("structure block in meta section not yet supported"); - YYERROR; + $$ = $9; + switch($3) { + case RENDER_NODE: + yyerror("render command not allowed in meta section; ignoring"); + break; + case CHILD_NODE: + yyerror("child command not allowed in meta section; ignoring"); + break; + case EXTENDS_TOKEN: + yyerror("extends command not yet implemented; ignoring"); + break; + default: + yyerror("unhandled structure block command (internal error)"); + YYERROR; + } } ; @@ -151,6 +164,12 @@ mainSection: /* empty */ case RENDER_NODE: addNode(&$$, newRenderNode($7)); break; + case CHILD_NODE: + yyerror("child command not yet implemented; ignoring"); + break; + case EXTENDS_TOKEN: + yyerror("extends command not allowed in main section; ignoring"); + break; default: yyerror("unhandled structure block command (internal error)"); YYERROR; @@ -166,6 +185,14 @@ structureType: RENDER { $$ = RENDER_NODE; } + | EXTENDS + { + $$ = EXTENDS_TOKEN; + } + | CHILD + { + $$ = CHILD_NODE; + } ; statementHeader: STATEMENT_BEGIN blockStatement STATEMENT_END diff --git a/src/scanner.l b/src/scanner.l index 195dcbf..0b71236 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -18,6 +18,9 @@ block_end_token "end"|"END" block_end {whitespace}*{block_end_token}{whitespace}* render_token "render"|"RENDER" +extends_token "extends"|"EXTENDS" +child_token "child"|"CHILD" + id [a-zA-Z_][a-zA-Z0-9_]* @@ -74,12 +77,16 @@ 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; } -[^#r() \t\n]+ { yylval.text = strdup(yytext); return TEXT; } +[^#rec() \t\n]+ { yylval.text = strdup(yytext); return TEXT; } {whitespace}+ { yylval.text = strdup(yytext); return WHITESPACE; } {render_token} { return RENDER; } +{extends_token} { return EXTENDS; } +{child_token} { return CHILD; } "(" { return OPEN_PARENTHESES; } ")" { return CLOSE_PARENTHESES; } "r" { yylval.text = strdup(yytext); return TEXT; /* catch r as text */ } +"e" { yylval.text = strdup(yytext); return TEXT; /* catch e as text */ } +"c" { yylval.text = strdup(yytext); return TEXT; /* catch c as text */ } "#" { yylval.text = strdup(yytext); return TEXT; /* catch # as text */ } {structure_end} { BEGIN(isMetaSection ? META_SECTION : MAIN_SECTION); return STRUCTURE_END; } diff --git a/src/tree.c b/src/tree.c index eeb92de..32e4150 100644 --- a/src/tree.c +++ b/src/tree.c @@ -148,7 +148,8 @@ struct params combineParams(struct params p1, struct params p2) { struct stats newStats() { return (struct stats) { .texts = NULL, - .no = 0 + .no = 0, + .parent = NULL }; } @@ -163,6 +164,10 @@ void addStat(struct stats* stats, char* text) { stats->texts[stats->no++] = text; } +void setParent(struct stats* stats, char* parent) { + stats->parent = parent; +} + struct template newTemplate() { return (struct template) { .params = newParams(), diff --git a/src/tree.h b/src/tree.h index e3adfd0..e002465 100644 --- a/src/tree.h +++ b/src/tree.h @@ -9,6 +9,8 @@ char* combineStr(char*, char*); #define STATEMENT_NODE (1) #define OUTPUT_NODE (2) #define RENDER_NODE (3) +#define CHILD_NODE (4) +#define EXTENDS_TOKEN (5) struct node { int type; @@ -47,6 +49,7 @@ struct params combineParams(struct params, struct params); struct stats { char** texts; size_t no; + char* parent; }; struct stats newStats();