mirror of
https://github.com/sigmasternchen/libparcival
synced 2025-03-15 11:58:53 +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 STATEMENT_BEGIN STATEMENT_END
|
||||||
%token STRUCTURE_BEGIN STRUCTURE_END
|
%token STRUCTURE_BEGIN STRUCTURE_END
|
||||||
%token OUTPUT_BEGIN OUTPUT_END
|
%token OUTPUT_BEGIN OUTPUT_END
|
||||||
%token RENDER OPEN_PARENTHESES CLOSE_PARENTHESES
|
%token RENDER EXTENDS CHILD OPEN_PARENTHESES CLOSE_PARENTHESES
|
||||||
|
|
||||||
%start template
|
%start template
|
||||||
|
|
||||||
|
@ -85,10 +85,23 @@ metaSection: /* empty */
|
||||||
$$ = $4;
|
$$ = $4;
|
||||||
addStat(&$$.stats, $2);
|
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;
|
||||||
YYERROR;
|
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:
|
case RENDER_NODE:
|
||||||
addNode(&$$, newRenderNode($7));
|
addNode(&$$, newRenderNode($7));
|
||||||
break;
|
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:
|
default:
|
||||||
yyerror("unhandled structure block command (internal error)");
|
yyerror("unhandled structure block command (internal error)");
|
||||||
YYERROR;
|
YYERROR;
|
||||||
|
@ -166,6 +185,14 @@ structureType: RENDER
|
||||||
{
|
{
|
||||||
$$ = RENDER_NODE;
|
$$ = RENDER_NODE;
|
||||||
}
|
}
|
||||||
|
| EXTENDS
|
||||||
|
{
|
||||||
|
$$ = EXTENDS_TOKEN;
|
||||||
|
}
|
||||||
|
| CHILD
|
||||||
|
{
|
||||||
|
$$ = CHILD_NODE;
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
statementHeader: STATEMENT_BEGIN blockStatement STATEMENT_END
|
statementHeader: STATEMENT_BEGIN blockStatement STATEMENT_END
|
||||||
|
|
|
@ -18,6 +18,9 @@ block_end_token "end"|"END"
|
||||||
block_end {whitespace}*{block_end_token}{whitespace}*
|
block_end {whitespace}*{block_end_token}{whitespace}*
|
||||||
|
|
||||||
render_token "render"|"RENDER"
|
render_token "render"|"RENDER"
|
||||||
|
extends_token "extends"|"EXTENDS"
|
||||||
|
child_token "child"|"CHILD"
|
||||||
|
|
||||||
|
|
||||||
id [a-zA-Z_][a-zA-Z0-9_]*
|
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>"e" { yylval.text = strdup(yytext); return TEXT; /* catch e as text */ }
|
||||||
<STATEMENT>{statement_end} { BEGIN(isMetaSection ? META_SECTION : MAIN_SECTION); return STATEMENT_END; }
|
<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>{whitespace}+ { yylval.text = strdup(yytext); return WHITESPACE; }
|
||||||
<STRUCTURE>{render_token} { return RENDER; }
|
<STRUCTURE>{render_token} { return RENDER; }
|
||||||
|
<STRUCTURE>{extends_token} { return EXTENDS; }
|
||||||
|
<STRUCTURE>{child_token} { return CHILD; }
|
||||||
<STRUCTURE>"(" { return OPEN_PARENTHESES; }
|
<STRUCTURE>"(" { return OPEN_PARENTHESES; }
|
||||||
<STRUCTURE>")" { return CLOSE_PARENTHESES; }
|
<STRUCTURE>")" { return CLOSE_PARENTHESES; }
|
||||||
<STRUCTURE>"r" { yylval.text = strdup(yytext); return TEXT; /* catch r as text */ }
|
<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>"#" { yylval.text = strdup(yytext); return TEXT; /* catch # as text */ }
|
||||||
<STRUCTURE>{structure_end} { BEGIN(isMetaSection ? META_SECTION : MAIN_SECTION); return STRUCTURE_END; }
|
<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() {
|
struct stats newStats() {
|
||||||
return (struct stats) {
|
return (struct stats) {
|
||||||
.texts = NULL,
|
.texts = NULL,
|
||||||
.no = 0
|
.no = 0,
|
||||||
|
.parent = NULL
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -163,6 +164,10 @@ void addStat(struct stats* stats, char* text) {
|
||||||
stats->texts[stats->no++] = text;
|
stats->texts[stats->no++] = text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void setParent(struct stats* stats, char* parent) {
|
||||||
|
stats->parent = parent;
|
||||||
|
}
|
||||||
|
|
||||||
struct template newTemplate() {
|
struct template newTemplate() {
|
||||||
return (struct template) {
|
return (struct template) {
|
||||||
.params = newParams(),
|
.params = newParams(),
|
||||||
|
|
|
@ -9,6 +9,8 @@ char* combineStr(char*, char*);
|
||||||
#define STATEMENT_NODE (1)
|
#define STATEMENT_NODE (1)
|
||||||
#define OUTPUT_NODE (2)
|
#define OUTPUT_NODE (2)
|
||||||
#define RENDER_NODE (3)
|
#define RENDER_NODE (3)
|
||||||
|
#define CHILD_NODE (4)
|
||||||
|
#define EXTENDS_TOKEN (5)
|
||||||
|
|
||||||
struct node {
|
struct node {
|
||||||
int type;
|
int type;
|
||||||
|
@ -47,6 +49,7 @@ struct params combineParams(struct params, struct params);
|
||||||
struct stats {
|
struct stats {
|
||||||
char** texts;
|
char** texts;
|
||||||
size_t no;
|
size_t no;
|
||||||
|
char* parent;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct stats newStats();
|
struct stats newStats();
|
||||||
|
|
Loading…
Reference in a new issue