diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/assembler.c | 86 | ||||
-rw-r--r-- | lib/hash.c | 2 | ||||
-rw-r--r-- | lib/meta.c | 2 |
3 files changed, 84 insertions, 6 deletions
diff --git a/lib/assembler.c b/lib/assembler.c index 513a6be..34ee48a 100644 --- a/lib/assembler.c +++ b/lib/assembler.c @@ -969,6 +969,7 @@ static void evaluate(expression_t * e) t = (expression_t *) Emalloc(sizeof(expression_t)); t->e_type = t->e_subtype = E_VALUE; t->avalue = 0; + t->pattern = NULL; t->next = t->child = NULL; t->prev = e->child; e->child->next = t; @@ -986,6 +987,7 @@ void act_pile(int o) int i, nbargs; e = Emalloc(sizeof(expression_t)); + e->pattern = NULL; e->op = o; e->avalue = 0; e->symbol = NULL; @@ -1133,7 +1135,7 @@ static void super_pattern(pattern_t * patterns, expression_t * e) if (e->e_subtype == E_OPERATION) { if (((e->op == OP_DIRECT) && (e->child->e_subtype == E_VALUE)) || ((e->op == OP_DECAL) - && (e->child->next->e_subtype = E_VALUE))) { + && (e->child->next->e_subtype == E_VALUE))) { e->pattern = patterns; e->index = i; } @@ -1322,6 +1324,7 @@ static void evaluate_pattern(_TableauVariable * it, expression_t * e) t->e_type = t->e_subtype = E_VALUE; t->avalue = e->index; t->symbol = NULL; + t->pattern = NULL; InsererVarDansTab(it, CreerElement(m->name, t)); free(t); } @@ -1346,6 +1349,7 @@ static void evaluate_pattern(_TableauVariable * it, expression_t * e) } pushdword(tv, e->child); } else { + exception(1, _("Logical error in meta language")); } } m = n; @@ -1362,6 +1366,8 @@ static void evaluate_pattern(_TableauVariable * it, expression_t * e) t = (expression_t *) Emalloc(sizeof(expression_t)); t->next = t->child = t->prev = t->father = NULL; t->e_type = t->e_subtype = E_VALUE; + t->pattern = NULL; + if (e->child->next->e_subtype == E_PATTERN) { t->avalue = e->child->next->index; } else { @@ -1392,6 +1398,7 @@ static void evaluate_pattern(_TableauVariable * it, expression_t * e) t->e_type = t->e_subtype = E_VALUE; t->avalue = e->child->index; t->symbol = NULL; + t->pattern = NULL; InsererVarDansTab(it, CreerElement(m->name, t)); free(t); } @@ -1401,11 +1408,49 @@ static void evaluate_pattern(_TableauVariable * it, expression_t * e) } } +static int evaluate_field(_TableauVariable it, char * field, field_t * fields) { + int i, r, e, n; + char trouve; + expression_t * t; + + for (fields = fields->next; fields; fields = fields->next) { + if (!strcmp(field + 1, fields->name)) { + break; + } + } + + if (!(fields)) { + exception(1, _("Unknow field in metalanguage")); + } + + r = 0; + n = 0; + + for (i = 0; i < fields->nbr; i++) { + t = (expression_t *) NomVarToVar(fields->names[i], it, &trouve); + e = 0; + if (trouve) { + if (t->e_subtype == E_VALUE) { + exception(1, _("Can't evaluate directly expression")); + } + e = t->avalue; + } + n = fields->sizes[i]; + if ((e & (n - 1)) != e) { + exception(1, _("Value too large for field")); + } + r = (r << n) | e; + } + + return r; +} + void asm_eol(void) { instruct_t *instr; expression_t *t; int i; + char trouve; bytestream_t *pi; _TableauVariable it; @@ -1424,6 +1469,7 @@ void asm_eol(void) fprintf(stderr, "Fin de ligne sur:\n"); debug_print_expression(e_line); + fprintf(stderr, "-----\n"); e_current = e_line; /* Est-ce que le premier mot est un label terminant par ':' ? */ @@ -1448,6 +1494,7 @@ void asm_eol(void) } } + switch (e_current->e_subtype) { case E_INTERNAL: switch (e_current->op) { @@ -1533,6 +1580,7 @@ void asm_eol(void) t->e_type = t->e_subtype = E_VALUE; t->avalue = e_current->index; t->child = t->next = NULL; + t->pattern = NULL; InsererVarDansTab(&it, CreerElement(instr->names[i], t)); free(t); evaluate_pattern(&it, e_current); @@ -1548,13 +1596,43 @@ void asm_eol(void) e_current = e_line; } - fprintf(stderr, "Variables explicites:\n"); + for (i = 0; i < instr->nbimplicit; i++) { + switch(instr->itypes[i]) { + case 0: /* type direct */ + t = (expression_t *) NomVarToVar(instr->istrings[i], it, &trouve); + if (!trouve) { + exception(1, _("Syntax error in meta language")); + } + InsererVarDansTab(&it, CreerElement(instr->implicits[i], t)); + break; + case 1: /* type prédéfinit */ + t = (expression_t *) Emalloc(sizeof(expression_t)); + t->e_type = t->e_subtype = E_VALUE; + if (instr->istrings[i][0] != 'F') { + exception(1, _("Logical error in meta language")); + } + t->avalue = evaluate_field(it, instr->istrings[i], fields);; + t->child = t->next = NULL; + t->pattern = NULL; + InsererVarDansTab(&it, CreerElement(instr->implicits[i], t)); + break; + case 2: /* type valeur */ + t = (expression_t *) Emalloc(sizeof(expression_t)); + t->e_type = t->e_subtype = E_VALUE; + t->avalue = instr->ivalues[i]; + t->child = t->next = NULL; + t->pattern = NULL; + InsererVarDansTab(&it, CreerElement(instr->implicits[i], t)); + break; + } + } + + fprintf(stderr, "Variables\n"); AfficheTableau(it); + pushdword(evaluate_field(it, "FI", fields), NULL); DetruitTab(&it); - - break; default: exception(1, _("Unknow instruction")); @@ -140,7 +140,7 @@ _TypeVariable NomVarToVar(char *Nom, _TableauVariable t, char *trouve) void AfficheListe(_ListeChaine l) { while (l != NULL) { - printf("%s\n", l->Elem.NomVar); + fprintf(stderr, "%s\n", l->Elem.NomVar); l = l->Suivant; } } @@ -617,7 +617,7 @@ void main(void) instruct->istrings[i]); break; case 1: - fprintf(stderr, " + %s <= %i (type prédéfinit)\n", instruct->implicits[i], + fprintf(stderr, " + %s <= %s (type prédéfinit)\n", instruct->implicits[i], instruct->istrings[i]); break; case 2: |