Click here to load reader

ISBN 0-321-49362-1 Chapitre 4 Analyse lexicale et syntaxique

  • View
    116

  • Download
    7

Embed Size (px)

Text of ISBN 0-321-49362-1 Chapitre 4 Analyse lexicale et syntaxique

  • Page 1
  • ISBN 0-321-49362-1 Chapitre 4 Analyse lexicale et syntaxique
  • Page 2
  • Copyright 2007 Addison-Wesley. All rights reserved.1-2 Chapitre 4: Sujets Introduction Analyse lexicale Analyse syntaxique Mthode descendante Mthode ascendante
  • Page 3
  • Copyright 2007 Addison-Wesley. All rights reserved.1-3 Introduction 3 principales mthodes pour implmenter un langage de programmation: compilation interprtation mthode hybride Dans tous les cas, il est ncessaire de se rfrer au code source pour dtecter les erreurs de syntaxe. Pratiquement toutes les mthodes d'analyse de la syntaxe reposent sur une description formelle de la syntaxe du langage (grammaire hors-contexte)
  • Page 4
  • Copyright 2007 Addison-Wesley. All rights reserved.1-4 Analyse syntaxique Deux parties: Au niveau infrieur il y a l'analyseur lexical (automates finis) Au niveau suprieur il y a l'analyseur syntaxique ou parseur (automates pile)
  • Page 5
  • Copyright 2007 Addison-Wesley. All rights reserved.1-5 Dcrire la syntaxe l'aide de grammaires Procure une description claire et concise Le parseur peut tre construit partir de la grammaire La sparation des analyses lexicale et syntaxique facilite la maintenance car modulaire
  • Page 6
  • Copyright 2007 Addison-Wesley. All rights reserved.1-6 Avantages de la sparation Simplicit mthodes moins complexes peuvent tre utilises pour l'analyse lexicale; simplifie le parseur Efficacit- sparation permet l'optimisation de l'analyseur lexical. Portabilit l'analyseur lexical dpend souvent de la plateforme (lecture de fichiers) alors que l'analyseur syntaxique est toujours portable.
  • Page 7
  • Copyright 2007 Addison-Wesley. All rights reserved.1-7 Analyse lexicale Agit comme interface pour l'analyseur syntaxique Identifie les parties du programme source correspondant aux lexmes Un lexme est un mot correspondant une catgorie de mots (token) Par exemple, la variable somme est un lexme appartenant au token identificateur
  • Page 8
  • Copyright 2007 Addison-Wesley. All rights reserved.1-8 Analyse lexicale (suite) L'analyseur syntaxique appelle l'analyseur lexical lorsqu'il a besoin d'un autre token 3 approches pour construire un analyseur lexical: crire une description formelle des tokens (expressions rgulire) et utiliser un outil logiciel (ex. lex) pour transformer ces descriptions en un analyseur lexical. Concevoir un diagramme d'tat pour dcrire les tokens et implmenter ce diagramme sous forme de programme. Concevoir un diagramme d'tat pour dcrire les tokens et implmenter ce diagramme l'aide d'une table.
  • Page 9
  • Copyright 2007 Addison-Wesley. All rights reserved.1-9 Construire un analyseur lexical Par exemple, si on veut lire trois types de tokens: identificateurs: lettre suivie de lettres ou de chiffres. mots clefs: suite de lettres entiers littraux: chiffre suivit de chiffres Approche nave: Une transition pour chaque tat et chaque caractre trop gros!
  • Page 10
  • Copyright 2007 Addison-Wesley. All rights reserved.1-10 Construire un analyseur lexical (suite) Plusieurs transition peuvent tre combines pour simplifier le diagramme Une seule classe de caractres pour toutes les lettres majuscules et minuscule (LETTER) Une seule classe de caractres pour tous les chiffres (DIGIT)
  • Page 11
  • Copyright 2007 Addison-Wesley. All rights reserved.1-11 Construire un analyseur lexical (suite) Plutt que d'avoir des tats distincts pour les mots rservs, on traite ceux-ci de la mme manire que les identificateurs On consulte une table pour dterminer si un lexme est un mot clef
  • Page 12
  • Copyright 2007 Addison-Wesley. All rights reserved.1-12 Diagramme d'tat
  • Page 13
  • Copyright 2007 Addison-Wesley. All rights reserved.1-13 Construire un analyseur lexical (suite) Variables globales et utilitaires: char nextChar : contient le dernier caractre lu int charClass : LETTER (0), DIGIT (1), UNKNOWN (-1) char lexeme[100] : chane de caractre getChar() lit le prochain caractre et le place dans nextChar. Met la classe du caractre dans charClass. addChar() Ajoute nextChar la fin de lexeme int lookup(char*) dtermine si lexeme est un mot clef
  • Page 14
  • Copyright 2007 Addison-Wesley. All rights reserved.1-14 Implmentation int lex() { getChar(); switch (charClass) { case LETTER: addChar(); getChar(); while (charClass == LETTER || charClass == DIGIT) { addChar(); getChar(); } return lookup(lexeme); break;
  • Page 15
  • Copyright 2007 Addison-Wesley. All rights reserved.1-15 Implmentation case DIGIT: addChar(); getChar(); while (charClass == DIGIT) { addChar(); getChar(); } return INT_LIT; break; } /* End of switch */ } /* End of function lex */
  • Page 16
  • Copyright 2007 Addison-Wesley. All rights reserved.1-16 L'analyseur syntaxique Objectifs: Trouver toutes les erreurs de syntaxe et envoyer un message appropri. Produire l'arbre syntaxique ou, du moins, l'information ncessaire pour le construire.
  • Page 17
  • Copyright 2007 Addison-Wesley. All rights reserved.1-17 L'analyseur syntaxique (suite) Deux catgories d'analyseurs syntaxiques: Descendant produit l'arbre syntaxique en commenant par la racine Ascendant commence par les feuilles Dans les deux cas on utilise une grammaire hors-contexte comme description du langage.
  • Page 18
  • Copyright 2007 Addison-Wesley. All rights reserved.1-18 L'analyseur syntaxique (suite) Complexit partir de toute grammaire non ambigu, il est possible de construire un analyseur syntaxique fonctionnant en temps O(n 3 ), o n est la taille de l'entre. On utilise plutt un type restreint de grammaire permettant d'effectuer l'analyse syntaxique en temps O(n)
  • Page 19
  • Copyright 2007 Addison-Wesley. All rights reserved.1-19 L'analyseur syntaxique (suite) Parseurs descendants On commence avec le symbole de dpart et on dtermine la squence de rgles ncessaires pour driver l'entre (suite de token) entre Algorithme LL: Left-to-right scan (lecture de l'entre de gauche droite) Leftmost derivation (drivation par la gauche)
  • Page 20
  • Copyright 2007 Addison-Wesley. All rights reserved.1-20 L'analyseur syntaxique (suite) Parseurs ascendants On commence avec l'entre et on applique rebours les rgles de la grammaire afin d'obtenir la symbole de dpart. entre Algorithme LR: Left-to-right scan Rightmost derivation
  • Page 21
  • Copyright 2007 Addison-Wesley. All rights reserved.1-21 Analyseur rcursif-descendant (LL) Un sous-programme pour chaque non-terminal Les sous-programmes sont mutuellement rcursifs Les grammaires hors-contextes tendues sont appropries pour ce type d'analyseur syntaxique car elles minimisent le nombre de sous- programmes. On suppose l'existence d'un analyseur lexical lex, qui met le prochain token dans la variable globale nextToken
  • Page 22
  • Copyright 2007 Addison-Wesley. All rights reserved.1-22 Analyseur rcursif-descendant (suite) Exemple: {(+ | -) } {(* | /) } id | ( )
  • Page 23
  • Copyright 2007 Addison-Wesley. All rights reserved.1-23 Analyseur rcursif-descendant (suite) // //Sous-programme pour le non-terminal expr // void expr() { term(); // Sous-programme pour le non-terminal term while (nextToken == PLUS_CODE || nextToken == MINUS_CODE){ lex(); term(); }
  • Page 24
  • Copyright 2007 Addison-Wesley. All rights reserved.1-24 Analyseur rcursif-descendant (suite) // // Sous-programme pour le non-terminal term // void term() { factor(); // Sous-programme pour le non-terminal factor while (nextToken == MULT_CODE || nextToken == DIV_CODE){ lex(); factor(); }
  • Page 25
  • Copyright 2007 Addison-Wesley. All rights reserved.1-25 Analyseur rcursif-descendant (suite) void factor() { if (nextToken) == ID_CODE) lex(); else if (nextToken == LEFT_PAREN_CODE) { lex(); expr(); if (nextToken == RIGHT_PAREN_CODE) lex(); else error(); } else error(); }
  • Page 26
  • Copyright 2007 Addison-Wesley. All rights reserved.1-26 Analyseur rcursif-descendant (suite) Grammaires LL Forme particulire Le problme de la rcursion gauche: A Ab ou A Bb B Ac De telles grammaires ne peuvent pas tre utilise par un analyseur syntaxique descendant On peut cependant toujours remplacer une telle grammaire par une autre n'ayant pas ce problme
  • Page 27
  • Copyright 2007 Addison-Wesley. All rights reserved.1-27 Analyseur rcursif-descendant (suite) Autre problme: Deux rgles: A et A tels que gnre a' et gnre a' Comment choisir entre ces deux rgles? La grammaire doit tre modifie mais cela n'est pas toujours possible
  • Page 28
  • Copyright 2007 Addison-Wesley. All rights reserved.1-28 Analyseurs ascendants Forme sententielle droite: On dveloppe le non- terminal le plus droite en premier Exemple: E E + T | T T T * F | F F (E) | id E E+T E+T*F E+T*id E+F*id E+id*id F+id*id id+id*id On veut partir de id+id*id et remonter vers E
  • Page 29
  • Copyright 2007 Addison-Wesley. All rights reserved.1-29 Analyseurs ascendants (suite) Handle: segment d'une forme sententielle (drive par la droite) correspondant la partie droite de la dernire rgle utilise Exemple: E E+T E+F E+id E+T+id E+T est le handle de E+T+id Remarque: Si la grammaire est non-ambigu alors le handle est unique Problme: Comment trouver le handle?
  • Page 30
  • Co

Search related