Bonjour,

Je suis entrain de me familiariser avec lex et yacc, en lisant un bouquin dessus, j'ai à faire l'exercise suivant.

1) sauvegarder des mots dans une liste chainee en fonction de leur type (verbe, nom...)

exemple

taper ^verb love : le lexer chercher si le verbe existe déjà, sinon il l'ajoute en début de la liste chainee avec son type VERBE.

2) après avoir mémoriser des verbes, des sujets, des pronoms, je dois taper une phrase genre exhortae needs help et le parser doit me dire si c'est une phrase simple ou composée ou si il y a erreur.


je compile, fait l'édition de lien... et lorsque je lande mon ./a.out j'ai une segmentation fault, j'ai tout revu mais j'arrive pas à voir ou est le problème.


voilà le .lex

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
%{
	/* Analyseur lexical pouvant etre utiliser par un analyseur syntaxique
	*/
 
#include "y.tab.h"
 
#define LOOKUP 0
 
int state;
int ajouter_mot (int type, char *word);
int rechercher_mot (char *word);
%}
 
 
%%
 
	/* Fin de ligne retour a l'etat par defaut */
\n	{state = LOOKUP;}
 
	/* Fin de phrase */
\.\n	{state = LOOKUP;
	 return 0;
	}
 
	/* A chaque fois que la ligne commence par un nom reserve du langage */
	/* On va definir les mots de ce type */
^verb 	{state = VERBE;}
^adj 	{state = ADJECTIF;}
^adv 	{state = ADVERBE;}
^nom 	{state = NOM;}
^prep 	{state = PREPOSITION;}
^pron 	{state = PRONOM;}
^conj 	{state = CONJONCTION;}
 
	/* un mot normal , on le defini ou on le recherche */
[a-zA-Z]+	{
		if (state != LOOKUP)
		{
			ajouter_mot (state, yytext);
		}
		else
		{
			switch (rechercher_mot (yytext))
			{
				case VERBE:
					return VERBE;
				case ADJECTIF:
					return ADJECTIF;
				case ADVERBE:
					return ADVERBE;
				case NOM:
					return NOM;
				case PREPOSITION:
					return PREPOSITION;
				case PRONOM:
					return PRONOM;
				case CONJONCTION:
					return CONJONCTION;
				default:
					/* ne rien retourner, ignorer le mot */
					printf ("%s : inconnu\n", yytext);
			}
		}
		}
 
.	;	/* Ignorer le reste */
%%
 
	/* On defini une liste chainee de mots et types */
struct word
{
	char *word_name;
	int type;
	struct word *p_suivant;
};
 
	/* On declare le premier element de la liste */
struct word *p_word_list = NULL;
 
 
extern void *malloc ();
 
/*	-----------------------------------------------------------------------
	ajouter_mot ()
	-----------------------------------------------------------------------
	Role : ajoute un mot dans la liste (seulement si il n'y est pas deja)
	-----------------------------------------------------------------------
*/
int ajouter_mot (int type, char *word)
{
	struct word *p_word = NULL;
 
	/* On verifie d'abord que le mot ne se trouve pas deja dans la liste */
	if (rechercher_mot (word) != LOOKUP)
	{
		printf ("!!! WARNING %s existe deja \n", word);
		return 0;
	}
 
	/* On alloue un espace memoire */
 	p_word = malloc (sizeof *p_word);
 
		if (p_word != NULL)
		{
			p_word->p_suivant = p_word_list;
			p_word->type = type;
 
			/* On alloue l'espace memoire pour la chaine de caractere */
			p_word->word_name = malloc ((strlen (word) + 1) * sizeof (char));
 
			if (p_word->word_name != NULL)
			{
				strcpy (p_word->word_name, word);
			}
 
			p_word_list = p_word;
		}
	return 1;
}
 
/*	------------------------------------------------------------------------
	rechercher_mot ()
	------------------------------------------------------------------------
	Role : Retourne le type du mot dans une liste chainne (LOOKUP si le mot
	n'existe pas)
	------------------------------------------------------------------------
*/
int rechercher_mot (char *word)
{
	struct word *p_tmp = p_word_list;
 
	while (p_tmp != NULL)
	{
		if (strcmp (p_tmp->word_name, word) == 0)
		{
			return p_tmp->type;
		}
 
		p_tmp = p_tmp->p_suivant;
	}
 
	return LOOKUP;
}
et voilà le .y

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
 
%{
#include <stdio.h>
%}
 
%token NOM PRONOM VERBE ADVERBE ADJECTIF PREPOSITION CONJONCTION
 
%%
phrase : phrase_simple {printf ("Phrase simple\n");}
	| phrase_composee {printf ("Phrase composee\n");}
	;
 
phrase_simple : sujet verbe objet
	| sujet verbe objet phrase_preposition
	;
 
phrase_composee : phrase_simple CONJONCTION phrase_simple
	| phrase_composee CONJONCTION phrase_simple
	;
 
sujet : NOM
	| PRONOM
	| ADJECTIF sujet
	;
 
verbe : VERBE
	| ADVERBE VERBE
	|verbe VERBE
	;
 
objet : NOM
	| ADJECTIF objet
	;
 
phrase_preposition : PREPOSITION NOM
	;
 
%%
 
extern FILE *yyin;
 
main ()
{
	while (!feof (yyin))
	{
		yyparse ();
	}
}
 
yyerror (s)
char *s;
{
	fprintf (stderr, "%s\n", s);
}
si quelqu'un pouvait me filer un coup de main, merci