Erreur Lexique et syntaxe 1. Introduction 1. Comment décrire un langage de prog
Erreur Lexique et syntaxe 1. Introduction 1. Comment décrire un langage de programmation 2. Lexique 1. Identificateurs et Mots-clés 2. Constantes 3. Symboles spéciaux 4. Commentaires 3. Syntaxe 1. Déclarations 2. Accès aux variables 3. Expressions 1. Opérateurs arithmétiques 2. Opérateurs relationnels 3. Opérateurs logiques 4. Priorités 4. Instructions Introduction Les deux chapitres précédents ont présenté les principes de base de la programmation impérative, à savoir les notions de : actions ; variables et affectation ; types abstraits et concrets (énumération, tableaux, produits, sommes). Le but de cette seconde partie du cours est double : donner les éléments nécessaires à l'apprentissage d'un nouveau langage de programmation impérative (ou éventuellement autre) à partir de son manuel de référence ; expliquer plus en détail certains aspects de la programmation impérative comme les règles de portée, l'affectation, le passage de paramètre, les pointeurs, etc. Pour cela, nous allons expliquer comment décrire avec précision un langage de programmation. Comment décrire un langage de programmation Lorsque l'on apprend une langue (par exemple l'anglais), on doit maîtriser : le vocabulaire : mots du dictionnaire, déclinaisons, conjugaisons, etc. ; la grammaire : comment composer des phrases correctes du point de vue de leur forme et de leur structure sinon de leur sens. Par exemple, "le chat mange la maison" est correct du point de vue grammatical. le sens des mots et des phrases. Généralement, cet apprentissage se fait en même temps que le vocabulaire et la grammaire : on apprend les mots corrects et leur sens, et les constructions grammaticales et leur sens. Cependant, l'exemple ci-dessus montre que l'on peut séparer la correction grammaticale de la correction du sens (dite correction sémantique). Un langage de programmation (que l'on peut considérer comme une langue artificielle par rapport aux langues naturelles comme le français et l'anglais) peut être décrit par les mêmes 3 niveaux : le vocabulaire, appelé lexique ; la grammaire, appelée syntaxe ; le sens, appelé sémantique. La différence principale entre un langage de programmation et une langue naturelle est qu'un langage de programmation est beaucoup plus simple et beaucoup plus strict qu'une langue naturelle. Une bonne façon de mettre en évidence les trois niveaux ci-dessus est de prendre des exemples de (morceaux de) programmes erronés (ici en Pascal) : 1 program p; 2 var 12x, y : boolean; 3 t : array [1..10] of integer; 4 begin 5 if y <> 0 6 else t[11] := 0; 7 end. La ligne 2 contient une erreur lexicale : 12x n'est pas un identificateur légal en Pascal. La ligne 5/6 contient une erreur syntaxique : la construction if...else n'est pas légale en Pascal (il faut une partie then). La ligne 5 contient également une erreur sémantique : la variable y est déclarée booléenne, on ne peut donc la comparer à l'entier 0. Enfin la ligne 6 contient une autre erreur sémantique : 11 n'est pas un indice valide pour le tableau t. Ces deux erreurs sémantiques sont de nature différente : la première peut être détectée simplement en regardant le texte du programme, on dit qu'il s'agit d'une erreur de sémantique statique. La seconde ne peut être détectée (dans le cas général) que lorsque le programme s'exécute, on dit qu'il s'agit d'une erreur de sémantique dynamique. Nous reviendrons sur ces notions en temps utile. Les trois niveaux lexique/syntaxe/sémantique sont également à la base de la conception des compilateurs. Un compilateur est un programme qui traduit un programme écrit dans un langage évolué (par exemple Pascal) en code machine exécutable directement sur la machine. C'est grâce à un compilateur que l'on peut écrire et exécuter des programmes dans des langages évolués. La structure générale d'un compilateur consiste à découper le programme qu'il traduit en mots (unités lexicales), a structurer ces mots en arbres syntaxiques, puis à analyser cet arbre pour vérifier qu'il est sémantiquement correct. Ensuite seulement, la traduction proprement dite peut commencer : chaque morceau de l'arbre est traduit en langage machine équivalent, puis ce langage machine est éventuellement optimisé. Inutile de dire qu'un compilateur est un programme particulièrement complexe ! Ces concepts sont approfondis dans le cours de M3 Spécialité Informatique. Dans la suite de ce chapitre, nous nous intéressons aux éléments usuels des lexiques des langages de programmation impératifs et à la description de la syntaxe des langages. Lexique Les unités lexicales d'un langage décrivent ses composants de base, les "mots" de son vocabulaires. La plupart des langages sont fondés sur des vocabulaires très proches. Nous allons ici décrire les principales catégories d'unités lexicales et détailler le cas du langage Pascal. Identificateurs et Mots-clés Les "mots" les plus évidents dans un programme sont les identificateurs et les mots-clés. Les identificateurs sont utilisés pour dénoter des "objets" du programme : variables, fonctions, types, etc. Les mots-clés sont utilisés pour faciliter la reconnaissance de la structure du programme. Par exemple en Pascal, les mots-clés begin et end délimitent des blocs d'instructions. En général (en en particulier en Pascal), les identificateurs sont constitués d'au moins une lettre, suivie de lettres ou de chiffres. Certains caractères (comme le souligné "_") sont parfois également autorisés. Le nombre de caractères qui sont effectivement utilisés pour différencier deux identificateurs dépend du langage : 8 dans la version originale de Pascal. Ainsi 12x est illégal mais x12 est légal toto_tata_tutu et toto_tata_titi sont identiques Les mots-clés sont des mots particuliers qui ne peuvent pas être utilisés comme identificateurs. En Pascal, la liste des mots-clés est la suivante : program const var type function procedure begin end array record set of file if then else while do repeat until case for to downto and or not in div mod goto label nil packed with Constantes Les constants sont de mots qui désignent des valeurs d'un type prédéfini du langage. Typiquement, on trouve les constantes entières, réelles, booléennes, caractères et éventuellement chaînes. Ce qui suit concerne le langage Pascal : Les entiers et les réels s'écrivent sous la forme mathématique habituelle : 10 -50 32767 153648293764234 (illégal car trop grand) 3.14 -0.05 6.02e+23 1.0e-6 1.0 (différent de 1) Les constants booléennes sont les deux mots true et false Les constantes caractères sont notées entre simple quotes. Le caractère simple quote est noté en répétant la quote : 'a' '9' ';' '''' Les constantes chaînes de caractères sont également notées entre simple quotes, avec répétition des quotes éventuelles : 'Bonjour' 'Commet allez-vous aujourd''hui' Dans d'autres langages, par exemple C, on utilise des doubles quotes pour les chaînes de caractères, et le caractère '\' ("backslash") pour "protéger" les doubles quotes et indiquer des caractères spéciaux : "Il dit : \"bonjour !\"" "Un deux\ntrois quatre" "\n" indique un retour à la ligne "voici un backslash : \\" Symboles spéciaux Les langages de programmation utilisent de nombreux symboles spéciaux no alphanumériques. Par exemple, en Pascal il y en a 24 : + - * / := . , ; : ' = <> < <= >= > ( ) [ ] { } ^ .. Certains de ces caractères sont des opérateurs artihmétiques et relationnels : + - * / = <> < <= > >= D'autres correspondent à des opérateurs particuliers : := affectation [ ] accès à un tableau ^ déréférencer un pointeur D'autres encore sont utilisés pour séparer des instructions ou grouper des expressions : , séparer les éléments d'une liste ; séparer des instructions ( ) grouper des sous-expressions L'espace sert de séparateur, c'est-à-dire qu'il permet de séparer des unités lexicales adjacentes. Par exemple typet=array[1..10]ofinteger est incorrect et doit s'écrire avec au moins deux espaces : type t=array[1..10]of integer type t = array [1 .. 10] of integer En Pascal, les fins de ligne et les tabulations sont également des séparateurs. Commentaires Les commentaires sont des parties du programme qui sont ignorées du compilateur et qui ne changent donc rien au sens du programme. Ils sont cependant très importants pour documenter le programme, notamment en vue de son utilisation par quelqu'un d'autre ou de sa modification ultérieure (il est très rare d'écrire un programme que l'on ne modifie plus jamais et que l'on ne réutilise pas par ailleurs). En Pascal, les deux formes suivantes sont acceptées : (* un commentaire *) { un autre commentaire } Syntaxe La syntaxe d'un langage décrit les façons correctes d'assembler des unités lexicales pour écrire des programmes. Un programme syntaxiquement correct peut encore être erroné s'il contient des erreurs sémantiques. Pour décrire la grammaire d'une langue naturelle, on utilise parfois des schémas (et le plus souvent des règles). Par exemple, un phrase en français peut être composée d'un groupe sujet, d'un groupe verbal, d'un groupe complément et d'un point final. Le groupe sujet est constitué d'un article, d'un adjectif éventuel et d'un nom ou d'un nom et d'un adjectif. Le groupe verbal est composé d'un auxiliaire éventuel et d'un verbe. Le groupe complément est composé d'un préposition éventuelle et d'un groupe sujet. Par exemple, les phrases suivantes correspondent à cette description : Le chat mange la souris. Le cadavre uploads/Ingenierie_Lourd/ erreur-lexique-et-syntaxe.pdf
Documents similaires










-
26
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Fev 05, 2021
- Catégorie Heavy Engineering/...
- Langue French
- Taille du fichier 0.2018MB