[qfcc] Allow languages to hook number parsing

The idea is to allow certain contexts to interpret something like `2D`
as an identifier instead of 2.0 (double), or (not sure I'll go there,
5e12 as a bivector instead of a double or float.
This commit is contained in:
Bill Currie 2025-01-04 12:51:30 +09:00
parent 6f39722a05
commit 400486931f
2 changed files with 10 additions and 4 deletions

View file

@ -211,6 +211,7 @@ typedef struct language_s {
const expr_t *init, symtab_t *symtab,
expr_t *block, rua_ctx_t *ctx);
void *sublanguage;
const expr_t *(*parse_number) (const rua_tok_t *tok, rua_ctx_t *ctx);
} language_t;
typedef struct rua_ctx_s {

View file

@ -507,7 +507,7 @@ parse_suffix (const char *suffix, bool fp)
}
static const expr_t *
parse_number (const rua_tok_t *tok, yyscan_t scanner)
parse_number (const rua_tok_t *tok)
{
bool binary = false;
const char *type = "integer";
@ -666,7 +666,7 @@ parse_vector (const rua_tok_t *tok, yyscan_t scanner)
do {
token = yylex (&vtok, &vtok.location, scanner);
if (-token == rua_number) {
auto expr = parse_number (&vtok, scanner);
auto expr = parse_number (&vtok);
if (expr) {
if (width < 4) {
components[width] = expr;
@ -946,7 +946,7 @@ preproc_token (rua_extra_t *extra, PRE_YYSTYPE *lval, const rua_tok_t *tok,
case rua_number:
if (!extra->recording) {
token = -rua_error;
if ((lval->expr = parse_number (tok, scanner))) {
if ((lval->expr = parse_number (tok))) {
token = PRE_VALUE;
}
}
@ -1031,7 +1031,12 @@ qc_token (rua_extra_t *extra, rua_val_t *lval, const rua_tok_t *tok,
break;
case rua_number:
token = -rua_error;
lval->expr = parse_number (tok, scanner);
if (ctx->language->parse_number) {
lval->expr = ctx->language->parse_number (tok, ctx);
}
if (!lval->expr) {
lval->expr = parse_number (tok);
}
if (lval->expr) {
token = QC_VALUE;
if (lval->expr->implicit) {