added parsing for child and extends (maybe change to parent) structure commands

This commit is contained in:
overflowerror 2021-06-07 21:12:42 +02:00
parent 3d8eb31389
commit fdc425e0b3
4 changed files with 48 additions and 6 deletions

View file

@ -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,11 +85,24 @@ 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");
$$ = $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;
}
}
;
parameters: /* empty */
@ -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

View file

@ -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}*
<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>[^#r() \t\n]+ { yylval.text = strdup(yytext); return TEXT; }
<STRUCTURE>[^#rec() \t\n]+ { yylval.text = strdup(yytext); return TEXT; }
<STRUCTURE>{whitespace}+ { yylval.text = strdup(yytext); return WHITESPACE; }
<STRUCTURE>{render_token} { return RENDER; }
<STRUCTURE>{extends_token} { return EXTENDS; }
<STRUCTURE>{child_token} { return CHILD; }
<STRUCTURE>"(" { return OPEN_PARENTHESES; }
<STRUCTURE>")" { return CLOSE_PARENTHESES; }
<STRUCTURE>"r" { yylval.text = strdup(yytext); return TEXT; /* catch r as text */ }
<STRUCTURE>"e" { yylval.text = strdup(yytext); return TEXT; /* catch e as text */ }
<STRUCTURE>"c" { yylval.text = strdup(yytext); return TEXT; /* catch c as text */ }
<STRUCTURE>"#" { yylval.text = strdup(yytext); return TEXT; /* catch # as text */ }
<STRUCTURE>{structure_end} { BEGIN(isMetaSection ? META_SECTION : MAIN_SECTION); return STRUCTURE_END; }

View file

@ -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(),

View file

@ -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();