Bonjour,
J'ai écrit un (cross) assembleur pour les microprocesseurs de la famille 6800 il y a déjà quelques années, et ai voulu modifier la routine d'évaluation des opérandes (liés aux instructions ou aux directives). J'ai trouvé une bibliothèque sympa (tinyexpr-master), mais qui aurait nécessité trop de temps à l'adapter. Toutes les pages trouvées sur le net sont similaires, mais je me suis inspiré de celle-ci. C'est très didactique, mais un peu court, en particulier parce que des opérateurs unaires ne sont pas pris en compte.
Voici un bout de code qui m'aura permis de tester. Il est suis prêt à l'intégration dans le code de l'assembleur existant, et accessoirement, à être placer dans le domaine public. On a donc un truc qui permet d'évaluer une expression infixée, mais pas strictement (de ce que j'ai compris de la définition de “infixée”) puisqu'au final, un simple opérande devait pouvoir être évalué. La forme de l'expression en entrée a été forcée en la "plaçant" entre parenthèses et à la suite de 0+, c'est-à-dire que dans l'exemple ci-dessous, l'expression saisie est A+(B*C-(D/E)*G)*H et celle passée à la fonction est 0+(A+(B*C-(D/E)*G)*H).
Comme la plupart des humains, je suis très sensible au feed-back, et attends donc vos remarques. J'espère cependant que la forme d'écriture ne choquera pas suffisamment pour avoir trop de "retours" à ce sujet. Je n'ai pas respecté les 80 colonnes de largeur (mais 96) et les quatre espaces d'indentation (mais 2). J'ai utilisé à outrance la coloration syntaxique pour me repérer dans ce long fichier source (~800 lignes). Les identifiants sont aussi humainement significatifs que possible, mais je ne raconte pas leur vie. Une des difficultés de lecture du C, selon moi, est la localisation des fonctions. J'ai résolu le problème en ayant un arrière-plan gris et en plaçant les commentaires Doxygen sur fond blanc. La déclaration d'une fonction est suivie d'une ligne remplie d'astérisques. Ça prend de la place mais ça saute aux yeux. 
Pour information, j'utilise Linux OpenSUSE Leap 42.3 avec KDE3 pour gestionnaire de fenêtres, et Kate comme éditeur. À toutes fins utiles, je signale que l'embelliseur (beautifier) nommé "astyle" a bien muri et est exploitable. À noter également que je m'interdis du code colonne 1, sauf provisoirement pour débugging, et des commentaires. Vous noterez que j'ai beaucoup commenté. C'est dû à mon âge ! J'oublie tout trop vite, alors mes commentaires sont censés me faire gagner du temps. Enfin, j'évite au maximum les déclarations en avant. La conséquence est que les fonctions de plus bas "niveau" se trouve en tête du fichier, et main() est la dernière fonction déclarée. Cela vient probablement de mon histoire liée à l'écriture de logiciels pour les micros 8 bits. Vous verrez pourtant une contradiction ici: Nemiver se sort mal de session enregistrée sur disque quand main() est à la fin du fichier.
Pour essayer, vous n'avez qu'à placer le fichier source nommé "Evaluate_in.c" dans un répertoire nommé "AssEval" (par exemple) dans votre répertoire personnel, puis saisissez dans une fenêtre terminal, les commandes:
1 2
| export C8_DEV=' -O0 -D_GNU_SOURCE -std=c99 -fstrict-aliasing -fwrapv -Wall -Wextra -g -iquote ./ -fmax-errors=10 '
cd ~/AssEval/ ; gcc $C8_DEV -Werror -g Evaluate_in.c && ./a.out 'A+(B*C-(D/E)*G)*H' |
Pour quelques tests suivant:
./a.out '!A+(!B*!C-(!D/!E)*!G)*!H'
Ce dernier exemple affichera (ici dans Konsole):

Notez que l'affichage dépend de certaines macro-instructions définies au début du fichier (DEVEL_INFIX, DEBUGTORSTACK et DEVEL_PARENTHESIZED)
Si vous saisissez une lettre comme opérande (comme dans les exemples ci-dessus), la valeur du code ASCII de la lettre sera prise en compte pour les calculs. Vous pouvez cependant saisir des nombres entiers (uniquement) sous la base de votre choix parmi décimale, octale, binaire et hexadécimale. Exemple: 0, 0123, 0o7307, @7307, 0B01001111, %1001111, 0xfC96, $Fc96. Notez que la casse des caractères alphabétiques n'importe pas. Dans la version embarquée dans l'assembleur, les opérandes commençant par les caractères autorisés seront recherchés par un gestionnaire d'identifiants (identificateurs, généralement appelés symboles, pour les assembleurs) qui retournera la valeur qui a été affectée à l’identifiant trouvé.
L'objectif est l'intégration dans un assembleur pour microprocesseur 8 bits: les résultats sont limités aux entiers de 16 bits.
Le fichier est ici:Evaluate_in.c
Partager