Parse the choices

This commit is contained in:
Dane Johnson 2021-12-21 09:28:14 -06:00
parent 8c729d5218
commit 9d4e426b4f

View File

@ -19,20 +19,14 @@ struct statchange_t {
int addend; int addend;
}; };
enum ChoiceFlags : int {
StatCheck = 0x1,
StatChange = 0x2,
};
struct Choice { struct Choice {
int flags;
int option; int option;
char *flavor; char *flavor;
statcheck_t statcheck; statcheck_t *statcheck;
char *id; char *id;
statchange_t statchange; statchange_t *statchange;
Choice(char*, statcheck_t*, statchange_t*); Choice(char*, statcheck_t *statcheck, statchange_t *statchange);
}; };
enum class FooterType { enum class FooterType {
@ -89,10 +83,9 @@ Story = BlankLine* (p:Page { pages.push_back(p.page); })+ EndOfFile;
Page = h:Header b:Body { $$.page = b.page; $$.page->id = h.string} Page = h:Header b:Body { $$.page = b.page; $$.page->id = h.string}
BlankLine*; BlankLine*;
Header = < Identifier > { $$.string = strndup(yytext, yyleng); } Header = < i:Identifier > Newline BlankLine* { $$ = i; }
Newline BlankLine*;
Identifier = [A-Z][A-Z0-9_]+; Identifier = < [A-Z][A-Z0-9_]+ > - { $$.string = strndup(yytext, yyleng); };
Body = Footer | t:TextLine b:Body { $$ = b; append_body(b.page, t.string);}; Body = Footer | t:TextLine b:Body { $$ = b; append_body(b.page, t.string);};
@ -103,7 +96,7 @@ Footer = Ending { $$.page = emit_ending(); }
| c:ChoiceList { $$.page = emit_choices(c.choices); } | c:ChoiceList { $$.page = emit_choices(c.choices); }
; ;
Goto = 'GOTO' Spacing < i:Identifier > Newline Goto = 'GOTO' - < i:Identifier > Newline
{ $$.string = strndup(yytext, yyleng); } { $$.string = strndup(yytext, yyleng); }
; ;
@ -119,39 +112,39 @@ Choice = b:Bullet f:Freetext r:Redirect
$$.choice->flavor = f.string; $$.choice->flavor = f.string;
}; };
Bullet = < [0-9]+ > ')' Spacing { $$.num = atoi(yytext); }; Bullet = < [0-9]+ > ')' - { $$.num = atoi(yytext); };
Freetext = < (!Redirect .)+ > { $$.string = strndup(yytext, yyleng); }; Freetext = < ([^[<])+ > { $$.string = strndup(yytext, yyleng); };
Redirect = ck:StatCheck? '[' i:Identifier ']' Spacing cg:StatChange? Newline Redirect = ck:StatCheck? '[' i:Identifier ']' - cg:StatChange? Newline
{ $$.choice = new Choice(i.string, ck.statcheck, cg.statchange); } { $$.choice = new Choice(i.string, ck.statcheck, cg.statchange); }
StatCheck = '<' StatName Spacing [0-9]+ ('+' | '-')? '>' Spacing; StatCheck = '<' n:StatName v:StatVal r:StatRel '>' -
{ $$.statcheck = new statcheck_t{n.string, v.num, r.num}; }
StatChange = '(' ('+' | '-') [0-9]+ Spacing StatName ')'; StatChange = '(' ('+' | '-') v:StatVal n:StatName ')'
{ $$.statchange = new statchange_t{n.string, v.num}; }
StatName = [A-Za-z]+; StatName = < [A-Za-z]+ > - { $$.string = strdup(yytext); };
EndOfFile = !.; StatVal = < [0-9]+ > - { $$.num = atoi(yytext); }
BlankLine = Spacing Newline; StatRel = < ('+'|'-')? > { $$.num = 0x0 } -
Spacing = (' ' | '\t')*; EndOfFile = !.
Newline = '\r\n' | '\r' | '\n'; BlankLine = - Newline
- = (' ' | '\t')*
Newline = '\r\n' | '\r' | '\n'
%% %%
Choice::Choice(char *id, statcheck_t *ck, statchange_t *cg) { Choice::Choice(char *id, statcheck_t *statcheck, statchange_t *statchange) {
this->id = id; this->id = id;
if (ck) { this->statcheck = statcheck;
statcheck = *ck; this->statchange = statchange;
flags |= StatCheck;
}
if (cg) {
statchange = *cg;
flags |= StatChange;
}
} }
Footer::Footer() { Footer::Footer() {