102 | | Il faut maintenant définir dans le fichier ''vst.y'' les règles de la grammaire |
103 | | correspondant au format ''.vst''. Ce fichier "vst.y'' est utilisé par '''bison''' pour |
104 | | générer la fonction .c constituant l'analyseur lexical. |
105 | | Ces règles de grammaire sont des combinaisons de token reconnus par flex. |
| 102 | L'outil '''bison''' est un générateur d'analyseur syntaxique. |
| 103 | Il prend en entrée un fichier ''vst.y'' contenant la définition des règles de la grammaire |
| 104 | correspondant au format ''.vst'', et génère la fonction yyparse() constituant l'analyseur |
| 105 | syntaxique, dans un fichier vst.tab.c. |
| 106 | |
173 | | L'idée est de construire l'analyseur de manière incrémentale de maniËre incrÈmentale. |
174 | | La syntaxe de la dÈclaration des signaux ayant ÈtÈ dÈfinie, vous allez, |
175 | | dans cet ordre~: |
176 | | \begin{enumerate} |
177 | | \itemsep=-.5ex |
178 | | \item dÈfinir les rËgles de dÈclaration des ports en partant |
179 | | de l'exemple \texttt{port.ex} qui vous est fourni~; |
180 | | \item dÈfinir les rËgles de dÈclaration du composant en partant |
181 | | de l'exemple \texttt{component.ex} qui vous est fourni~; |
182 | | \item dÈfinir les rËgles de dÈclaration de l'entitÈ en partant |
183 | | de l'exemple \texttt{entity.ex} qui vous est fourni~; |
184 | | \item dÈfinir toutes les rËgles nÈcessaires ‡ la lecture du fichier |
185 | | \texttt{exemple.vst}. |
186 | | \end{enumerate} |
| 174 | Une règle de grammaire est construction grammaticale utilisant des token reconnus par ''flex''... |
| 175 | ou d'autres constructions grammaticales, plus simples. La grammaire a donc une structure arborescente. |
188 | | Vous pouvez faire des validations intermÈdiaires simplement en dÈclarant |
189 | | un nouveau symbole de dÈpart gr‚ce ‡ |
190 | | %\small |
191 | | \begin{verbatim} |
| 177 | Dessinez explicitement le graphe représentant la grammaire associée au format ''.vst''. |
| 178 | Dans ce graphe, qui a - presque - une structure d'arbre, chaque noeud correspond à une construction grammaticale |
| 179 | (c'est à dire une règle de grammaire), et un arc orienté entre deux noeuds X et Y signifie : "La construction grammaticale |
| 180 | Y est contenue dans la construction grammaticale X". Les constructions grammaticales élémentaires sont les tokens, |
| 181 | et constituent les "feuilles" de l'arbre. |
| 182 | |
| 183 | La syntaxe de la construction grammaticale correspondant à la déclaration d'un signal a déjà été définie. Il reste donc à : |
| 184 | 1. Définir la construction grammaticale correspondant à la délaration d'un port |
| 185 | 1. Définir la construction grammaticale correspondant à la déclaration d'un composant |
| 186 | 1. Définir la construction grammaticale correspondant à la déclaration d'une entité |
| 187 | 1. Définir la construction grammaticale correspondant à la déclaration d'une instance |
| 188 | 1. Définir toutes les règles nécessaires à l'analyse du fichier complet. |
| 189 | |
| 190 | Vous pouvez faire des validations intermédiaires simplement en utilisant le symbole racine: |
| 191 | {{{ |
193 | | \end{verbatim} |
194 | | \normalsize |
195 | | |
196 | | Vous pouvez considÈrer que le TME est terminÈ lorsque le parser construit |
197 | | ‡ partir des deux fichiers vst.l et vst.y est capable de lire et de reconnaitre |
198 | | la totalitÈ du fichier exemple.vst. |
199 | | |
200 | | \small |
201 | | \subsubsection*{signal.ex} |
202 | | \begin{multicols}{2} |
203 | | \begin{verbatim} |
204 | | signal opc : bit; |
205 | | signal read : bit; |
206 | | signal lock : bit; |
207 | | signal a : bit; |
208 | | signal d : bit; |
209 | | signal ack : bit; |
210 | | signal tout : bit; |
211 | | signal it_0 : bit; |
212 | | signal req0 : bit; |
213 | | signal req1 : bit; |
214 | | signal gnt0 : bit; |
215 | | signal gnt1 : bit; |
216 | | signal sel1 : bit; |
217 | | signal sel2 : bit; |
218 | | signal sel3 : bit; |
219 | | signal sel4 : bit; |
220 | | signal sel5 : bit; |
221 | | signal sel6 : bit; |
222 | | signal sel7 : bit; |
223 | | signal sel8 : bit; |
224 | | signal sel9 : bit; |
225 | | signal snoopdo: bit; |
226 | | \end{verbatim} |
227 | | \end{multicols} |
228 | | \subsubsection*{port.ex} |
229 | | \begin{multicols}{2} |
230 | | \begin{verbatim} |
231 | | port ( |
232 | | clk : in bit; |
233 | | resetn : in bit; |
234 | | ireq : out bit; |
235 | | ignt : in bit; |
236 | | dreq : out bit; |
237 | | dgnt : in bit; |
238 | | opc : out bit; |
239 | | lock : out bit; |
240 | | read : inout bit; |
241 | | a : inout bit; |
242 | | d : inout bit; |
243 | | ack : in bit; |
244 | | tout : in bit; |
245 | | it_0 : in bit; |
246 | | it_1 : in bit; |
247 | | it_2 : in bit; |
248 | | it_3 : in bit; |
249 | | it_4 : in bit; |
250 | | it_5 : in bit; |
251 | | snoopdo: in bit |
252 | | ); |
253 | | \end{verbatim} |
254 | | \end{multicols} |
255 | | \subsubsection*{component.ex} |
256 | | \begin{multicols}{2} |
257 | | \begin{verbatim} |
258 | | component PIR3000 |
259 | | port ( |
260 | | clk : in bit; |
261 | | resetn : in bit; |
262 | | ireq : out bit; |
263 | | ignt : in bit; |
264 | | dreq : out bit; |
265 | | dgnt : in bit; |
266 | | opc : out bit; |
267 | | lock : out bit; |
268 | | read : inout bit; |
269 | | a : inout bit; |
270 | | d : inout bit; |
271 | | ack : in bit; |
272 | | tout : in bit; |
273 | | it_0 : in bit; |
274 | | it_1 : in bit; |
275 | | it_2 : in bit; |
276 | | it_3 : in bit; |
277 | | it_4 : in bit; |
278 | | it_5 : in bit; |
279 | | snoopdo: in bit |
280 | | ); |
281 | | end component; |
282 | | \end{verbatim} |
283 | | \end{multicols} |
284 | | \subsubsection*{entity.ex} |
285 | | \begin{verbatim} |
286 | | entity EXEMPLE is |
287 | | port ( |
288 | | clk : in bit; |
289 | | resetn : in bit |
290 | | ); |
291 | | end exemple; |
292 | | \end{verbatim} |
293 | | \scriptsize |
294 | | \newpage |
295 | | \subsubsection*{expemple.vst} |
296 | | \begin{multicols}{2} |
297 | | \begin{verbatim} |
298 | | end exemple; |
299 | | entity EXEMPLE is |
300 | | port ( |
301 | | clk : in bit; |
302 | | resetn : in bit |
303 | | ); |
304 | | end exemple; |
305 | | |
306 | | architecture structural of system is |
307 | | component PIR3000 |
308 | | port ( |
309 | | clk : in bit; |
310 | | resetn : in bit; |
311 | | ireq : out bit; |
312 | | ignt : in bit; |
313 | | dreq : out bit; |
314 | | dgnt : in bit; |
315 | | opc : out bit; |
316 | | lock : out bit; |
317 | | read : inout bit; |
318 | | a : inout bit; |
319 | | d : inout bit; |
320 | | ack : in bit; |
321 | | tout : in bit; |
322 | | it_0 : in bit; |
323 | | it_1 : in bit; |
324 | | it_2 : in bit; |
325 | | it_3 : in bit; |
326 | | it_4 : in bit; |
327 | | it_5 : in bit; |
328 | | snoopdo: in bit |
329 | | ); |
330 | | end component; |
331 | | |
332 | | component PIRAM |
333 | | port ( |
334 | | clk : in bit; |
335 | | resetn : in bit; |
336 | | sel : in bit; |
337 | | opc : in bit; |
338 | | read : in bit; |
339 | | a : in bit; |
340 | | d : inout bit; |
341 | | ack : out bit; |
342 | | tout : in bit |
343 | | ); |
344 | | end component; |
345 | | |
346 | | component PITTY |
347 | | port ( |
348 | | clk : in bit; |
349 | | resetn : in bit; |
350 | | sel : in bit; |
351 | | opc : in bit; |
352 | | read : in bit; |
353 | | a : in bit; |
354 | | d : inout bit; |
355 | | ack : out bit; |
356 | | tout : in bit |
357 | | ); |
358 | | end component; |
359 | | |
360 | | component PIBCU |
361 | | port ( |
362 | | clk : in bit; |
363 | | req0 : in bit; |
364 | | req1 : in bit; |
365 | | gnt0 : out bit; |
366 | | gnt1 : out bit; |
367 | | sel1 : out bit; |
368 | | sel2 : out bit; |
369 | | sel3 : out bit; |
370 | | sel4 : out bit; |
371 | | sel5 : out bit; |
372 | | sel6 : out bit; |
373 | | sel7 : out bit; |
374 | | sel8 : out bit; |
375 | | sel9 : out bit; |
376 | | snoopdo : out bit; |
377 | | resetn : in bit; |
378 | | opc : in bit; |
379 | | read : in bit; |
380 | | lock : in bit; |
381 | | a : in bit; |
382 | | d : inout bit; |
383 | | ack : inout bit; |
384 | | tout : out bit; |
385 | | it : out bit |
386 | | ); |
387 | | end component; |
388 | | |
389 | | signal opc : bit; |
390 | | signal read : bit; |
391 | | signal lock : bit; |
392 | | signal a : bit; |
393 | | signal d : bit; |
394 | | signal ack : bit; |
395 | | signal tout : bit; |
396 | | |
397 | | signal it_0 : bit; |
398 | | signal it_1 : bit; |
399 | | signal it_2 : bit; |
400 | | signal it_3 : bit; |
401 | | signal it_4 : bit; |
402 | | signal it_5 : bit; |
403 | | |
404 | | signal req0 : bit; |
405 | | signal req1 : bit; |
406 | | |
407 | | signal gnt0 : bit; |
408 | | signal gnt1 : bit; |
409 | | |
410 | | signal sel1 : bit; |
411 | | signal sel2 : bit; |
412 | | signal sel3 : bit; |
413 | | signal sel4 : bit; |
414 | | signal sel5 : bit; |
415 | | signal sel6 : bit; |
416 | | signal sel7 : bit; |
417 | | signal sel8 : bit; |
418 | | signal sel9 : bit; |
419 | | signal snoopdo: bit; |
420 | | |
421 | | begin |
422 | | |
423 | | r3000 : Pir3000 |
424 | | port map ( |
425 | | clk => clk, |
426 | | resetn => resetn, |
427 | | ireq => req0, |
428 | | ignt => gnt0, |
429 | | dreq => req1, |
430 | | dgnt => gnt1, |
431 | | opc => opc, |
432 | | lock => lock, |
433 | | read => read, |
434 | | a => a, |
435 | | d => d, |
436 | | ack => ack, |
437 | | tout => tout, |
438 | | snoopdo => snoopdo, |
439 | | it_0 => it_0, |
440 | | it_1 => it_1, |
441 | | it_2 => it_2, |
442 | | it_3 => it_3, |
443 | | it_4 => it_4, |
444 | | it_5 => it_5 |
445 | | ); |
446 | | |
447 | | rst : piram |
448 | | port map ( |
449 | | clk => clk, |
450 | | resetn => resetn, |
451 | | sel => sel1, |
452 | | opc => opc, |
453 | | read => read, |
454 | | a => a, |
455 | | d => d, |
456 | | ack => ack, |
457 | | tout => tout |
458 | | ); |
459 | | |
460 | | exc : piram |
461 | | port map ( |
462 | | clk => clk, |
463 | | resetn => resetn, |
464 | | sel => sel2, |
465 | | opc => opc, |
466 | | read => read, |
467 | | a => a, |
468 | | d => d, |
469 | | ack => ack, |
470 | | tout => tout |
471 | | ); |
472 | | |
473 | | bcu : pibcu |
474 | | port map ( |
475 | | clk => clk, |
476 | | req0 => req0, |
477 | | req1 => req1, |
478 | | |
479 | | gnt0 => gnt0, |
480 | | gnt1 => gnt1, |
481 | | |
482 | | sel1 => sel1, |
483 | | sel2 => sel2, |
484 | | sel3 => sel3, |
485 | | sel4 => sel4, |
486 | | sel5 => sel5, |
487 | | sel6 => sel6, |
488 | | sel7 => sel7, |
489 | | sel8 => sel8, |
490 | | sel9 => sel9, |
491 | | |
492 | | resetn => resetn, |
493 | | opc => opc, |
494 | | read => read, |
495 | | lock => lock, |
496 | | a => a, |
497 | | d => d, |
498 | | ack => ack, |
499 | | tout => tout, |
500 | | snoopdo=> snoopdo, |
501 | | it => it_1 |
502 | | ); |
503 | | |
504 | | ins : piram |
505 | | port map ( |
506 | | clk => clk, |
507 | | resetn => resetn, |
508 | | sel => sel3, |
509 | | opc => opc, |
510 | | read => read, |
511 | | a => a, |
512 | | d => d, |
513 | | ack => ack, |
514 | | tout => tout |
515 | | ); |
516 | | |
517 | | dat : piram |
518 | | port map ( |
519 | | clk => clk, |
520 | | resetn => resetn, |
521 | | sel => sel4, |
522 | | opc => opc, |
523 | | read => read, |
524 | | a => a, |
525 | | d => d, |
526 | | ack => ack, |
527 | | tout => tout |
528 | | ); |
529 | | |
530 | | tty : pitty |
531 | | port map ( |
532 | | clk => clk, |
533 | | resetn => resetn, |
534 | | sel => sel5, |
535 | | opc => opc, |
536 | | read => read, |
537 | | a => a, |
538 | | d => d, |
539 | | ack => ack, |
540 | | tout => tout |
541 | | ); |
542 | | |
543 | | ttz : pitty |
544 | | port map ( |
545 | | clk => clk, |
546 | | resetn => resetn, |
547 | | sel => sel9, |
548 | | opc => opc, |
549 | | read => read, |
550 | | a => a, |
551 | | d => d, |
552 | | ack => ack, |
553 | | tout => tout |
554 | | ); |
555 | | |
556 | | end structural; |
557 | | \end{verbatim} |
558 | | \end{multicols} |
559 | | |
560 | | \end{document} |
561 | | |
562 | | |
| 193 | }}} |
| 194 | Vous pouvez considérer que le TME est terminé lorsque le parser construit |
| 195 | à partir des deux fichiers ''vst.l'' et ''vst.y'' est capable de lire et de reconnaitre |
| 196 | la totalité du fichier ''exemple.vst''. |