mirror of
https://github.com/sigmasternchen/libparcival
synced 2025-03-15 03:48:55 +00:00
added parsing for child and extends (maybe change to parent) structure commands
This commit is contained in:
parent
3d8eb31389
commit
fdc425e0b3
4 changed files with 48 additions and 6 deletions
35
src/parser.y
35
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
|
||||
|
|
|
@ -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; }
|
||||
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue