Programation en LEX

Fermé
most27 Messages postés 74 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 9 juillet 2016 - 4 nov. 2013 à 23:13
most27 Messages postés 74 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 9 juillet 2016 - 10 janv. 2014 à 12:43
Bonjour,je vient de débuté avec le LEX (compilateur lexical) j'ai un problème avec mon programme ,il consiste a compter le nombre de lignes et de caractères d'1 fichier texte pour le nombre de ligne a chaque fois il soustré une ligne et pour le nombre de caractères a chaque fois il rajoute 1 caractére voici le programme aider mois s'il vous plais merci d'avance
%{
#include<stdio.h>
int l=1,c=0;
%}
%%
\n l++;
. c++;
%%
int main(void)
{FILE *p;
p=fopen("test.txt","r");
yyin=p;
yylex();
printf("nombres de lignes %d\n nombre de caractetres %d",l,c);
}

4 réponses

Idéophage Messages postés 43 Date d'inscription mardi 21 août 2012 Statut Membre Dernière intervention 23 novembre 2013 5
13 nov. 2013 à 11:06
Pour les retours à la ligne, chez moi ça fonctionne en initialisant le nbLines à 0. Mon éditeur de texte ajoute automatiquement un caractère de retour à la ligne à la fin de mes fichiers, donc il y en a un par ligne, y compris la dernière. Ça ne doit pas être le cas chez toi, si ?

Pour le nombre de caractères, est-ce qu'un retour à la ligne est considéré comme un caractère à compter ? Si oui, alors affiche le caractère pris en compte à chaque fois que tu incrémentes nbChars (avec
yytext
, une variable qui contient le texte matché). Tu verra bien ceux qui ne sont pas comptés et ce qu'il faut ajouter à ton code.
1
Idéophage Messages postés 43 Date d'inscription mardi 21 août 2012 Statut Membre Dernière intervention 23 novembre 2013 5
7 nov. 2013 à 22:55
Bonjour,

Tout d'abord, je ne connais pas LEX et je ne vais pas apporter de réponse à une question qui n'est en fait même pas posée. Je voudrais juste que les règles de base de la typographie et de l'orthographe soient respectées. Je sais que le message de most27 n'est pas des pires, mais je rappelle que certains membres aimeraient voir des phrases correctes sans devoir s'imaginer quelqu'un qui parle. On pourrait me réponde que « c'est l'habitude », que je pourrais très bien ne pas lire. La construction d'une réponse à donner à ce genre de remarques est laissée en exercice au lecteur. ^^

Bref, comme je l'ai fait remarquer, peut-être que des connaisseurs de LEX comprendront tout de suite ce qui ne va pas (une erreur de syntaxe ?), mais serait-il possible de savoir quel est le problème dont il est question ici ? Ça permettrait, entre autres, que quelqu'un qui se retrouve devant le même problème puisse trouver grâce à duck duck go la réponse à son problème en arrivant sur cette page.

D'après ce que je comprends, le nombre de lignes est compté positivement dans le code et non négativement comme écrit dans votre message. Ensuite, pourquoi initialiser l à 1 ? Est-ce qu'une ligne est considérée comme un caractère (dans votre code, il semble que non, sauf si un caractère peut être matché par deux patterns) ? Nommer les variables par des lettres uniques n'est pas très pertinent, mais là ça va, c'est très court comme programme.

Et aussi, ce serait bien d'utiliser les balises de code afin que l'on puisse avoir du code formaté normalement.
0
most27 Messages postés 74 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 9 juillet 2016 1
13 nov. 2013 à 00:08
Bonjour,Merci pour votre réponse :)
Le problème dont il est question dans mon programme ,c'est qu'il ajoute un caractère en plus,quand il compte les caractères dans mon fichier .tex ,c'est a dire que si j'ai 4 caractères dans mon fichier alors il m'affiche qu'il y'a 5 caractères (printf("nombres de caractères %d",caractères);)
J'ai initialiser le nombre de ligne a 1 ,car c'est la seul solution que j'ai trouvé car si j'ai dans mon fichier .tex 2 lignes alors il m'affiche qu'il y'a 1 ligne .
C'est le plus exactement le cygwin pas le LEX.
voici le programme
%{
#include<stdio.h>
int lignes=1,caracteres=0;
%}
%%
\n lignes++;
. caracteres++;
%%
int main(void)
{FILE *p;
p=fopen("test.txt","r");
yyin=p;
yylex();
printf("nombres de lignes est %d\n",lignes);
printf(" nombre de caractètres est %d",caracteres);
}
0
most27 Messages postés 74 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 9 juillet 2016 1
14 nov. 2013 à 23:59
Bonjour,
Oui mon éditeur de texte n'ajoute pas automatiquement un caractère de retour à la ligne,
Pour ce qui concerne le nombre de caractères j'ai pas trop bien compris votre méthode avec la fonction yytext ,j'ai pas sue ou et comment l'écrire ,mais j'ai essayé une autre méthode ,j'ai remplacé cette règle (. caracteres++; ) par celle la ([^\r] c++; ),et ça marche ,c'est a dire qu'il compte tous les caractères sauf le retour chariot.
Donc il ajoutait le caractère retour chariot ("\r") aux autres caractéres.
Encore merci pour votre répense :)
0
Idéophage Messages postés 43 Date d'inscription mardi 21 août 2012 Statut Membre Dernière intervention 23 novembre 2013 5
20 nov. 2013 à 10:33
Je disais de remplacer la règle
. caracteres++;
par la règle
. { caracteres++; printf("'%c'\n", yytext[0]); }
. La variable
yytext
pointe vers le premier caractère qui a été matché. Comme ça, tu vois quels caractères sont en trop (on peut aussi mettre
%d
au lieu de
%c
).
0
most27 Messages postés 74 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 9 juillet 2016 1
22 nov. 2013 à 22:14
J'ai éssai et j'ai trouvé que le "retour chariot " été le caractère ajouter
et encord Merci pour votre rèpence .
0
Idéophage Messages postés 43 Date d'inscription mardi 21 août 2012 Statut Membre Dernière intervention 23 novembre 2013 5
23 nov. 2013 à 17:56
Oui, je disais ça pour vous aider à déboguer plus facilement la prochaine fois : affichez ce que votre programme fait.
0
most27 Messages postés 74 Date d'inscription mardi 29 octobre 2013 Statut Membre Dernière intervention 9 juillet 2016 1
10 janv. 2014 à 12:43
Bonjour,
Je veut identifier le nombre d'élément d'une liste dans le langage prolog voila j'ai essai avec cette fonction récursive
cont([],0).
cont([Y|Q],X):-X1 is X+1 ,cont(Q,X).
tel que X est la variable qui contien le nombre d'élément de la liste et sa ne marche pas!
Enfaite je n'est pas compris comment faire pour incrémenté le X a chaque fois
s'il vous play aidez mois ,merci d'avence pour votre répence .
0