Symboles terminaux et non terminauxEn informatique, et notamment en théorie des langages, on appelle symboles terminaux et non terminaux les symboles utilisés dans les règles de production d'une grammaire formelle. Les symboles terminaux et les symboles non terminaux font partie d'ensembles disjoints. Symboles terminauxLes symboles terminaux sont des caractères littéraux qui peuvent apparaître dans les règles de production (en entrée ou sortie) d'une grammaire formelle et ne peuvent pas être subdivisés en éléments plus petits. Ce sont plus précisément des éléments qui ne peuvent pas être changés via les règles de la grammaire. Par exemple, une grammaire définie par les deux règles :
présente a comme symbole terminal parce qu'aucune règle n'existe pour le changer en autre chose (cependant x est non terminal puisqu'il accepte deux règles pour être modifié). Un langage formel défini (ou engendré) par une grammaire particulière est l'ensemble des chaînes ou mots de caractères terminaux produites par la grammaire ; les non-terminaux n'étant pas construits entièrement de terminaux ne peuvent pas apparaître comme lexèmes appartenant au langage. Dans un contexte d'analyse syntaxique, étant opposé à la théorie des langages de programmation et des compilateurs, les termes symbole terminal et jeton sont souvent considérés synonymes. Selon le Dragon book[1] :
Les symboles terminaux, ou juste terminaux, sont les symboles élémentaires du langage défini par une grammaire formelle. Symboles non terminauxLes symboles non terminaux, ou non-terminaux, sont les symboles qui peuvent être remplacés ; il y a donc des chaînes composées de symboles terminaux et non terminaux. Ils peuvent également être appelés variables syntactiques ou variables. Une grammaire formelle inclut un symbole de départ, membre désigné de l'ensemble des non-terminaux à partir duquel toutes les chaînes de caractères du langage peuvent être dérivées par des applications ou des règles de production successives. En fait, le langage défini par une grammaire est précisément l'ensemble des chaînes terminales qui peuvent être ainsi dérivés. Une grammaire non contextuelle est une grammaire dans laquelle le membre gauche de chaque règle de production est un seul symbole non terminal. Cette restriction est non triviale, tous les langages ne peuvent pas être générés par des grammaires non contextuelles. Ceux-là sont appelés langages non contextuels. Ce sont ces langages-là qui sont reconnus par des automates à pile non déterministes. Les langages non contextuels constituent la base théorique de la syntaxe de la plupart des langages de programmation. Règles de productionUne grammaire est définie par des règles de production qui spécifient quels lexèmes remplacent quels autres lexèmes ; ces règles peuvent être utilisées pour engendrer des chaînes de caractères ou pour les analyser. Toute règle de production a une tête, ou membre gauche, qui représente la chaîne à remplacer, et un corps ou membre droit qui représente la chaîne qui va la remplacer. Les règles sont souvent écrites sous la forme tête → corps ; par exemple la règle z0 → z1 spécifie que z0 peut être remplacé par z1. Dans la formalisation classique des grammaires génératives proposée par Noam Chomsky dans les années 1950[3],[4], une grammaire G est constituée de :
Une grammaire est définie formellement comme le quadruple ordonné . ExemplePar exemple, pour représenter un nombre éventuellement signé, on peut proposer la grammaire suivante (exprimée en notation pseudo-BNF) : <entier> ::= ['-'] <chiffre> {<chiffre>} <chiffre> ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' Dans cette grammaire, les symboles (-,0,1,2,3,4,5,6,7,8,9) sont terminaux ; les symboles Références
|