analyseur lexical en C - C - Programmation
Marsh Posté le 13-04-2012 à 16:59:44
et utiliser un outil adapté, comme lex (ou flex) ?
Marsh Posté le 13-04-2012 à 18:19:18
Citation : Construire un automate fini qui accepte l’ensemble suivant |
Dessine le, ton automate, c'est pas dur.
une fois dessiné, tu peux assez facilement créer une table qui a pour lignes les états, pour colonne les symboles, et qui a pour valeur [e, s] l'état auquel fait passer le symbole s quand on est dans l'état e.
Et après, ça roule ou presque.
A+,
Marsh Posté le 13-04-2012 à 19:34:10
En fait dans ton cas, c'est encore plus simple (ce que je t'ai mis correspondait plus à la phase de l'analyseur lexical):
Tu peux faire un truc style (je garantis rien sur la qualité de ce qui suit, c'est juste pour te donner une idée de l'approche à suivre).
Code :
|
Et je suppose que tu as qque part un analyseur syntaxique comme indique dans mon post précédent qui va faire un
Code :
|
A+,
Marsh Posté le 13-04-2012 à 16:48:48
salut
je suis chargée de faire un analyseur lexical développé en langage C, j'arrive pas à faire un plan pour mon travail, les principaux structures que je dois créer. j'ai compris qu'il faut que je crée une structure de donnée qui contient deux champs:
Cependant y'en a pleins de questions qui se posent:
comment ferai-je la vérification, quelle est la variable qui contiendra les mots clés? doit-elle etre une structure de donnée? si oui quelles sont les champs? ou doit-elle etre une pile, tableau? et puis lors de traitement des différents cas {switch () case(nb): {...} break;case(id):{} break;...case(mot-clé) case (espace) ou doit-je stockés le résultat du case?
Il est demandé de:
*Construire un automate fini qui accepte l’ensemble suivant
des mots (unités lexicales ou jetons, terminaux d’une grammaire) { :, id, :=, ;, nb, ,, nbr, +, *, entier, réel, (, ), espace }
Où id représente les identificateurs alphanumériques qui commencent par un caractère alphabétique (l(l+c)*), nb représente les nombres entiers c+ et nbr est nombre réel c+.c+
espace représente une séquence d’espaces blancs ou de tabulations.
*Etendre l’automate pour pouvoir retourner à l’état final deux valeurs. La première est l’unité trouvée selon l’état final atteint et la deuxième est un attribut supplémentaire.
Si l’unité trouvée est un id qui n’est pas un mot clé alors la première valeur retournée est id et la deuxième est une entrée dans une table contenant les identificateurs.
Si l’unité trouvée est un mot clé (sachant que les mots clés sont : début, fin, program, var, entier, réel (Il faut sauvegarder quelque part cette liste de mots), alors, les valeurs retournées sont le mot clé et 0.
Si l’unité est nb alors la deuxième valeur est la valeur de ce nombre. L’automate doit pouvoir sauter les espaces, les retours à la ligne et les tabulations.
Je doit créer une fonction :RangerId() et UnilexId();
La fonction RangerId() a accès au tampon où l’unité lexicale identificateur a été localisée. On examine la table des symboles et si on trouve le lexème avec l’identificateur mot clé, RangerId() rend 0. Si on trouve le lexème comme variable du programme, RangerId() rend un pointeur vers une entrée dans la table des symboles. Si on ne trouve pas le lexème dans la table des symboles, il y est placé en tant que variable et un pointeur vers cette nouvelle entrée est retourné.
La fonction UnilexId() recherche le lexème dans la table des symboles. Si le lexème est un mot clé, l’unité lexicale correspondante est retournée; autrement, l’unité lexicale id est retournée.
Voilà tout me parait ambiguë, votre aide me sera très utile .
Merci d'avance