[qfcc] Delay processing of asx and incop tokens

The op code needs to be set just before being passed to the qc parser so
it doesn't get lost in macro expansion.

And vector values need to not be processed when recording otherwise they
get lost.
This commit is contained in:
Bill Currie 2023-10-31 10:37:02 +09:00
parent 51f3915e12
commit c5b357ddb1

View file

@ -153,6 +153,8 @@ typedef enum {
rua_char, rua_char,
rua_space, rua_space,
rua_ellipsis, rua_ellipsis,
rua_asx,
rua_incop,
rua_num_term, rua_num_term,
} rua_term; } rua_term;
@ -281,11 +283,10 @@ pp_vnumber '({s}*{m}?{pp_number}){2,4}{s}*'{ULFD}?
{s_string} { return -rua_string; }; {s_string} { return -rua_string; };
{c_string} { return -rua_char; } {c_string} { return -rua_char; }
[+\-*/&|^%]= { yylval->value.op = yytext[0]; return QC_ASX; } [+\-*/&|^%]= { return -rua_asx; }
"%%=" { return -rua_asx; }
"%%=" { yylval->value.op = QC_MOD; return QC_ASX; } "<<=" { return -rua_asx; }
"<<=" { yylval->value.op = QC_SHL; return QC_ASX; } ">>=" { return -rua_asx; }
">>=" { yylval->value.op = QC_SHR; return QC_ASX; }
[!(){}.*/&|^~+\-=\[\];,#%?:] { return yytext[0]; } [!(){}.*/&|^~+\-=\[\];,#%?:] { return yytext[0]; }
@ -315,8 +316,8 @@ pp_vnumber '({s}*{m}?{pp_number}){2,4}{s}*'{ULFD}?
"<" { return QC_LT; } "<" { return QC_LT; }
">" { return QC_GT; } ">" { return QC_GT; }
"++" { yylval->value.op = '+'; return QC_INCOP; } "++" { return -rua_incop; }
"--" { yylval->value.op = '-'; return QC_INCOP; } "--" { return -rua_incop; }
"$"{s}*{FRAMEID} { "$"{s}*{FRAMEID} {
int ret = do_grab (yytext); int ret = do_grab (yytext);
@ -1201,6 +1202,8 @@ preproc_token (rua_extra_t *extra, int token, rua_tok_t *tok, yyscan_t *scanner)
case rua_error: case rua_error:
case rua_id: case rua_id:
case rua_ellipsis: case rua_ellipsis:
case rua_asx:
case rua_incop:
break; break;
case rua_number: case rua_number:
if (!extra->recording) { if (!extra->recording) {
@ -1208,7 +1211,9 @@ preproc_token (rua_extra_t *extra, int token, rua_tok_t *tok, yyscan_t *scanner)
} }
break; break;
case rua_vector: case rua_vector:
token = parse_vector (tok, scanner); if (!extra->recording) {
token = parse_vector (tok, scanner);
}
break; break;
case rua_string: case rua_string:
case rua_char: case rua_char:
@ -1290,6 +1295,20 @@ qc_token (rua_extra_t *extra, int token, rua_tok_t *tok, yyscan_t *scanner)
case rua_ellipsis: case rua_ellipsis:
token = QC_ELLIPSIS; token = QC_ELLIPSIS;
break; break;
case rua_asx:
token = QC_ASX;
tok->value.op = tok->text[0];
switch (tok->text[1]) {
case '=': break;
case '%': tok->value.op = QC_MOD; break;
case '<': tok->value.op = QC_SHL; break;
case '>': tok->value.op = QC_SHR; break;
}
break;
case rua_incop:
token = QC_INCOP;
tok->value.op = tok->text[0];
break;
} }
} }
return token; return token;