program exprtest;
(* Programme pour tester les analyseurs syntaxiques et ‚valuateurs
 * d'expressions.
 *)

uses lexical, numeriques, chaines, logiques, syntaxe,
	variables, evalue, interpreteur;

var	test 	: string;
	v	: VARIABLE;
	p	: EXPRESSION_NUMERIQUE;
	reel	: boolean;
	r	: real;
	c	: EXPRESSION_CHAINE;
	l	: EXPRESSION_LOGIQUE;

begin
	initialise_interpreteur;
	writeln('Test expression num‚rique: ');
	test := '2.0e2 * ((a% + 1) + (2 * --3)) / 0';
	writeln(test);
	initialise_analyseur_syntaxique(test);
	p := lit_expression_numerique;
	if erreur_syntaxique <> ANALYSEUR_SYNTAXIQUE_OKAY then
		explique_erreur_syntaxique
	else begin
		reel := false;
		r := evalue_expression_numerique(p, reel);
		if erreur_interpreteur <> INTERPRETEUR_OKAY then
			explique_erreur_interpreteur
		else
			if reel then
				writeln(r)
			else
				writeln(round(r));
	end;
	termine_analyseur_syntaxique;

	writeln('Test expression chaine:');
	test := '"hello" + " " +  a$ + " world!"';
	writeln(test);
	initialise_analyseur_syntaxique(test);
	c := lit_expression_chaine;
	v := cree_variable_chaine('a$', 'euh?');
	if erreur_syntaxique <> ANALYSEUR_SYNTAXIQUE_OKAY then
		explique_erreur_syntaxique
	else
		writeln(evalue_expression_chaine(c));
	termine_analyseur_syntaxique;

	writeln('Test expression logique: ');
	test := '1 <> 0 and [1 = 0 or 1 < -231]';
	writeln(test);
	initialise_analyseur_syntaxique(test);
	l := lit_expression_logique;
	if erreur_syntaxique <> ANALYSEUR_SYNTAXIQUE_OKAY then
		explique_erreur_syntaxique
	else
		writeln(evalue_expression_logique(l));
	termine_analyseur_syntaxique;

	termine_interpreteur;
end.