diff options
Diffstat (limited to 'lib/assembler.c')
| -rw-r--r-- | lib/assembler.c | 190 | 
1 files changed, 87 insertions, 103 deletions
| diff --git a/lib/assembler.c b/lib/assembler.c index 60fe86f..e727ce2 100644 --- a/lib/assembler.c +++ b/lib/assembler.c @@ -1287,7 +1287,7 @@ static instruct_t *e_match_i(phon_t * phons, instruct_t * instructs, expression_  static void evaluate_pattern(_TableauVariable * it, expression_t * e)  { -	metaexpr_t *m; +	metaexpr_t *m, *n;  	expression_t *t;  	if (!e->pattern) { @@ -1296,111 +1296,95 @@ static void evaluate_pattern(_TableauVariable * it, expression_t * e)  	m = e->pattern->expr[e->index]; -	switch (e->e_subtype) { -	case E_OPERATION: -		switch (e->op) { -		case OP_DECAL: -			/* On est sous la forme LABEL[VALEUR + PATTERN] au pire */ -			switch (e->child->next->e_subtype) { -			case E_OPERATION: -				/* Et voila on y est... */ -				t = (expression_t *) Emalloc(sizeof(expression_t)); -				t->e_type = t->e_subtype = E_VALUE; -				t->avalue = e->child->next->child->next->index; -				t->next = t->child = NULL; - -				InsererVarDansTab(it, CreerElement(m->string, t)); -				free(t); - -				t = (expression_t *) Emalloc(sizeof(expression_t)); -				t->e_type = t->e_subtype = E_LABEL; -				t->avalue = 0; -				t->next = t->child = NULL; -				t->symbol = Estrdup(e->child->symbol); - -				pushdword(e->child->next->child->avalue, t); -				free(t); -				break; -			case E_VALUE: -				/* Sous la forme LABEL[VALEUR] */ -				t = (expression_t *) Emalloc(sizeof(expression_t)); -				t->e_type = t->e_subtype = E_LABEL; -				t->avalue = 0; -				t->next = t->child = NULL; -				t->symbol = Estrdup(e->child->symbol); - -				pushdword(e->child->next->avalue, t); -				free(t); -				break; -			case E_PATTERN: -				/* Sous la forme LABEL[PATTERN] */ -				t = (expression_t *) Emalloc(sizeof(expression_t)); -				t->e_type = t->e_subtype = E_VALUE; -				t->avalue = e->child->next->index; -				t->next = t->child = NULL; - -				InsererVarDansTab(it, CreerElement(m->string, t)); -				free(t); - -				t = (expression_t *) Emalloc(sizeof(expression_t)); -				t->e_type = t->e_subtype = E_LABEL; -				t->avalue = 0; -				t->next = t->child = NULL; -				t->symbol = Estrdup(e->child->symbol); - -				pushdword(0, t); -				free(t); -				break; -			default: -				exception(1, _("Pattern not matching...")); -				break; +	if (m->name) { +		if (m->string) { +			if (m->type) { +				if (!strcmp(m->name, "I")) { +					exception(1, _("Unknow constant type in the meta language")); +				} +				if (e->e_subtype == E_VALUE) { +					pushdword(e->avalue, NULL); +				} else { +					pushdword(0, e); +				} +			} else { +				if (m->string) { +					if (m->string != 'P') { +						exception(1, +							  _ +							  ("Error in the metalanguage (pattern should be here if not a constant type)")); +					} +					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->avalue = e->index; +					t->symbol = NULL; +					InsererVarDansTab(it, CreerElement(m->name, t)) +						free(t); +				}  			} -			break; -		case OP_DIRECT: -			switch (e->child->e_subtype) { -			case E_OPERATION: -				/* Sous la forme [VALUE + PATTERN] */ -				t = (expression_t *) Emalloc(sizeof(expression_t)); -				t->e_type = t->e_subtype = E_VALUE; -				t->avalue = e->child->child->next->index; -				t->next = t->child = NULL; - -				InsererVarDansTab(it, CreerElement(m->string, t)); -				free(t); - -				pushdword(e->child->child->avalue, NULL); -				break; -			case E_VALUE: -				/* Sous la forme [VALUE] */ -				pushdword(e->child->avalue, NULL); -				break; -			case E_PATTERN: -				/* Sous la forme [PATTERN] */ -				t = (expression_t *) Emalloc(sizeof(expression_t)); -				t->e_type = t->e_subtype = E_VALUE; -				t->avalue = e->child->child->next->index; -				t->next = t->child = NULL; - -				InsererVarDansTab(it, CreerElement(m->string, t)); -				free(t); - -				pushdword(e->child->child->avalue, NULL); -				break; -			default: -				exception(1, _("Pattern not matching...")); -				break; +		} +	} else { +		n = m; +		if (m->left) {	/* Binaire */ +			m = m->left; +			if (m->string) { +				if (m->type) { +					if (!strcmp(m->name, "I")) { +						exception(1, _("Unknow constant type in the meta language")); +					} +					if (e->child->e_subtype == E_VALUE) { +						pushdword(e->avalue, NULL); +					} else { +						pushdword(0, e); +					} +				} else { +					if (m->string) { +						if (m->string != 'P') { +							exception(1, +								  _ +								  ("Error in the metalanguage (pattern should be here if not a constant type)")); +						} +						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->avalue = e->index; +						t->symbol = NULL; +						InsererVarDansTab(it, CreerElement(m->name, t)) +							free(t); +					} +				} +			} +		} else { +			m = m->right; +			if (m->string) { +				if (m->type) { +					if (!strcmp(m->name, "I")) { +						exception(1, _("Unknow constant type in the meta language")); +					} +					if (e->e_subtype == E_VALUE) { +						pushdword(e->avalue, NULL); +					} else { +						pushdword(0, e); +					} +				} else { +					if (m->string) { +						if (m->string != 'P') { +							exception(1, +								  _ +								  ("Error in the metalanguage (pattern should be here if not a constant type)")); +						} +						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->avalue = e->index; +						t->symbol = NULL; +						InsererVarDansTab(it, CreerElement(m->name, t)) +							free(t); +					} +				}  			} -			break; -		default: -			exception(1, _("Pattern not matching...")); -			break;  		} -		break; -	case E_PATTERN: -		break; -	default: -		exception(1, _("Pattern not matching...")); -		break;  	}  } | 
