<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Blogs - emmesse</title>
		<link>https://www.developpez.net/forums/blogs/116855-emmesse/</link>
		<description>Developpez.com, le Club des Développeurs et IT Pro</description>
		<language>fr</language>
		<lastBuildDate>Fri, 10 Apr 2026 21:11:24 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.jpg</url>
			<title>Forum du club des développeurs et IT Pro - Blogs - emmesse</title>
			<link>https://www.developpez.net/forums/blogs/116855-emmesse/</link>
		</image>
		<item>
			<title>installation de Umlet en standalone</title>
			<link>https://www.developpez.net/forums/blogs/116855-emmesse/b10697/installation-umlet-standalone/</link>
			<pubDate>Wed, 30 Apr 2025 04:52:20 GMT</pubDate>
			<description>Umlet est une application...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Umlet est une application pour produire des diagrammes UML<br />
Voici comment je l'ai installé en standalone<br />
Téléchargez le zip sur <a href="https://www.umlet.com/changes.htm" target="_blank">https://www.umlet.com/changes.htm</a><br />
la version d'umlet est la 15.1 à ce jour.<br />
décompressez le fichier<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">$ unzip umlet-standalone-15.1.zip</pre>
</div>déplacez le dossier extrait vers /home/&lt;user&gt;/.local/share, et rendez-vous dans ce dossier.<br />
n.b: remplacez &lt;user&gt; par votre nom d'utilisateur.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">$ mv Umlet /home/&lt;user&gt;/.local/share
$ cd /home/&lt;user&gt;/.local/share/Umlet</pre></td></tr></table></pre>
</div>modifiez, avec un éditeur de texte, les lignes suvantes du fichier umlet.desktop<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">Type=Application
Exec=java -Dsun.java2d.xrender=f -jar /home/&lt;user&gt;/.local/share/Umlet/umlet.jar
Icon=/home/&lt;user&gt;/.local/share/Umlet/img/umlet_logo.png</pre></td></tr></table></pre>
</div>déplacez ce fichier vers le dossier /home/&lt;user&gt;/.local/share/applications<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">mv umlet.desktop ../applications</pre>
</div>pour lancer umlet, rendez-vous dans les applications (l'icone carré de neuf points) et cliquez sur l'icône umlet.<br />
Avec un clique-droit sur cet icône, vous pourrez l'épingler au dash.</blockquote>

]]></content:encoded>
			<dc:creator>emmesse</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/116855-emmesse/b10697/installation-umlet-standalone/</guid>
		</item>
		<item>
			<title>transformer une expression régulière en automate fini déterministe, puis en diagramme de transition</title>
			<link>https://www.developpez.net/forums/blogs/116855-emmesse/b10610/transformer-expression-reguliere-automate-fini-deterministe-puis-diagramme-transition/</link>
			<pubDate>Sun, 26 May 2024 04:55:08 GMT</pubDate>
			<description>Un langage est un ensemble de...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Un langage est un ensemble de chaînes de symboles issus d'un alphabet. Avec ces langages, on peut en construire d'autres grâce à ces opérations:<br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=655188&amp;d=1716718976" border="0" alt="Nom : tableau langages.png
Affichages : 3548
Taille : 69,2 Ko"  style="float: CONFIG" /><br />
 <br />
par exemple, soit &quot;L&quot; l'ensemble des lettres et &quot;C&quot; l'ensemble des chiffres. Le langage L(L U C)* est l'ensemble des chaînes de lettres et de chiffres commençant par une lettre.<br />
 Pour décrire ces langages, on peut utiliser ce que l'on appelle des expressions régulières. Par exemple, l'expression régulière désignant un identificateur est la suivante:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">lettre(lettre|chiffre)*</pre>
</div>La barre verticale représente l'union, les parenthèses sont utilisés pour regrouper les sous-expressions. L'étoile signifie &quot;zéro, une ou plusieurs occurrences de &quot;. La juxtaposition de &quot;lettre&quot; avec le reste de l’expression est la concaténation.<br />
Chaque expression régulière r dénote le langage L(r).<br />
voici les règles qui définissent les expressions régulières sur un alphabet &#931; et les langages que dénotent ces expressions:<br />
1. &#949; est une expression régulière et L(&#949;) est {&#949;}, le langage dont le seul membre est la chaine vide<br />
2. si a est un symbole appartenant à &#931;, alors a est l'expression qui dénote le langage L(a)={a}, c'est à dire le langage comportant une seule chaîne, de longueur un, avec a en première et unique position.<br />
soit r et s des expressions régulières dénotant respectivement les langages L(r) et L(s). Il existe quatre opérations sur les expressions régulières:<br />
1. (r) | (s) dénote le langage L(r) U L(s)<br />
2. (r)(s) dénote le langage L(r)L(s)<br />
3. (r)* dénote (L(r))*<br />
4. (r) dénote L(r), c'est à dire que l'on peut ajouter des paires de parenthèses autour d'un expression régulière sans changer le langage qu'elle dénote.<br />
<br />
l'union est commutative : r|s = s|r<br />
l'union est associative : (r|s)|t = r|(s|t)<br />
la concaténation est associative : r(st) = (rs)t<br />
la concaténation est distributive par rapport à l'union : r(s|t)= rs|rt; (s|t)r = sr|tr<br />
&#949; est l'élément neutre de la concaténation &#949;r = r&#949; = r<br />
&#949; est inclus das une fermeture : r* = (r|&#949;)*<br />
* est idempotent : r**=r*<br />
<br />
priorités des opérateurs<br />
1. L'opérateur unaire * a la plus grande priorité et est associatif à gauche<br />
2. La concaténation a la deuxième priorité et est associative à gauche<br />
3. L'union a la priorité la plus faible et est associative à gauche<br />
<br />
automates finis déterministes<br />
un automate fini déterministe (AFD) est un graphe orienté dont le coût des arcs est un symbole de l’alphabet d'entrée. Certains de ces états sont les état d'acceptation et ce graphe présente un état de départ. Pour chaque état s et chaque symbole d'entrée a, qui n'est jamais &#949;, il y a au plus un arc sortant de s étiqueté a. Nous allons voir ici comment obtenir un AFD à partir d'une expression régulière<br />
<br />
arbre abstrait<br />
On peut représenter une expression régulière par un arbre abstrait où chaque nœud est une opération et chaque feuille un symbole de l'alphabet. les nœuds peuvent être les suivants:<br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=655171&amp;d=1716694415" border="0" alt="Nom : noeuds.jpg
Affichages : 1518
Taille : 5,3 Ko"  style="float: CONFIG" /><br />
<br />
par exemple, l'arbre abstrait pour l'expression régulière (a|b)*abb<br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=655172&amp;d=1716695588" border="0" alt="Nom : arbre abb.jpg
Affichages : 1483
Taille : 8,0 Ko"  style="float: CONFIG" /><br />
<br />
arbre abstrait augmenté:<br />
à partir d'un arbre abstrait, on produit un arbre abstrait augmenté en concaténant la racine de l'arbre avec le symbole #.<br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=655173&amp;d=1716695641" border="0" alt="Nom : arbre abb augmenté.png
Affichages : 1468
Taille : 17,0 Ko"  style="float: CONFIG" /><br />
<br />
fonctions calculés à partir de l'arbre abstrait <br />
à chaque nœud et feuille n de l'arbre abstrait on peut calculer les fonctions annulable(n), premièrepos(n) et dernièrepos(n).<br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=655174&amp;d=1716696615" border="0" alt="Nom : premderpos.png
Affichages : 1446
Taille : 120,0 Ko"  style="float: CONFIG" /><br />
<br />
ce qui donne pour l'expression régulière (a|b)*abb:<br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=655175&amp;d=1716696663" border="0" alt="Nom : premsderpos.jpg
Affichages : 1445
Taille : 17,7 Ko"  style="float: CONFIG" /><br />
<br />
calcul des ensembles posSuivante<br />
on désigne par posSuivante(i), où i est une position, l'ensemble des positions suivantes de la position i.<br />
Nous allons maintenant calculer les posSuivantes comme ceci:<br />
1. si n est un nœud cat de fils gauche c1 et de fils droit c2, alors pour toute position i présente dans dernièrepos(c1), toutes les positions présentes dans premièrepos(c2) sont dans aussi dans posSivante(i)<br />
2. si n est un nœud étoile, et si i est une position présente dans dernièrepos(n) alors toutes le positions présentes dans premièrepos(n) sont aussi présentes dans posSuivante(i)<br />
<br />
exemple:<br />
on a déjà calculé dans la dernière figure les premièrepos et dernièrepos de chaque nœud de l'arbre pour l'expression régulière (a|b)*abb. À chaque neud cat, on doit mettre chaque position présente dans premierepos de son fils droit dans l'ensemble posuivante de chaque position de dernièrepos de son fils gauche. Au nœud étoile, les positions présentes dans premièrepos de ce nœud sont aussi présente dans posSuivante des positions présentes dans dernièrepos de ce même nœud.<br />
Voici la fonction posSuivante pour chaque position:<br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=655180&amp;d=1716699237" border="0" alt="Nom : posSuivante.png
Affichages : 1443
Taille : 37,2 Ko"  style="float: CONFIG" /><br />
<br />
Algorithme de la construction de l'AFD<br />
Soit T l'arbre abstrait de l'expression régulière (r)#<br />
Un état de l'AFD D est un ensemble de positions dans l'arbre abstrait T.<br />
Soit D l'AFD en construction. D_états est l'ensemble de ses états de D et D_trans, l'ensemble des transitions de D. Au départ, les états de D sont non marqués. Un état devient marqué juste avant que l'on étudie ses transitions sortantes. Le premier état de D est l'ensemble premièrepos(n0), où n0 est le nœud racine de T. Les états finaux sont ceux qui contiennent la position du marqueur de fin #.<br />
voici l'algorithme:<br />
Initialiser D-états pour qu'il ne contienne seulement l'état non marqué premièrepos(n0) où n0 est la racine de l'arbre abstrait T de (r)#.<br />
tant que il existe un état non marqué E dans D_états.<br />
     marquer E;<br />
     pour chaque symbole d'entrée a<br />
     	  soit U l'union de posSuivante(p) pour toutes les positions p  de E qui correspondent à l'élément a de l'alphabet de r;<br />
	  si U n'est pas dans D_état alors<br />
	     ajouter U en tant qu'état non marqué dans D_état;<br />
	  D_trans[E,a]=U<br />
exemple:<br />
considérons T l'arbre abstrait de l'expression régulière (a|b)*abb. Le premier état de D est l'ensemble premièrepos de la racine de l'arbre T, soit {1;2;3}. Appelons A cet ensemble de positions. Étudions D_trans[A,a] et D_trans[A,b]. Parmis les positions {1;2;3}, 1 et 3 correspondent à a et 2 à b. Ainsi D_trans[A,a]=posSuivante(1) U posSuivante(3)={1;2;3;4} et D_trans[A,b]=posSuivante(2)={1;2;3}. Ce dernier étant l'état A, on ne l'ajoute pas à D_états, mais l'ensemble B={1;2;3;4} est ajouté à D_états:<br />
A={1;2;3}<br />
D_trans[A,a] = posSuivante(1) U posSuivante(3) = {1;2;3;4} = B<br />
D_trans[A,b] = posSuivante(2) = {1;2;3} = A<br />
D_trans[B,a] = posSuivante(1) U posSuivante(3) = {1;2;3;4} = B<br />
D_trans[B,b] = posSuivante(2) U posSuivante(4) = {1;2;3;5} = C. L'ensemble C est ajouté à D_états<br />
D_trans[C,a] = posSuivante(1) U posSuivante(3) = {1;2;3;4} = B<br />
D-trans[C,b] = posSuivante(2) U posSuivante(5) = {1;2;3;6} = D. L'ensemble D est ajouté à D_états<br />
comme D contient 6, la position du symbole #, l'état D est un état d'acceptation de l'AFD<br />
D_trabs[D,a] = posSuivante(1) U posSuivante(3) = {1;2;3;4} = B<br />
D_trans[D,b] = posSuivante(2) = {1;2;3} = A<br />
il n'y a maintenant plus d'états non marqués.<br />
L'AFD es le suivant:<br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=667143&amp;d=1746474731" border="0" alt="Nom : ababb.png
Affichages : 1176
Taille : 23,4 Ko"  style="float: CONFIG" /><br />
<br />
pour implémenter un analyseur lexical, on a besoin d'un diagramme de transition, c'est à dire qu'il ne faut pas qu'il y ait des arcs sortant d'un état d'acceptation. Pour convertir cet AFD en diagramme de transition, D devient un état courant. On ajoute ensuite un arc étiqueté &quot;autre&quot; vers un nouvel état, qui lui sera un état d'acceptation:<br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=655177&amp;d=1716697324" border="0" alt="Nom : transition.png
Affichages : 1461
Taille : 27,5 Ko"  style="float: CONFIG" /></blockquote>

]]></content:encoded>
			<dc:creator>emmesse</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/116855-emmesse/b10610/transformer-expression-reguliere-automate-fini-deterministe-puis-diagramme-transition/</guid>
		</item>
		<item>
			<title>analyse syntaxique descendante</title>
			<link>https://www.developpez.net/forums/blogs/116855-emmesse/b10584/analyse-syntaxique-descendante/</link>
			<pubDate>Thu, 29 Feb 2024 04:18:53 GMT</pubDate>
			<description>Dans un compilateur,...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Dans un compilateur, l'analyseur syntaxique vérifie que le code source du programme est syntaxiquement cohérent. Pour cela, il se sert d’une grammaire hors contexte. Celle-ci est un ensemble de productions.<br />
Une production se présente sous la forme d’un identificateur, servant de tête de production, puis une flèche de gauche à droite, se lisant &quot;peut prendre la forme de&quot;, et, en partie droite, une suite d’identificateurs. Ces derniers sont des terminaux et des non terminaux.  Un terminal est un identificateur, représentant un élément du langage, tel qu'un opérateur ou un mot-clé, qui ne se présente jamais en partie gauche d’une production, tandis que un non terminal demande à être décrit, et apparaît au moins une fois en partie gauche d’une production.<br />
Soit un exemple de grammaire, celle décrivant une somme, représentée par la suivante:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0">somme &#8594; somme plus terme
somme &#8594; terme
terme &#8594; identificateur
      &#8594; nombre
      &#8594; parenthèseouvrante somme parenthèsefermante</pre></td></tr></table></pre>
</div>En effet, un terme unique est la somme de ce seul terme, d'où la production somme &#8594; terme. Si on ajoute à cette somme, ainsi qu’à n’importe quelle autre somme, un &quot;plus&quot; et un &quot;terme&quot;, on obtient aussi une somme:<br />
somme &#8594; somme plus terme.<br />
On peut réitérer cette définition à l’infini. La production de départ, somme &#8594; somme plus terme, est appelé axiome de la grammaire hors contexte.<br />
<br />
<font size="3">Dérivation gauche</font><br />
Pour vérifier la cohérence syntaxique du code source, on peut utiliser la dérivation gauche. Ceci consiste à écrire sur la première ligne la tête de l’axiome, puis, on remplace, à la ligne suivante, le non terminal le plus à gauche par la partie droite de la production de non terminal considéré. Par exemple, soit la grammaire suivante:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0">affectation &#8594; identificateur resteaffectation
resteaffectation &#8594; égal suiteaffectation
suiteaffectation &#8594; identificateur égal suiteaffection
                 &#8594; expression</pre></td></tr></table></pre>
</div>La dérivation gauche de la phrase &quot;identificateur égal identificateur égal expression&quot; est la suivante:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0">affectation
identificateur resteaffectation
identificateur égal suiteaffectation
identificateur égal identificateur égal suiteaffectation
identificateur égal identificateur égal expression</pre></td></tr></table></pre>
</div>Chaque ligne d’une dérivation est appelé proto-phrase. Elle contient des terminaux et des non terminaux. Si la dernière ligne est identique à la phrase que l'on se donne de dériver, alors la phrase est syntaxiquement cohérente par rapport à la grammaire correspondante.<br />
<font size="3">arbre syntaxique abstrait</font><br />
À partir d’une grammaire et d’une phrase, on peut élaborer un arbre, appelé arbre syntaxique abstrait. La racine de cet arbre est la partie gauche de l’axiome de la grammaire. Puis les non-terminaux de la partie droite constituent chacun une branche de l’arbre issue de ce non terminal. Puis, les non terminaux engendrent aussi d’autres branche de l’arbre, jusqu’aux feuilles de l’arbre, qui sont les terminaux. Par exemple, avec la phrase &quot;terme plus terme plus terme&quot; et la grammaire des sommes vue ci-dessus, on élabore cet arbre syntaxique abstrait:<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=651510&amp;d=1709161136" border="0" alt="Nom : arbre somme.jpg
Affichages : 18669
Taille : 17,7 Ko"  style="float: CONFIG" /><br />
<br />
<font size="3">Production vide</font><br />
La production vide, notée &#949;, est utilisée dans le cas où un non terminal est optionnel, par exemple:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">conditionnelle &#8594; si condition alors séquence_instructions alternative finsi
alternative &#8594; sinon séquence_instructions
            &#8594; &#949;</pre></td></tr></table></pre>
</div><font size="3">Premiers d’un non terminal</font><br />
L’ensemble &quot;premiers(A)&quot; d’une production A &#8594; &#945; est l’ensemble des premiers terminaux qui peuvent commencer une chaîne dérivée de &#945;. Un ensemble premiers(X) se calcule comme ceci:<br />
appliquer ces règles jusqu’à ce que l’on ne puisse plus ajouter de symbole, y compris la production vide &#949;:<br />
    • si X est un terminal alors premiers(X)={X}<br />
    • si X &#8594; &#949; est une production, alors ajouter &#949; dans premiers(X)<br />
    • si X &#8594; Y1 Y2 … Yk est une production alors ajouter &quot;a&quot; s’il existe &quot;i&quot; tel que &quot;a&quot; est dans premiers(Yi) et &#949; dans tous les premiers de Y1 à Yi-1<br />
    • si &#949; est dans premiers(Yj) pour tout j compris entre 1 et k alors ajouter &#949; à premiers(X)<br />
    • si Y1 &#8594; &#949; on ajoute premiers(Y2) à premiers de X. si &#949; est dans premiers(Y1) et dans premiers(Y2) alors on ajoute premiers(Y3) à premiers(X), et ainsi de suite<br />
Les premiers d’une chaîne X1 X2 … Xn se calcule ainsi:<br />
appliquer ces règles jusqu’à ce que l’on ne puisse plus ajouter de symbole, y compris la production vide &#949;:<br />
    • on ajoute les symboles de premiers(X1).<br />
    • si X1 &#8594; &#949; alors on ajoute les symboles de premiers(X2).<br />
    • si X1 &#8594; &#949; et X2 &#8594; &#949; alors on ajoute premiers(X3).<br />
    • et ainsi de suite.<br />
    • si, pour tout i compris entre 1 et n, Xi &#8594; &#949; alors on ajoute &#949;.<br />
Dans la grammaire suivante, les premiers de suiteSi son {sinonsi;sinon;&#949;}<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0">conditionnelle &#8594; si condition alors séquence suiteSi finsi
suiteSi &#8594; sinonsi condition alors séquence suiteSi
        &#8594; sinon séquence
        &#8594; &#949;</pre></td></tr></table></pre>
</div><font size="3">Implémentation par la méthode de la descente récursive prédictive</font><br />
La descente récursive prédictive consiste à faire de chaque non terminal une fonction. Dans celle-ci on appelle les fonctions correspondantes aux non terminaux de la partie droite de la production, et les terminaux sont consommés. Dans la fonction, les productions à dériver sont choisis en fonction du premier de chaque partie droite de la production. Par exemple, considérons la grammaire de la conditionnelle vue précédement:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0">conditionnelle &#8594; si condition alors séquence suiteSi finsi
suiteSi &#8594; sinonsi condition alors séquence suiteSi
        &#8594; sinon séquence
        &#8594; &#949;</pre></td></tr></table></pre>
</div>un extrait de l’implémentation pourrait être ceci:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code cpp :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">enum</span> terminaux <span style="color: black;">&#123;</span>si,alors,finsi,sinonsi,sinon<span style="color: black;">&#125;</span>
<span style="color: #0000ff;">void</span> conditionnelle<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	<span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>uniteelexicale==si<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
		consommer<span style="color: black;">&#40;</span>si<span style="color: black;">&#41;</span>;
		condition<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
		consommer<span style="color: black;">&#40;</span>alors<span style="color: black;">&#41;</span>;
		sequence<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
		suitesi<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
		consommer<span style="color: black;">&#40;</span>finsi<span style="color: black;">&#41;</span>;
	<span style="color: black;">&#125;</span>
	<span style="color: #0000ff;">else</span>
		std::cerr&lt;&lt;<span style="color: #FF0000;">&quot;erreur&quot;</span>&lt;&lt;std::endl;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> suitesi<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	<span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>uniteelexicale==sinonsi<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
		consommer<span style="color: black;">&#40;</span>sinonsi<span style="color: black;">&#41;</span>;
		condition<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
		consommer<span style="color: black;">&#40;</span>alors<span style="color: black;">&#41;</span>;
		sequence<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
		suitesi<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
	<span style="color: black;">&#125;</span>
	<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>uniteelexicale==sinon<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
		consommer<span style="color: black;">&#40;</span>sinon<span style="color: black;">&#41;</span>;
		sequence<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
	<span style="color: black;">&#125;</span>
	<span style="color: #0000ff;">else</span>
		; <span style="color: #808080;">//production vide</span>
<span style="color: black;">&#125;</span>
&nbsp;
consommer<span style="color: black;">&#40;</span>terminal symbole<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	<span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>uniteelexicale==symbole<span style="color: black;">&#41;</span>
		uniteelexicale=analex<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;<span style="color: #808080;">//unit&eacute;e lexicale suivante</span>
	<span style="color: #0000ff;">else</span>
		std::cerr&lt;&lt;<span style="color: #FF0000;">&quot;erreur&quot;</span>&lt;&lt;std::endl;
<span style="color: black;">&#125;</span></pre></td></tr></table></pre>
</div><br />
<font size="3">Suppression des récursivités à gauche</font><br />
un problème de boucle infinie peut arriver dans le cas où la partie droite d'une production débute par le même non terminal que la tête de cette production, comme, par exemple, la production somme:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">somme &#8594; somme plus terme</pre>
</div>En effet, la fonction somme() débute par un appel récursif sans que aucune unité lexicale n’aie été consommée, et produit donc une boucle infinie. Cela s’appelle une récursivité à gauche.<br />
Prenons l'exemple cette grammaire récursive à gauche:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">A &#8594; A &#945; | &#946;</pre>
</div>voici l'arbre syntaxique abstrait pour l’entrée  &#946; &#945; &#945;:<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=651511&amp;d=1709162120" border="0" alt="Nom : arbre recurs gauche A.png
Affichages : 17118
Taille : 5,4 Ko"  style="float: CONFIG" /><br />
Voici un arbre abstrait syntaxique issue de la même entrée, mais avec une grammaire hors contexte différente, sans récursivités à gauche:<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=651512&amp;d=1709162173" border="0" alt="Nom : arbre recurs A R.png
Affichages : 16731
Taille : 5,1 Ko"  style="float: CONFIG" /><br />
le nœud A de cet arbre présente deux branches vers &#946; et R. Il s’agit de la production suivante:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">A &#8594; &#946; R</pre>
</div>les nœuds R ont soit deux branche vers &#945; et R ou une branche vers &#949;. Il s'agit donc des productions<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">R &#8594; &#945; R
R &#8594; &#949;</pre></td></tr></table></pre>
</div>On a donc transformé une grammaire présentant une récursivité à gauche en une grammaire sans ce défaut. Voici la nouvelle grammaire:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">A &#8594; &#946; R
R &#8594; &#945; R
R &#8594; &#949;</pre></td></tr></table></pre>
</div>on peut généraliser ceci avec cette grammaire:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">A &#8594; A &#945;1 | A &#945;2 | … | A &#945;m | &#946;1 | &#946;2 | … |  &#946;n</pre>
</div>qui deviendra la suivante, sans récursivités à gauche:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">A &#8594; &#946;1 A' | &#946;2 A' | … | &#946;n A'
A' &#8594; &#945;1 A' | &#945;2 A' | … | &#945;m A' | &#949;</pre></td></tr></table></pre>
</div><font size="3">application sur la grammaire des expressions</font><br />
<font size="2">priorité de la multiplication par rapport à l'addition</font><br />
la multiplication de facteurs est prioritaire par rapport à l'addition. Il faut donc calculer les produit avant la somme. c'est pourquoi les produits, une fois calculés, sont des termes de l'addition. Cette grammaire est la suivante, où plus est l'opérateur d'addition, etoile celui de la multiplication :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:120px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0">somme -&gt; somme plus terme
      -&gt; terme
terme -&gt; terme etoile facteur
      -&gt; facteur
facteur -&gt; identificateur
        -&gt; nombre
        -&gt; parenthèse_ouvrante somme parenthèse fermante</pre></td></tr></table></pre>
</div>voici l'arbre syntaxique abstrait de la phrase &quot;5 + a * b&quot; :<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=670966&amp;d=1760461151" border="0" alt="Nom : afoisb.png
Affichages : 14487
Taille : 3,9 Ko"  style="float: CONFIG" /><br />
la soustraction et la division ont respectivement la même priorité que l'addition et la multiplication. c'est pourquoi l'addition et la soustraction sont tout les deux dan la production somme, tandis que la multiplication et la division sont tous deux dans le production terme.<br />
voici la grammaire des expressions:<br />
E signifie &quot;expression&quot;, T pour &quot;terme&quot;, F pour &quot;facteur&quot;, po pour parenthèse ouvrante et pf pour parenthèse fermante. L’étoile est l’opérateur de multiplication et slash celui de la division:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:156px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td valign="top"><pre style="margin: 0">E &#8594; E plus T
  &#8594; E moins T
  &#8594; T
T &#8594; T étoile F
  &#8594; T slash F
  &#8594; F
F &#8594; identificateur
  &#8594; nombre
  &#8594; moins F
  &#8594; po E pf</pre></td></tr></table></pre>
</div>cela donne, sans récursivités à gauche :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:180px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td valign="top"><pre style="margin: 0">E &#8594; T E'
E' &#8594; plus T E'
   &#8594; moins T E'
   &#8594; &#949;
T &#8594; F T'
T' &#8594; étoile F T'
   &#8594; slash F T'
   &#8594; &#949;
F &#8594; identificateur
  &#8594; nombre
  &#8594; moins F
  &#8594; po E pf</pre></td></tr></table></pre>
</div>la production F -&gt; moins F correspond à l'opération moins unaire<br />
<font size="3">Les suivants d’un non terminal</font><br />
Pour un non-terminal A, suivants(A) est l’ensemble des terminaux qui peuvent apparaître immédiatement à droite de A dans une proto-phrase. Voici comment le calculer:<br />
    • si A est le symbole de départ (la partie gauche de l’axiome) alors on ajoute dollar, le marqueur de fin, dit le terminal qui n'existe dans aucune grammaire, à suivants(A)<br />
    • Si A &#8594; &#945;B&#946;, on ajoute premiers(&#946;), à l'exception de &#949;, à suivants(B);<br />
    • Si A &#8594; &#945;B ou A &#8594; &#945;B&#946; avec &#949; &#8712; premiers(&#946;), on ajoute les éléments de suivants(A) à suivants(B).<br />
<br />
<font size="3">analyse descendante non récursive</font><br />
L’analyse descendante non récursive consiste à utiliser une pile qui contiendra la proto-phrase en cours de dérivation. L’élément le plus à gauche de la proto-phrase se trouvera au sommet de la pile.<br />
Si le sommet de la pile est un terminal, soit le terminal du texte d’entrée correspond au sommet de la pile, auquel cas ce sommet est dépilé, et le symbole suivant est lu, soit ils ne correspondent pas et une erreur de syntaxe a été trouvé. Si le sommet de pile est un non terminal, alors il est dépilé, puis on empile la partie droite de la production dont la tête est le non terminal considéré.<br />
Au début du processus, la pile contient au fond le marqueur de fin, appelé dollar, qui est le terminal qui n’existe dans aucune grammaire. Puis au sommet on met la partie gauche de l’axiome.<br />
La production qui doit être empilée à la place du non terminal est issue d’une table d’analyse, dont le nom est M. Celle-ci a une ligne par non terminal et une colonnes par terminal.<br />
Pour construire cette table, les productions P &#8594; &#945; &#946; sont à la ligne du non terminal P et aux colonnes des éléments de premiers(&#945;&#946;). Les productions P &#8594; &#949; sont à la ligne désignée par P et aux colonnes indiquées par suivants(P). Les cases vides sont les cas d’erreur.<br />
voici l'algorithme de l'analyse descendante non récursive:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br /></div></td><td valign="top"><pre style="margin: 0">positionner le pointeur d'entrée pe de sorte qu’il pointe vers a, le premier symbole du texte d'entrée;
mettre le sommet de pile dans X
tant que X&#8800;dolar /* la pile n'est pas vide */
	si X vaut a
		dépiler et faire avancer pe (a est alors l'unité lexicale suivante)
	sinonsi X est un terminal alors
		erreur();
	sinonsi M[X,a] est une entrée d'erreur alors
		erreur();
	sinonsi M[X,a] = X &#8594; Y1 Y2…Yk
		émettre la production X &#8594; Y1 Y2…Yk
		dépiler
		empiler Yk, Yk-1,…,Y1, avec Y1 au sommet
	finsi
	mettre le sommet de pile dans X;
fintantque</pre></td></tr></table></pre>
</div>Pour construire la table d’analyse de la grammaire des expressions vue ci-dessus nous allons déterminer les ensembles premiers et suivants de chaque non terminal de la grammaire. Souvenons-nous que po indique parenthèse ouvrante, et pf parenthèse fermante.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:156px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td valign="top"><pre style="margin: 0">premiers(E)={identificateur;nombre;moins;po}
suivants(E)={pf;dollar}
premiers(E')={plus;moins;&#949;}
suivants(E')={pf;dollar}
premiers(T)={identificateur;nombre;moins;po}
suivants(T)={plus;moins;pf;dollar}
premiers(T')={étoile;slash;&#949;}
suivants(T')={plus;moins;pf;dollar}
premiers(F)={identificateur;nombre;moins;po}
suivants(F)={étoile;slash;plus;moins;pf;dollar}</pre></td></tr></table></pre>
</div>voici la table d'analyse:<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=651513&amp;d=1709162331" border="0" alt="Nom : table analyse.png
Affichages : 16578
Taille : 10,9 Ko"  style="float: CONFIG" /><br />
<br />
<font size="3">Ratrappage sur erreur en mode panique</font><br />
<br />
le principe du mode panique est de, après une entrée erronée, sauter les unités lexicales jusqu'à lire une unité lexicale de synchronisation. L'efficacité de ce rattrapage est le choix des unité lexicales de synchronisation. Ici, nous allons choisir les suivants de chaque non terminal comme ensembles de synchronisation de ces non terminaux. Cela ne sera pas suffisant dans le cas d'autres compilateurs. Nous pourrions par exemple choisir aussi les fin de blocs et les suivants d'une expressions comme unité lexicales de synchronisation.<br />
Si le sommet de pile contient un terminal et que celui-ci n'apparait pas dans le texte d'entrée alors on dépile ce sommet de pile.<br />
voici la table d'analyse avec les cas de synchronisation. Ceux-ci se situent, pour chaque non terminal, à la ligne de ce non terminal et aux colonnes de ses terminaux de synchronisation.<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=651514&amp;d=1709162360" border="0" alt="Nom : table analyse erreur.png
Affichages : 16567
Taille : 12,7 Ko"  style="float: CONFIG" />  <br />
cette table s'utilise ainsi:<br />
Si le compilateur doit accéder à une case d'erreur, alors l'unité lexicale est sauté (on lit l'unité lexicale suivante). Si, par contre, cette case est une case synchro, alors le sommet de pile est dépilé, puis on avance dans le texte d'entrée.<br />
<br />
<font size="3">Le programme</font><br />
En ce qui concerne l’analyseur lexical, je vous propose de consulter mon billet de blog <a href="https://www.developpez.net/forums/blogs/116855-emmesse/b10521/lanalyse-lexicale-premiere-phase-compilation/" target="_blank">ici</a>.<br />
Nous aurons besoin d’un analyseur lexical qui isole les unités lexicales plus, moins, étoile, slash, identificateur, nombre, parenthèse ouvrante, parenthèse fermante et le marqueur de fin (dollar).<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code cpp :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:192px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">//terminal.hpp</span>
<span style="color: #339933;">#ifndef TERMINAL_HPP </span>
<span style="color: #339933;">#define TERMINAL_HPP</span>
&nbsp;
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;string&gt;</span>
&nbsp;
<span style="color: #0000ff;">enum</span> terminal <span style="color: black;">&#123;</span>identificateur,nombre,plus,moins,etoile,slash,po,pf,dollar<span style="color: black;">&#125;</span>;
<span style="color: #0000ff;">enum</span> symbole<span style="color: black;">&#123;</span>sE,sEprim,sT,sTprim,sF,snombre,sidentificateur,splus,smoins,
	     setoile,sslash,spo,spf,sdollar,sepsilon,ssynchro<span style="color: black;">&#125;</span>;
<span style="color: #0000ff;">constexpr</span> <span style="color: #0000ff;">size_t</span> nbterminaux=<span style="color: #cc66cc;">9</span>;
<span style="color: #0000ff;">constexpr</span> <span style="color: #0000ff;">size_t</span> nbnonterminaux=<span style="color: #cc66cc;">5</span>;
<span style="color: #0000ff;">constexpr</span> <span style="color: #0000ff;">size_t</span> nbsymboles=<span style="color: #cc66cc;">16</span>;
<span style="color: #339933;">#endif</span></pre></td></tr></table></pre>
</div><div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code cpp :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">//main.cpp</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;iostream&gt;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;string&gt;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;vector&gt;</span>
&nbsp;
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &quot;syntaxique.hpp&quot;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: black;">&#40;</span><span style="color: #0000ff;">int</span> argc,<span style="color: #0000ff;">char</span> *argv<span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  std::vector&lt;std::string&gt;args;
  <span style="color: #0000ff;">for</span><span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> i=<span style="color: #cc66cc;">0</span>;i&lt;<span style="color: #0000ff;">static_cast</span>&lt;<span style="color: #0000ff;">unsigned</span>&gt;<span style="color: black;">&#40;</span>argc<span style="color: black;">&#41;</span>;++i<span style="color: black;">&#41;</span>
    args.push_back<span style="color: black;">&#40;</span>argv<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>argc!=<span style="color: #cc66cc;">2</span><span style="color: black;">&#41;</span>
    std::cerr&lt;&lt;<span style="color: #FF0000;">&quot;manque le fichier&quot;</span>&lt;&lt;std::endl;
  <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
    syntaxique S<span style="color: black;">&#40;</span>args<span style="color: black;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>;
    S.anasynt<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
  <span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span></pre></td></tr></table></pre>
</div><div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code cpp :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">//syntaxique.hpp</span>
<span style="color: #339933;">#ifndef SYNTAXIQUE_HPP</span>
<span style="color: #339933;">#define SYNTAXIQUE_HPP</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;vector&gt;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;string&gt;</span>
&nbsp;
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &quot;lexical.hpp&quot;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &quot;terminal.hpp&quot;</span>
&nbsp;
<span style="color: #0000ff;">class</span> syntaxique<span style="color: black;">&#123;</span>
<span style="color: #0000ff;">public</span>:
  syntaxique<span style="color: black;">&#40;</span>std::string fichierentree<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">void</span> anasynt<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
<span style="color: #0000ff;">private</span>:
  lexical L;
  terminal ulex;
  std::string lexeme;
  <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">long</span> <span style="color: #0000ff;">int</span> ligne;
  std::string symbole2string<span style="color: black;">&#91;</span>nbsymboles<span style="color: black;">&#93;</span>;
  std::vector&lt;symbole&gt;pile;
  std::vector&lt;symbole&gt;M<span style="color: black;">&#91;</span>nbnonterminaux<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>nbterminaux<span style="color: black;">&#93;</span>;
  <span style="color: #0000ff;">bool</span> vaut<span style="color: black;">&#40;</span>symbole X, terminal a<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">void</span> emettre<span style="color: black;">&#40;</span>std::vector&lt;symbole&gt; <span style="color: #0000ff;">const</span> &amp;production<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">bool</span> estterminal<span style="color: black;">&#40;</span>symbole X<span style="color: black;">&#41;</span>;
<span style="color: black;">&#125;</span>;
<span style="color: #339933;">#endif</span></pre></td></tr></table></pre>
</div><div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code cpp :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #808080;">//syntaxique.cpp</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;iostream&gt;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;string&gt;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &quot;syntaxique.hpp&quot;</span>
syntaxique::syntaxique<span style="color: black;">&#40;</span>std::string fichierentree<span style="color: black;">&#41;</span>:L<span style="color: black;">&#40;</span>fichierentree<span style="color: black;">&#41;</span>,ligne<span style="color: black;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  symbole2string<span style="color: black;">&#91;</span>snombre<span style="color: black;">&#93;</span>=<span style="color: #FF0000;">&quot;nombre&quot;</span>;
  symbole2string<span style="color: black;">&#91;</span>splus<span style="color: black;">&#93;</span>=<span style="color: #FF0000;">&quot;plus&quot;</span>;
  symbole2string<span style="color: black;">&#91;</span>smoins<span style="color: black;">&#93;</span>=<span style="color: #FF0000;">&quot;moins&quot;</span>;
  symbole2string<span style="color: black;">&#91;</span>setoile<span style="color: black;">&#93;</span>=<span style="color: #FF0000;">&quot;etoile&quot;</span>;
  symbole2string<span style="color: black;">&#91;</span>sslash<span style="color: black;">&#93;</span>=<span style="color: #FF0000;">&quot;slash&quot;</span>;
  symbole2string<span style="color: black;">&#91;</span>spo<span style="color: black;">&#93;</span>=<span style="color: #FF0000;">&quot;parenth&egrave;se ouvrante&quot;</span>;
  symbole2string<span style="color: black;">&#91;</span>spf<span style="color: black;">&#93;</span>=<span style="color: #FF0000;">&quot;parenth&egrave;se fermante&quot;</span>;
  symbole2string<span style="color: black;">&#91;</span>sdollar<span style="color: black;">&#93;</span>=<span style="color: #FF0000;">&quot;fin&quot;</span>;
  symbole2string<span style="color: black;">&#91;</span>sE<span style="color: black;">&#93;</span>=<span style="color: #FF0000;">&quot;expression&quot;</span>;
  symbole2string<span style="color: black;">&#91;</span>sEprim<span style="color: black;">&#93;</span>=<span style="color: #FF0000;">&quot;expressionprim&quot;</span>;
  symbole2string<span style="color: black;">&#91;</span>sT<span style="color: black;">&#93;</span>=<span style="color: #FF0000;">&quot;terme&quot;</span>;
  symbole2string<span style="color: black;">&#91;</span>sTprim<span style="color: black;">&#93;</span>=<span style="color: #FF0000;">&quot;termeprim&quot;</span>;
  symbole2string<span style="color: black;">&#91;</span>sF<span style="color: black;">&#93;</span>=<span style="color: #FF0000;">&quot;facteur&quot;</span>;
  symbole2string<span style="color: black;">&#91;</span>sidentificateur<span style="color: black;">&#93;</span>=<span style="color: #FF0000;">&quot;identificateur&quot;</span>;
  symbole2string<span style="color: black;">&#91;</span>sepsilon<span style="color: black;">&#93;</span>=<span style="color: #FF0000;">&quot;epsilon&quot;</span>;
&nbsp;
  M<span style="color: black;">&#91;</span>sE<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>plus<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sE<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>etoile<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sE<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>slash<span style="color: black;">&#93;</span>=<span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>;
  M<span style="color: black;">&#91;</span>sE<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>pf<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sE<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>dollar<span style="color: black;">&#93;</span>=<span style="color: black;">&#123;</span>ssynchro<span style="color: black;">&#125;</span>;
  M<span style="color: black;">&#91;</span>sE<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>moins<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sE<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>identificateur<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sE<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>nombre<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sE<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>po<span style="color: black;">&#93;</span>=<span style="color: black;">&#123;</span>sT,sEprim<span style="color: black;">&#125;</span>;
&nbsp;
  M<span style="color: black;">&#91;</span>sEprim<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>plus<span style="color: black;">&#93;</span>=<span style="color: black;">&#123;</span>splus,sT,sEprim<span style="color: black;">&#125;</span>;
  M<span style="color: black;">&#91;</span>sEprim<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>moins<span style="color: black;">&#93;</span>=<span style="color: black;">&#123;</span>smoins,sT,sEprim<span style="color: black;">&#125;</span>;
  M<span style="color: black;">&#91;</span>sEprim<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>pf<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sEprim<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>dollar<span style="color: black;">&#93;</span>=<span style="color: black;">&#123;</span>sepsilon<span style="color: black;">&#125;</span>;
  M<span style="color: black;">&#91;</span>sEprim<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>etoile<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sEprim<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>slash<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sEprim<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>identificateur<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sEprim<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>nombre<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sEprim<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>po<span style="color: black;">&#93;</span>=<span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>;
&nbsp;
  M<span style="color: black;">&#91;</span>sT<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>moins<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sT<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>identificateur<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sT<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>nombre<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sT<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>po<span style="color: black;">&#93;</span>=<span style="color: black;">&#123;</span>sF,sTprim<span style="color: black;">&#125;</span>;
  M<span style="color: black;">&#91;</span>sT<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>plus<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sT<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>pf<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sT<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>dollar<span style="color: black;">&#93;</span>=<span style="color: black;">&#123;</span>ssynchro<span style="color: black;">&#125;</span>;
    M<span style="color: black;">&#91;</span>sT<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>etoile<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sT<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>slash<span style="color: black;">&#93;</span>=<span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>;
&nbsp;
  M<span style="color: black;">&#91;</span>sTprim<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>plus<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sTprim<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>moins<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sTprim<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>pf<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sTprim<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>dollar<span style="color: black;">&#93;</span>=<span style="color: black;">&#123;</span>sepsilon<span style="color: black;">&#125;</span>;
  M<span style="color: black;">&#91;</span>sTprim<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>etoile<span style="color: black;">&#93;</span>=<span style="color: black;">&#123;</span>setoile,sF,sTprim<span style="color: black;">&#125;</span>;
  M<span style="color: black;">&#91;</span>sTprim<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>slash<span style="color: black;">&#93;</span>=<span style="color: black;">&#123;</span>sslash,sF,sTprim<span style="color: black;">&#125;</span>;
  M<span style="color: black;">&#91;</span>sTprim<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>identificateur<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sTprim<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>nombre<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sTprim<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>po<span style="color: black;">&#93;</span>=<span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>;
&nbsp;
  M<span style="color: black;">&#91;</span>sF<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>moins<span style="color: black;">&#93;</span>=<span style="color: black;">&#123;</span>smoins,sF<span style="color: black;">&#125;</span>;
  M<span style="color: black;">&#91;</span>sF<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>identificateur<span style="color: black;">&#93;</span>=<span style="color: black;">&#123;</span>sidentificateur<span style="color: black;">&#125;</span>;
  M<span style="color: black;">&#91;</span>sF<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>nombre<span style="color: black;">&#93;</span>=<span style="color: black;">&#123;</span>snombre<span style="color: black;">&#125;</span>;
  M<span style="color: black;">&#91;</span>sF<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>po<span style="color: black;">&#93;</span>=<span style="color: black;">&#123;</span>spo,sE,spf<span style="color: black;">&#125;</span>;
  M<span style="color: black;">&#91;</span>sF<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>plus<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sF<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>etoile<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sF<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>slash<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sF<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>pf<span style="color: black;">&#93;</span>=M<span style="color: black;">&#91;</span>sF<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>dollar<span style="color: black;">&#93;</span>=<span style="color: black;">&#123;</span>ssynchro<span style="color: black;">&#125;</span>;
  pile.push_back<span style="color: black;">&#40;</span>sdollar<span style="color: black;">&#41;</span>;
  pile.push_back<span style="color: black;">&#40;</span>sE<span style="color: black;">&#41;</span>;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> syntaxique::vaut<span style="color: black;">&#40;</span>symbole X,terminal ulex<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">return</span> X==sidentificateur &amp;&amp; ulex==identificateur
    ||X==snombre &amp;&amp; ulex==nombre
    ||X==splus &amp;&amp; ulex==plus
    ||X==smoins &amp;&amp; ulex==moins
    ||X==setoile &amp;&amp; ulex==etoile
    ||X==sslash &amp;&amp; ulex==slash
    ||X==spo &amp;&amp; ulex==po
    ||X==spf &amp;&amp; ulex==pf
    ||X==sdollar &amp;&amp; ulex==dollar;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> syntaxique::anasynt<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  L.analex<span style="color: black;">&#40;</span>ulex,lexeme,ligne<span style="color: black;">&#41;</span>;
  symbole X=pile.back<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;<span style="color: #808080;">//X est le sommet de la pile</span>
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>X!=sdollar<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>vaut<span style="color: black;">&#40;</span>X,ulex<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
      pile.pop_back<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      L.analex<span style="color: black;">&#40;</span>ulex,lexeme,ligne<span style="color: black;">&#41;</span>;
    <span style="color: black;">&#125;</span>
    <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>estterminal<span style="color: black;">&#40;</span>X<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
      std::cerr&lt;&lt;<span style="color: #FF0000;">&quot;ligne &quot;</span>&lt;&lt;ligne&lt;&lt;<span style="color: #FF0000;">&quot;: &quot;</span>&lt;&lt;symbole2string<span style="color: black;">&#91;</span>X<span style="color: black;">&#93;</span>&lt;&lt;<span style="color: #FF0000;">&quot; attendu&quot;</span>&lt;&lt;std::endl;
      pile.pop_back<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      L.analex<span style="color: black;">&#40;</span>ulex,lexeme,ligne<span style="color: black;">&#41;</span>;
    <span style="color: black;">&#125;</span>
    <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>M<span style="color: black;">&#91;</span>X<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>ulex<span style="color: black;">&#93;</span>.size<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>==<span style="color: #cc66cc;">0</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
      std::cerr&lt;&lt;<span style="color: #FF0000;">&quot;ligne &quot;</span>&lt;&lt;ligne&lt;&lt;<span style="color: #FF0000;">&quot;: erreur&quot;</span>&lt;&lt;std::endl;
       <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>ulex==dollar<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	std::cerr&lt;&lt;<span style="color: #FF0000;">&quot;fin de fichier pr&eacute;matur&eacute;&quot;</span>&lt;&lt;std::endl;
	<span style="color: #0000ff;">break</span>;
      <span style="color: black;">&#125;</span>
       L.analex<span style="color: black;">&#40;</span>ulex,lexeme,ligne<span style="color: black;">&#41;</span>;
   <span style="color: black;">&#125;</span>
    <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>M<span style="color: black;">&#91;</span>X<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>ulex<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: black;">&#93;</span>==ssynchro<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
      std::cerr&lt;&lt;<span style="color: #FF0000;">&quot;ligne &quot;</span>&lt;&lt;ligne&lt;&lt;<span style="color: #FF0000;">&quot;: erreur&quot;</span>&lt;&lt;std::endl;
      pile.pop_back<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>ulex==dollar<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	std::cerr&lt;&lt;<span style="color: #FF0000;">&quot;fin de fichier pr&eacute;matur&eacute;&quot;</span>&lt;&lt;std::endl;
	<span style="color: #0000ff;">break</span>;
      <span style="color: black;">&#125;</span>
      L.analex<span style="color: black;">&#40;</span>ulex,lexeme,ligne<span style="color: black;">&#41;</span>;
    <span style="color: black;">&#125;</span>
    <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
      std::cout&lt;&lt;symbole2string<span style="color: black;">&#91;</span>X<span style="color: black;">&#93;</span>&lt;&lt;<span style="color: #FF0000;">&quot; -&gt; &quot;</span>;
      emettre<span style="color: black;">&#40;</span>M<span style="color: black;">&#91;</span>X<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>ulex<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>;
      pile.pop_back<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">for</span><span style="color: black;">&#40;</span><span style="color: #0000ff;">int</span> i=M<span style="color: black;">&#91;</span>X<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>ulex<span style="color: black;">&#93;</span>.size<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;i&gt;<span style="color: #cc66cc;">0</span>;i--<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	symbole empiler=M<span style="color: black;">&#91;</span>X<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>ulex<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>i-<span style="color: #cc66cc;">1</span><span style="color: black;">&#93;</span>;
	<span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>empiler!=sepsilon<span style="color: black;">&#41;</span>
	  pile.push_back<span style="color: black;">&#40;</span>empiler<span style="color: black;">&#41;</span>;
      <span style="color: black;">&#125;</span>
    <span style="color: black;">&#125;</span>
    X=pile.back<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
  <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>ulex!=dollar<span style="color: black;">&#41;</span>
    std::cerr&lt;&lt;<span style="color: #FF0000;">&quot;le fichier d'entr&eacute;e n'a pas &eacute;t&eacute; entierement analys&eacute;&quot;</span>&lt;&lt;std::endl;
&nbsp;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> syntaxique::emettre<span style="color: black;">&#40;</span>std::vector&lt;symbole&gt; <span style="color: #0000ff;">const</span> &amp;production<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">for</span><span style="color: black;">&#40;</span><span style="color: #0000ff;">auto</span> s:production<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    std::cout&lt;&lt;symbole2string<span style="color: black;">&#91;</span>s<span style="color: black;">&#93;</span>;
    std::cout&lt;&lt;<span style="color: #FF0000;">&quot; &quot;</span>;
  <span style="color: black;">&#125;</span>
  std::cout&lt;&lt;std::endl;
<span style="color: black;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #0000ff;">bool</span> syntaxique::estterminal<span style="color: black;">&#40;</span>symbole X<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">return</span> X==sepsilon || X==splus || X==smoins || X==setoile || X==sslash
    || X==spo || X==spf || X==sidentificateur  || X==snombre || X==sdollar;
<span style="color: black;">&#125;</span></pre></td></tr></table></pre>
</div><div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code cpp :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">//lexical.hpp</span>
&nbsp;
<span style="color: #339933;">#ifndef LEXICAL_HPP</span>
<span style="color: #339933;">#define LEXICAL_HPP</span>
&nbsp;
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;string&gt;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;fstream&gt;</span>
&nbsp;
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &quot;terminal.hpp&quot;</span>
&nbsp;
<span style="color: #0000ff;">class</span> lexical<span style="color: black;">&#123;</span>
<span style="color: #0000ff;">public</span>:
  lexical<span style="color: black;">&#40;</span>std::string fichierentree<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">void</span> analex<span style="color: black;">&#40;</span>terminal &amp;ulex,std::string &amp;lexeme,<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">long</span> <span style="color: #0000ff;">int</span> &amp;ligne<span style="color: black;">&#41;</span>;
<span style="color: #0000ff;">private</span>:
  std::string texte;
  std::ifstream entree;
  <span style="color: #0000ff;">size_t</span> enavant,debutlex;
  <span style="color: #0000ff;">int</span> taille;
  std::string readFileIntoString<span style="color: black;">&#40;</span><span style="color: #0000ff;">const</span> std::string path<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">bool</span> obtenirFDF<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">bool</span> obtenirblanc<span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">long</span> <span style="color: #0000ff;">int</span> &amp;ligne<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">bool</span> obteniridentificateur<span style="color: black;">&#40;</span>terminal &amp;ulex,std::string &amp;lexeme<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">bool</span> obtenirnombre<span style="color: black;">&#40;</span>terminal &amp;ulex,std::string &amp;lexeme<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">bool</span> obtenirplus<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">bool</span> obtenirmoins<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">bool</span> obteniretoile<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">bool</span> obtenirslash<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">bool</span> obtenirpo<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">bool</span> obtenirpf<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span>;
  std::string carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
<span style="color: black;">&#125;</span>;
<span style="color: #339933;">#endif</span></pre></td></tr></table></pre>
</div><div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code cpp :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br />201<br />202<br />203<br />204<br />205<br />206<br />207<br />208<br />209<br />210<br />211<br />212<br />213<br />214<br />215<br />216<br />217<br />218<br />219<br />220<br />221<br />222<br />223<br />224<br />225<br />226<br />227<br />228<br />229<br />230<br />231<br />232<br />233<br />234<br />235<br />236<br />237<br />238<br />239<br />240<br />241<br />242<br />243<br />244<br />245<br />246<br />247<br />248<br />249<br />250<br />251<br />252<br />253<br />254<br />255<br />256<br />257<br />258<br />259<br />260<br />261<br />262<br />263<br />264<br />265<br />266<br />267<br />268<br />269<br />270<br />271<br />272<br />273<br />274<br />275<br />276<br />277<br />278<br />279<br />280<br />281<br />282<br />283<br />284<br />285<br />286<br />287<br />288<br />289<br />290<br />291<br />292<br />293<br />294<br />295<br />296<br />297<br />298<br />299<br />300<br />301<br />302<br />303<br />304<br />305<br />306<br />307<br />308<br />309<br />310<br />311<br />312<br />313<br />314<br />315<br />316<br />317<br />318<br />319<br />320<br />321<br />322<br />323<br />324<br />325<br />326<br />327<br />328<br />329<br />330<br />331<br />332<br />333<br />334<br />335<br />336<br />337<br />338<br />339<br />340<br />341<br />342<br />343<br />344<br />345<br />346<br />347<br />348<br />349<br />350<br />351<br />352<br />353<br />354<br />355<br />356<br />357<br />358<br />359<br />360<br />361<br />362<br />363<br />364<br />365<br />366<br />367<br />368<br />369<br />370<br />371<br />372<br />373<br />374<br />375<br />376<br />377<br />378<br />379<br />380<br />381<br />382<br />383<br />384<br />385<br />386<br />387<br />388<br />389<br />390<br />391<br />392<br />393<br />394<br />395<br />396<br />397<br />398<br />399<br />400<br />401<br />402<br />403<br />404<br />405<br />406<br />407<br />408<br />409<br />410<br />411<br />412<br />413<br />414<br />415<br />416<br />417<br />418<br />419<br />420<br />421<br />422<br />423<br />424<br />425<br />426<br />427<br />428<br />429<br />430<br />431<br />432<br />433<br />434<br />435<br />436<br />437<br />438<br />439<br />440<br />441<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;">//lexical.cpp</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;string&gt;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;iostream&gt;</span>
&nbsp;
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &quot;lexical.hpp&quot;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &quot;terminal.hpp&quot;</span>
&nbsp;
lexical::lexical<span style="color: black;">&#40;</span>std::string fichierentree<span style="color: black;">&#41;</span>:enavant<span style="color: black;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: black;">&#41;</span>,debutlex<span style="color: black;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  entree.open<span style="color: black;">&#40;</span>fichierentree.c_str<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>;
  texte = readFileIntoString<span style="color: black;">&#40;</span>fichierentree<span style="color: black;">&#41;</span>;
<span style="color: black;">&#125;</span>
&nbsp;
std::string lexical::readFileIntoString<span style="color: black;">&#40;</span><span style="color: #0000ff;">const</span> std::string path<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span>!entree.is_open<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    std::cerr &lt;&lt; <span style="color: #FF0000;">&quot;Could not open the file - '&quot;</span> &lt;&lt; path &lt;&lt; <span style="color: #FF0000;">&quot;'&quot;</span> &lt;&lt; std::endl;
    exit<span style="color: black;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: black;">&#41;</span>;
  <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">return</span> std::string<span style="color: black;">&#40;</span>std::istreambuf_iterator&lt;<span style="color: #0000ff;">char</span>&gt;<span style="color: black;">&#40;</span>entree<span style="color: black;">&#41;</span>,
		       std::istreambuf_iterator&lt;<span style="color: #0000ff;">char</span>&gt;<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>;
  <span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> lexical::analex<span style="color: black;">&#40;</span>terminal &amp;ulex,std::string &amp;lexeme,
		     <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">long</span> <span style="color: #0000ff;">int</span> &amp;ligne<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>obtenirblanc<span style="color: black;">&#40;</span>ligne<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    analex<span style="color: black;">&#40;</span>ulex,lexeme,ligne<span style="color: black;">&#41;</span>; <span style="color: #808080;">//ignorer le blanc. enavant pointe sur le premier caract&egrave;re du lexeme suivant</span>
  <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>obtenirFDF<span style="color: black;">&#40;</span>ulex<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">return</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>obteniridentificateur<span style="color: black;">&#40;</span>ulex,lexeme<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">return</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>obtenirnombre<span style="color: black;">&#40;</span>ulex,lexeme<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">return</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>obtenirplus<span style="color: black;">&#40;</span>ulex<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">return</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>obtenirmoins<span style="color: black;">&#40;</span>ulex<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">return</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>obteniretoile<span style="color: black;">&#40;</span>ulex<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">return</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>obtenirslash<span style="color: black;">&#40;</span>ulex<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">return</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>obtenirpo<span style="color: black;">&#40;</span>ulex<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> <span style="color: #808080;">//po=parenth&egrave;se ouvrante</span>
    <span style="color: #0000ff;">return</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>obtenirpf<span style="color: black;">&#40;</span>ulex<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> <span style="color: #808080;">//pf=parenth&egrave;se fermante</span>
    <span style="color: #0000ff;">return</span>;
  <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
    std::cerr&lt;&lt;<span style="color: #FF0000;">&quot;carat&egrave;re hors langage&quot;</span>&lt;&lt;std::endl;
    enavant+=taille;<span style="color: #808080;">//ignorer le caract&egrave;re hors  langage</span>
    analex<span style="color: black;">&#40;</span>ulex,lexeme,ligne<span style="color: black;">&#41;</span>;
  <span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> lexical::obtenirblanc<span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">long</span> <span style="color: #0000ff;">int</span> &amp;ligne<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">int</span> etat=<span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">bool</span> continuer=<span style="color: #0080ff;">true</span>;
  <span style="color: #0000ff;">bool</span> reussi;
  debutlex=enavant;
  std::string caracterelu;
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>continuer<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>etat<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">0</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;<span style="color: #800000;">\n</span>&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	ligne++;
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot; &quot;</span>||caracterelu==<span style="color: #FF0000;">&quot;<span style="color: #800000;">\t</span>&quot;</span>||caracterelu==<span style="color: #FF0000;">&quot;<span style="color: #800000;">\r</span>&quot;</span><span style="color: black;">&#41;</span>
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	continuer=<span style="color: #0080ff;">false</span>;
	reussi=<span style="color: #0080ff;">false</span>;
	enavant=debutlex;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">1</span>:
      continuer=<span style="color: #0080ff;">false</span>;
      reussi=<span style="color: #0080ff;">true</span>;
    <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">return</span> reussi;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> lexical::obtenirFDF<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">int</span> etat=<span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">bool</span> continuer=<span style="color: #0080ff;">true</span>;
  <span style="color: #0000ff;">bool</span> reussi;
  debutlex=enavant;
  std::string caracterelu;
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>continuer<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>etat<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">0</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu<span style="color: black;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: black;">&#93;</span>==<span style="color: #FF0000;">'</span><span style="color: #800000;">\0</span><span style="color: #FF0000;">'</span><span style="color: black;">&#41;</span>
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	continuer=<span style="color: #0080ff;">false</span>;
	reussi=<span style="color: #0080ff;">false</span>;
	enavant=debutlex;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">1</span>:
      continuer=<span style="color: #0080ff;">false</span>;
      reussi=<span style="color: #0080ff;">true</span>;
      ulex=dollar;
      <span style="color: #0000ff;">break</span>;
    <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">return</span> reussi;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> lexical::obteniridentificateur<span style="color: black;">&#40;</span>terminal &amp;ulex,std::string &amp;lexeme<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">int</span> etat=<span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">bool</span> continuer=<span style="color: #0080ff;">true</span>;
  <span style="color: #0000ff;">bool</span> reussi;
  lexeme=<span style="color: #FF0000;">&quot;&quot;</span>;
  debutlex=enavant;
  std::string caracterelu;
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>continuer<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>etat<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">0</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;_&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">0</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu &gt;=<span style="color: #FF0000;">&quot;A&quot;</span> &amp;&amp; caracterelu&lt;=<span style="color: #FF0000;">&quot;Z&quot;</span> || caracterelu &gt;= <span style="color: #FF0000;">&quot;a&quot;</span> &amp;&amp; caracterelu &lt;= <span style="color: #FF0000;">&quot;z&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span><span style="color: #808080;">//echec</span>
	enavant=debutlex;
	continuer=<span style="color: #0080ff;">false</span>;
	reussi=<span style="color: #0080ff;">false</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">1</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu &gt;=<span style="color: #FF0000;">&quot;A&quot;</span> &amp;&amp; caracterelu&lt;=<span style="color: #FF0000;">&quot;Z&quot;</span> || caracterelu &gt;= <span style="color: #FF0000;">&quot;a&quot;</span> &amp;&amp; caracterelu &lt;= <span style="color: #FF0000;">&quot;z&quot;</span> || caracterelu &gt;=<span style="color: #FF0000;">&quot;0&quot;</span> &amp;&amp; caracterelu &lt;= <span style="color: #FF0000;">&quot;9&quot;</span> || caracterelu==<span style="color: #FF0000;">&quot;_&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span> <span style="color: #808080;">//autre caract&egrave;re</span>
	etat=<span style="color: #cc66cc;">2</span>;
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">2</span>:
      continuer=<span style="color: #0080ff;">false</span>;
      reussi=<span style="color: #0080ff;">true</span>;
      enavant-=taille;<span style="color: #808080;">//reculer pour le d&eacute;passement de caract&egrave;re (autre caract&egrave;re)</span>
      ulex=identificateur;
    <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">return</span> reussi;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> lexical::obtenirnombre<span style="color: black;">&#40;</span>terminal &amp;ulex,std::string &amp;lexeme<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">int</span> etat=<span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">bool</span> continuer=<span style="color: #0080ff;">true</span>;
  <span style="color: #0000ff;">bool</span> reussi;
  lexeme=<span style="color: #FF0000;">&quot;&quot;</span>;
  debutlex=enavant;
  std::string caracterelu;
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>continuer<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>etat<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">0</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;,&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">2</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu&gt;=<span style="color: #FF0000;">&quot;0&quot;</span> &amp;&amp; caracterelu&lt;=<span style="color: #FF0000;">&quot;9&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	continuer=<span style="color: #0080ff;">false</span>;
	reussi=<span style="color: #0080ff;">false</span>;
	enavant=debutlex;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">1</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;,&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">2</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu&gt;=<span style="color: #FF0000;">&quot;0&quot;</span> &amp;&amp; caracterelu&lt;=<span style="color: #FF0000;">&quot;9&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;e&quot;</span>||caracterelu==<span style="color: #FF0000;">&quot;E&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">5</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span>
	etat=<span style="color: #cc66cc;">4</span>;<span style="color: #808080;">//autre</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">2</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu&gt;=<span style="color: #FF0000;">&quot;0&quot;</span> &amp;&amp; caracterelu&lt;=<span style="color: #FF0000;">&quot;9&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">3</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	enavant=debutlex;
	continuer=<span style="color: #0080ff;">false</span>;
	reussi=<span style="color: #0080ff;">false</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">3</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu&gt;=<span style="color: #FF0000;">&quot;0&quot;</span> &amp;&amp; caracterelu&lt;=<span style="color: #FF0000;">&quot;9&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">3</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;E&quot;</span> || caracterelu==<span style="color: #FF0000;">&quot;e&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">5</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	etat=<span style="color: #cc66cc;">4</span>;<span style="color: #808080;">//autre caract&egrave;re</span>
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">4</span>:
      continuer=<span style="color: #0080ff;">false</span>;
      reussi=<span style="color: #0080ff;">true</span>;
      ulex=nombre;
      enavant-=taille;<span style="color: #808080;">//reculer pour le d&eacute;passement de caract&egrave;re (autre caract&egrave;re)</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">5</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;+&quot;</span> || caracterelu==<span style="color: #FF0000;">&quot;-&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">6</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span>caracterelu&gt;=<span style="color: #FF0000;">&quot;0&quot;</span> &amp;&amp; caracterelu&lt;=<span style="color: #FF0000;">&quot;9&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">7</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	enavant=debutlex;
	continuer=<span style="color: #0080ff;">false</span>;
	reussi=<span style="color: #0080ff;">false</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">6</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span>caracterelu&gt;=<span style="color: #FF0000;">&quot;0&quot;</span> &amp;&amp; caracterelu&lt;=<span style="color: #FF0000;">&quot;9&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">7</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	enavant=debutlex;
	continuer=<span style="color: #0080ff;">false</span>;
	reussi=<span style="color: #0080ff;">false</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">7</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span>caracterelu&gt;=<span style="color: #FF0000;">&quot;0&quot;</span> &amp;&amp; caracterelu&lt;=<span style="color: #FF0000;">&quot;9&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">7</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span>
	etat=<span style="color: #cc66cc;">4</span>;
      <span style="color: #0000ff;">break</span>;
    <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">return</span> reussi;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> lexical::obtenirplus<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">int</span> etat=<span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">bool</span> continuer=<span style="color: #0080ff;">true</span>;
  <span style="color: #0000ff;">bool</span> reussi;
  debutlex=enavant;
  std::string caracterelu;
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>continuer<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>etat<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">0</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;+&quot;</span><span style="color: black;">&#41;</span>
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	enavant=debutlex;
	reussi=continuer=<span style="color: #0080ff;">false</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">1</span>:
      continuer=<span style="color: #0080ff;">false</span>;
      reussi=<span style="color: #0080ff;">true</span>;
      ulex=plus;
      <span style="color: #0000ff;">break</span>;
    <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">return</span> reussi;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> lexical::obtenirmoins<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">int</span> etat=<span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">bool</span> continuer=<span style="color: #0080ff;">true</span>;
  <span style="color: #0000ff;">bool</span> reussi;
  debutlex=enavant;
  std::string caracterelu;
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>continuer<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>etat<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">0</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;-&quot;</span><span style="color: black;">&#41;</span>
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	enavant=debutlex;
	reussi=continuer=<span style="color: #0080ff;">false</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">1</span>:
      continuer=<span style="color: #0080ff;">false</span>;
      reussi=<span style="color: #0080ff;">true</span>;
      ulex=moins;
      <span style="color: #0000ff;">break</span>;
    <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">return</span> reussi;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> lexical::obteniretoile<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">int</span> etat=<span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">bool</span> continuer=<span style="color: #0080ff;">true</span>;
  <span style="color: #0000ff;">bool</span> reussi;
  debutlex=enavant;
  std::string caracterelu;
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>continuer<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>etat<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">0</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;*&quot;</span><span style="color: black;">&#41;</span>
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	enavant=debutlex;
	reussi=continuer=<span style="color: #0080ff;">false</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">1</span>:
      continuer=<span style="color: #0080ff;">false</span>;
      reussi=<span style="color: #0080ff;">true</span>;
      ulex=etoile;
      <span style="color: #0000ff;">break</span>;
    <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">return</span> reussi;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> lexical::obtenirslash<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">int</span> etat=<span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">bool</span> continuer=<span style="color: #0080ff;">true</span>;
  <span style="color: #0000ff;">bool</span> reussi;
  debutlex=enavant;
  std::string caracterelu;
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>continuer<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>etat<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">0</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;/&quot;</span><span style="color: black;">&#41;</span>
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	enavant=debutlex;
	reussi=continuer=<span style="color: #0080ff;">false</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">1</span>:
      continuer=<span style="color: #0080ff;">false</span>;
      reussi=<span style="color: #0080ff;">true</span>;
      ulex=slash;
      <span style="color: #0000ff;">break</span>;
    <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">return</span> reussi;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> lexical::obtenirpo<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">int</span> etat=<span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">bool</span> continuer=<span style="color: #0080ff;">true</span>;
  <span style="color: #0000ff;">bool</span> reussi;
  debutlex=enavant;
  std::string caracterelu;
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>continuer<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>etat<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">0</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;(&quot;</span><span style="color: black;">&#41;</span>
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	enavant=debutlex;
	reussi=continuer=<span style="color: #0080ff;">false</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">1</span>:
      continuer=<span style="color: #0080ff;">false</span>;
      reussi=<span style="color: #0080ff;">true</span>;
      ulex=po;
      <span style="color: #0000ff;">break</span>;
    <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">return</span> reussi;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> lexical::obtenirpf<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">int</span> etat=<span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">bool</span> continuer=<span style="color: #0080ff;">true</span>;
  <span style="color: #0000ff;">bool</span> reussi;
  debutlex=enavant;
  std::string caracterelu;
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>continuer<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>etat<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">0</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;)&quot;</span><span style="color: black;">&#41;</span>
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	enavant=debutlex;
	reussi=continuer=<span style="color: #0080ff;">false</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">1</span>:
      continuer=<span style="color: #0080ff;">false</span>;
      reussi=<span style="color: #0080ff;">true</span>;
      ulex=pf;
      <span style="color: #0000ff;">break</span>;
    <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">return</span> reussi;
<span style="color: black;">&#125;</span>
&nbsp;
std::string lexical::carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span>texte<span style="color: black;">&#91;</span>enavant<span style="color: black;">&#93;</span> &gt;= <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span><span style="color: #cc66cc;">0</span> &amp;&amp; texte<span style="color: black;">&#91;</span>enavant<span style="color: black;">&#93;</span> &lt;= <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span><span style="color: #cc66cc;">127</span><span style="color: black;">&#41;</span>
    taille=<span style="color: #cc66cc;">1</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span>texte<span style="color: black;">&#91;</span>enavant<span style="color: black;">&#93;</span> &gt;= <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span><span style="color: #cc66cc;">0xC2</span> &amp;&amp; <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span>texte<span style="color: black;">&#91;</span>enavant<span style="color: black;">&#93;</span> &lt;= <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span><span style="color: #cc66cc;">0xdf</span><span style="color: black;">&#41;</span>
    taille=<span style="color: #cc66cc;">2</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span>texte<span style="color: black;">&#91;</span>enavant<span style="color: black;">&#93;</span> &gt;= <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span><span style="color: #cc66cc;">0xe0</span> &amp;&amp; <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span>texte<span style="color: black;">&#91;</span>enavant<span style="color: black;">&#93;</span> &lt;= <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span><span style="color: #cc66cc;">0xef</span><span style="color: black;">&#41;</span>
    taille=<span style="color: #cc66cc;">3</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span>texte<span style="color: black;">&#91;</span>enavant<span style="color: black;">&#93;</span> &gt;= <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span><span style="color: #cc66cc;">0xf0</span> &amp;&amp; <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span>texte<span style="color: black;">&#91;</span>enavant<span style="color: black;">&#93;</span> &lt;= <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span><span style="color: #cc66cc;">0xff</span><span style="color: black;">&#41;</span>
    taille=<span style="color: #cc66cc;">4</span>;
  <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
    std::cerr&lt;&lt;<span style="color: #FF0000;">&quot;caract&egrave;re non UTF-8&quot;</span>&lt;&lt;std::endl;
    enavant++;
    <span style="color: #0000ff;">return</span> carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
  <span style="color: black;">&#125;</span>
  std::string c=texte.substr<span style="color: black;">&#40;</span>enavant,taille<span style="color: black;">&#41;</span>;
  enavant+=taille;
  <span style="color: #0000ff;">return</span> c;
<span style="color: black;">&#125;</span></pre></td></tr></table></pre>
</div><br />
l'expression à anlyser se trouve dans un fichier. le nom de ce fichier devra être mentionné dans la ligne de commande<br />
mettons par exemple dans ce fichier l'expression r+84-5/(a+b)*25<br />
ce programme répondra:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br /></div></td><td valign="top"><pre style="margin: 0">expression -&gt; terme expressionprim
terme -&gt; facteur termeprim
facteur -&gt; identificateur
termeprim -&gt; epsilon
expressionprim -&gt; plus terme expressionprim
terme -&gt; facteur termeprim
facteur -&gt; nombre
termeprim -&gt; epsilon
expressionprim -&gt; moins terme expressionprim
terme -&gt; facteur termeprim
facteur -&gt; nombre
termeprim -&gt; slash facteur termeprim
facteur -&gt; parenthèse ouvrante expression parenthèse fermante
expression -&gt; terme expressionprim
terme -&gt; facteur termeprim
facteur -&gt; identificateur
termeprim -&gt; epsilon
expressionprim -&gt; plus terme expressionprim
terme -&gt; facteur termeprim
facteur -&gt; identificateur
termeprim -&gt; epsilon
expressionprim -&gt; epsilon
termeprim -&gt; etoile facteur termeprim
facteur -&gt; nombre
termeprim -&gt; epsilon
expressionprim -&gt; epsilon</pre></td></tr></table></pre>
</div>ou plus simplement avec a*5+b<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:168px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td valign="top"><pre style="margin: 0">expression -&gt; terme expressionprim
terme -&gt; facteur termeprim
facteur -&gt; identificateur
termeprim -&gt; etoile facteur termeprim
facteur -&gt; nombre
termeprim -&gt; epsilon
expressionprim -&gt; plus terme expressionprim
terme -&gt; facteur termeprim
facteur -&gt; identificateur
termeprim -&gt; epsilon
expressionprim -&gt; epsilon</pre></td></tr></table></pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>emmesse</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/116855-emmesse/b10584/analyse-syntaxique-descendante/</guid>
		</item>
		<item>
			<title><![CDATA[L'analyse lexicale, première phase de la compilation]]></title>
			<link>https://www.developpez.net/forums/blogs/116855-emmesse/b10521/l-analyse-lexicale-premiere-phase-compilation/</link>
			<pubDate>Sun, 03 Sep 2023 07:10:51 GMT</pubDate>
			<description><![CDATA[L'analyse lexicale est une...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">L'analyse lexicale est une phase, la première, de la compilation. Elle consiste à lire le code source pour en extraire les unités lexicales.<br />
Une unité lexicale est une entité qui correspond à un élément du langage traduit par le compilateur. Cette unité lexicale peut être accompagnée d'un attribut, un lexème, qui spécifie l'unité lexicale. Par exemple, sur la ligne de code suivante :<br />
               Vitesse := 35<br />
L'analyseur lexical retournera, un par un à chaque fois que l'analyseur syntaxique le lui demande, les unités lexicales suivantes :<br />
&lt;identificateur,Vitesse&gt; , &lt;deux-points-egal, &gt; &lt;nb,35&gt;<br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=643392&amp;d=1693723632" border="0" alt="Nom : analex.png
Affichages : 16082
Taille : 40,3 Ko"  style="float: CONFIG" /><br />
<br />
Pour reconnaître un lexème, l'analyseur lexical utilise des diagrammes de transition. Ce sont des graphes orientés dont les nœuds sont des états en forme de cercle et comportant un numéro. Les arcs sont associés à un caractère. L'analyseur lexical change d'état à chaque caractère lu. Ce diagramme de transition comporte un ou plusieurs états d'acceptations indiqués par un double cercle. Lorsque l'un de ces états est atteint, l'analyseur lexical retourne l'unité lexicale indiquée près de cet état d'acceptation. Parfois, quand un arc indique &quot;autre&quot;, l'analyseur lexical doit dépasser le dernier caractère du lexème. Dans ce cas, il doit donc reculer d'un caractère avant de retourner l'unité lexicale. Ce cas est indiqué par une étoile qui précède le nom de l'unité lexicale.<br />
<br />
Un diagramme de transition qui représente un identificateur (une lettre éventuellement précédée d'un ou plusieurs underscores et éventuellement suivie par une ou plusieurs lettre ou chiffres ou underscores) pourra être le suivant :<br />
<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=643393&amp;d=1693723702" border="0" alt="Nom : id.png
Affichages : 10898
Taille : 14,6 Ko"  style="float: CONFIG" /><br />
<br />
L'analyseur lexical utilise les diagrammes de transition les uns après les autres. Si le diagramme ne correspond pas, les variables sont actualisées afin d'utiliser le diagramme suivant. Si tous les diagrammes ont été parcourus, une erreur est spécifiée.<br />
<br />
Le code source est chargé dans un tampon. Il est parcouru par la variable &quot;enavant&quot;. La variable &quot;debutlex&quot; indique le premier caractère du lexème courant. Il sert, en cas d'échec d'un diagramme, à remettre la variable enavant au début du lexème.<br />
<br />
Afin d'être compatible avec l'UTF-8, on utilise une variable taille qui indique de combien d'octets est le caractère lu. Si le premier octet est compris entre 0 et 127, le caractère est encodé sur un octet. La valeur de la variable taille est égal à 1. Si il est compris entre 224 et 239, taille sera égal à 2. Si il est compris entre 224 et 239, taille sera egal à 3, et à 4 pour une valeur comprise entre 240 et 255. Sinon le programme signale un caractère non utf-8, incrémente enavant et revient au début de la boucle servant à tester les diagrammes de transition.<br />
Le diagramme de transition est implémenté avec l'instruction switch dont chaque cas indique un état. Le caractère est lu par la fonction carsuiv et l'analyseur lexical choisi l'état suivant en fonction de ce caractère.<br />
On utilisera un type énumération pour que l'analyseur désigne une unité lexicale.<br />
<br />
Nous allons implémenter un analyseur lexical qui reconnaîtra trois types de lexeme : identificateur, nombre, deux-points et deux-points-egal.<br />
Voici les diagrammes de transitions :<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=646561&amp;d=1700000389" border="0" alt="Nom : deuxpts.png
Affichages : 6852
Taille : 18,6 Ko"  style="float: CONFIG" /><br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=643393&amp;d=1693723702" border="0" alt="Nom : id.png
Affichages : 10898
Taille : 14,6 Ko"  style="float: CONFIG" /><br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=643395&amp;d=1693723970" border="0" alt="Nom : nb.png
Affichages : 9770
Taille : 28,1 Ko"  style="float: CONFIG" /><br />
<br />
Voici le programme :<br />
terminal.hpp<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code cpp :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">#ifndef TERMINAL_HPP</span>
<span style="color: #339933;">#define TERMINAL_HPP</span>
&nbsp;
<span style="color: #0000ff;">enum</span> terminal <span style="color: black;">&#123;</span>identificateur,nombre,deuxpointsegal,deuxpoints,FDF<span style="color: black;">&#125;</span>;
&nbsp;
<span style="color: #339933;">#endif</span></pre></td></tr></table></pre>
</div>main.cpp<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code cpp :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;iostream&gt;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;string&gt;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;vector&gt;</span>
&nbsp;
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &quot;lexical.hpp&quot;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &quot;terminal.hpp&quot;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: black;">&#40;</span><span style="color: #0000ff;">int</span> argc,<span style="color: #0000ff;">char</span> *argv<span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  std::vector&lt;std::string&gt;args;
  <span style="color: #0000ff;">for</span><span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> i=<span style="color: #cc66cc;">0</span>;i&lt;<span style="color: #0000ff;">static_cast</span>&lt;<span style="color: #0000ff;">unsigned</span>&gt;<span style="color: black;">&#40;</span>argc<span style="color: black;">&#41;</span>;++i<span style="color: black;">&#41;</span>
    args.push_back<span style="color: black;">&#40;</span>argv<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>argc!=<span style="color: #cc66cc;">2</span><span style="color: black;">&#41;</span>
    std::cerr&lt;&lt;<span style="color: #FF0000;">&quot;manque le fichier&quot;</span>&lt;&lt;std::endl;
  <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
    lexical L<span style="color: black;">&#40;</span>args<span style="color: black;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>;
    std::string lexeme;
    terminal ulex;
    <span style="color: #0000ff;">int</span> ligne=<span style="color: #cc66cc;">1</span>;
    <span style="color: #0000ff;">for</span><span style="color: black;">&#40;</span>L.analex<span style="color: black;">&#40;</span>ulex,lexeme,ligne<span style="color: black;">&#41;</span>;ulex!=FDF;L.analex<span style="color: black;">&#40;</span>ulex,lexeme,ligne<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
      <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>ulex<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
      <span style="color: #0000ff;">case</span> identificateur:
	std::cout&lt;&lt;<span style="color: #FF0000;">&quot;ligne &quot;</span>&lt;&lt;ligne&lt;&lt;<span style="color: #FF0000;">&quot;: identificateur &quot;</span>&lt;&lt;lexeme&lt;&lt;std::endl;
	<span style="color: #0000ff;">break</span>;
      <span style="color: #0000ff;">case</span> deuxpoints:
	std::cout&lt;&lt;<span style="color: #FF0000;">&quot;ligne &quot;</span>&lt;&lt;ligne&lt;&lt;<span style="color: #FF0000;">&quot;: deuxpoints &quot;</span>&lt;&lt;std::endl;
	<span style="color: #0000ff;">break</span>;
      <span style="color: #0000ff;">case</span> deuxpointsegal:
	std::cout&lt;&lt;<span style="color: #FF0000;">&quot;ligne &quot;</span>&lt;&lt;ligne&lt;&lt;<span style="color: #FF0000;">&quot;: deux-points-egal &quot;</span>&lt;&lt;std::endl;
	<span style="color: #0000ff;">break</span>;
      <span style="color: #0000ff;">case</span> nombre:
	std::cout&lt;&lt;<span style="color: #FF0000;">&quot;ligne &quot;</span>&lt;&lt;ligne&lt;&lt;<span style="color: #FF0000;">&quot;: nombre &quot;</span>&lt;&lt;lexeme&lt;&lt;std::endl;
	<span style="color: #0000ff;">break</span>;
      <span style="color: black;">&#125;</span>
  <span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span></pre></td></tr></table></pre>
</div>lexical.hpp:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code cpp :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">#ifndef LEXICAL_HPP</span>
<span style="color: #339933;">#define LEXICAL_HPP</span>
&nbsp;
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;string&gt;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;fstream&gt;</span>
&nbsp;
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &quot;terminal.hpp&quot;</span>
&nbsp;
<span style="color: #0000ff;">class</span> lexical<span style="color: black;">&#123;</span>
<span style="color: #0000ff;">public</span>:
  lexical<span style="color: black;">&#40;</span>std::string fichierentree<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">void</span> analex<span style="color: black;">&#40;</span>terminal &amp;ulex,std::string &amp;lexeme,<span style="color: #0000ff;">int</span> &amp;ligne<span style="color: black;">&#41;</span>;
<span style="color: #0000ff;">private</span>:
  std::string texte;
  std::string caracterelu;
  std::ifstream entree;
  <span style="color: #0000ff;">size_t</span> enavant,debutlex;
  <span style="color: #0000ff;">size_t</span> taille;
  <span style="color: #0000ff;">bool</span> utf8;
  std::string readFileIntoString<span style="color: black;">&#40;</span><span style="color: #0000ff;">const</span> std::string path<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">bool</span> obtenirFDF<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">bool</span> obtenirblanc<span style="color: black;">&#40;</span><span style="color: #0000ff;">int</span> &amp;ligne<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">bool</span> obteniridentificateur<span style="color: black;">&#40;</span>terminal &amp;ulex,std::string &amp;lexeme<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">bool</span> obtenirnombre<span style="color: black;">&#40;</span>terminal &amp;ulex,std::string &amp;lexeme<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">bool</span> obtenir2ptsega<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">void</span> calcul_taille<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
  std::string carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
<span style="color: black;">&#125;</span>;
<span style="color: #339933;">#endif</span></pre></td></tr></table></pre>
</div>lexical.cpp:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code cpp :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br />201<br />202<br />203<br />204<br />205<br />206<br />207<br />208<br />209<br />210<br />211<br />212<br />213<br />214<br />215<br />216<br />217<br />218<br />219<br />220<br />221<br />222<br />223<br />224<br />225<br />226<br />227<br />228<br />229<br />230<br />231<br />232<br />233<br />234<br />235<br />236<br />237<br />238<br />239<br />240<br />241<br />242<br />243<br />244<br />245<br />246<br />247<br />248<br />249<br />250<br />251<br />252<br />253<br />254<br />255<br />256<br />257<br />258<br />259<br />260<br />261<br />262<br />263<br />264<br />265<br />266<br />267<br />268<br />269<br />270<br />271<br />272<br />273<br />274<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;string&gt;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;iostream&gt;</span>
&nbsp;
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &quot;lexical.hpp&quot;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &quot;terminal.hpp&quot;</span>
&nbsp;
lexical::lexical<span style="color: black;">&#40;</span>std::string fichierentree<span style="color: black;">&#41;</span>:enavant<span style="color: black;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: black;">&#41;</span>,debutlex<span style="color: black;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  entree.open<span style="color: black;">&#40;</span>fichierentree.c_str<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>;
  texte = readFileIntoString<span style="color: black;">&#40;</span>fichierentree<span style="color: black;">&#41;</span>;
<span style="color: black;">&#125;</span>
&nbsp;
std::string lexical::readFileIntoString<span style="color: black;">&#40;</span><span style="color: #0000ff;">const</span> std::string path<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span>!entree.is_open<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    std::cerr &lt;&lt; <span style="color: #FF0000;">&quot;Could not open the file - '&quot;</span> &lt;&lt; path &lt;&lt; <span style="color: #FF0000;">&quot;'&quot;</span> &lt;&lt; std::endl;
    exit<span style="color: black;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: black;">&#41;</span>;
  <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">return</span> std::string<span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>std::istreambuf_iterator&lt;<span style="color: #0000ff;">char</span>&gt;<span style="color: black;">&#40;</span>entree<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>,
		       std::istreambuf_iterator&lt;<span style="color: #0000ff;">char</span>&gt;<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>;
  <span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> lexical::analex<span style="color: black;">&#40;</span>terminal &amp;ulex,std::string &amp;lexeme,<span style="color: #0000ff;">int</span> &amp;ligne<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span><span style="color: #0080ff;">true</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>obtenirblanc<span style="color: black;">&#40;</span>ligne<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
      ;<span style="color: #808080;">//ignorer le blanc. enavant pointe sur le premier caract&egrave;re du lexeme suivant</span>
    <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>obteniridentificateur<span style="color: black;">&#40;</span>ulex,lexeme<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
      <span style="color: #0000ff;">return</span>;
    <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>obtenir2ptsega<span style="color: black;">&#40;</span>ulex<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
      <span style="color: #0000ff;">return</span>;
    <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>obtenirnombre<span style="color: black;">&#40;</span>ulex,lexeme<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
      <span style="color: #0000ff;">return</span>;
    <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>obtenirFDF<span style="color: black;">&#40;</span>ulex<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
      <span style="color: #0000ff;">return</span>;
    <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
      std::cerr&lt;&lt;<span style="color: #FF0000;">&quot;ligne &quot;</span>&lt;&lt;ligne&lt;&lt;<span style="color: #FF0000;">&quot; : carat&egrave;re hors langage &quot;</span>&lt;&lt;caracterelu&lt;&lt;std::endl;
      enavant+=taille;<span style="color: #808080;">//ignorer le caract&egrave;re hors  langage</span>
    <span style="color: black;">&#125;</span>
  <span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> lexical::obtenirblanc<span style="color: black;">&#40;</span><span style="color: #0000ff;">int</span> &amp;ligne<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">int</span> etat=<span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">bool</span> continuer=<span style="color: #0080ff;">true</span>;
  <span style="color: #0000ff;">bool</span> reussi;
  debutlex=enavant;
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>continuer<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>etat<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">0</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;<span style="color: #800000;">\n</span>&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	ligne++;
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot; &quot;</span>||caracterelu==<span style="color: #FF0000;">&quot;<span style="color: #800000;">\t</span>&quot;</span>||caracterelu==<span style="color: #FF0000;">&quot;<span style="color: #800000;">\r</span>&quot;</span><span style="color: black;">&#41;</span>
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	continuer=<span style="color: #0080ff;">false</span>;
	reussi=<span style="color: #0080ff;">false</span>;
	enavant=debutlex;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">1</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;<span style="color: #800000;">\n</span>&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	ligne++;
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot; &quot;</span>||caracterelu==<span style="color: #FF0000;">&quot;<span style="color: #800000;">\t</span>&quot;</span>||caracterelu==<span style="color: #FF0000;">&quot;<span style="color: #800000;">\r</span>&quot;</span><span style="color: black;">&#41;</span>
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: #0000ff;">else</span>
	etat=<span style="color: #cc66cc;">3</span>;
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">3</span>:
      enavant-=taille;
      continuer=<span style="color: #0080ff;">false</span>;
      reussi=<span style="color: #0080ff;">true</span>;
    <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">return</span> reussi;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> lexical::obtenirFDF<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">int</span> etat=<span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">bool</span> continuer=<span style="color: #0080ff;">true</span>;
  <span style="color: #0000ff;">bool</span> reussi;
  debutlex=enavant;
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>continuer<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>etat<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">0</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu<span style="color: black;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: black;">&#93;</span>==<span style="color: #FF0000;">'</span><span style="color: #800000;">\0</span><span style="color: #FF0000;">'</span><span style="color: black;">&#41;</span>
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	continuer=<span style="color: #0080ff;">false</span>;
	reussi=<span style="color: #0080ff;">false</span>;
	enavant=debutlex;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">1</span>:
      continuer=<span style="color: #0080ff;">false</span>;
      reussi=<span style="color: #0080ff;">true</span>;
      ulex=FDF;
      <span style="color: #0000ff;">break</span>;
    <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">return</span> reussi;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> lexical::obteniridentificateur<span style="color: black;">&#40;</span>terminal &amp;ulex,std::string &amp;lexeme<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">int</span> etat=<span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">bool</span> continuer=<span style="color: #0080ff;">true</span>;
  <span style="color: #0000ff;">bool</span> reussi;
  lexeme=<span style="color: #FF0000;">&quot;&quot;</span>;
  debutlex=enavant;
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>continuer<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>etat<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">0</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;_&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">0</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu &gt;=<span style="color: #FF0000;">&quot;A&quot;</span> &amp;&amp; caracterelu&lt;=<span style="color: #FF0000;">&quot;Z&quot;</span> || caracterelu &gt;= <span style="color: #FF0000;">&quot;a&quot;</span> &amp;&amp; caracterelu &lt;= <span style="color: #FF0000;">&quot;z&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span><span style="color: #808080;">//echec</span>
	enavant=debutlex;
	continuer=<span style="color: #0080ff;">false</span>;
	reussi=<span style="color: #0080ff;">false</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">1</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu &gt;=<span style="color: #FF0000;">&quot;A&quot;</span> &amp;&amp; caracterelu&lt;=<span style="color: #FF0000;">&quot;Z&quot;</span> || caracterelu &gt;= <span style="color: #FF0000;">&quot;a&quot;</span> &amp;&amp; caracterelu &lt;= <span style="color: #FF0000;">&quot;z&quot;</span> || caracterelu &gt;=<span style="color: #FF0000;">&quot;0&quot;</span> &amp;&amp; caracterelu &lt;= <span style="color: #FF0000;">&quot;9&quot;</span> || caracterelu==<span style="color: #FF0000;">&quot;_&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span> <span style="color: #808080;">//autre caract&egrave;re</span>
	etat=<span style="color: #cc66cc;">2</span>;
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">2</span>:
      continuer=<span style="color: #0080ff;">false</span>;
      reussi=<span style="color: #0080ff;">true</span>;
      enavant-=taille;<span style="color: #808080;">//reculer pour le d&eacute;passement de caract&egrave;re (autre caract&egrave;re)</span>
      ulex=identificateur;
    <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">return</span> reussi;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> lexical::obtenir2ptsega<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">bool</span> continuer=<span style="color: #0080ff;">true</span>;
  <span style="color: #0000ff;">bool</span> reussi;
  <span style="color: #0000ff;">int</span> etat=<span style="color: #cc66cc;">0</span>;
  debutlex=enavant;
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>continuer<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>etat<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">0</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;:&quot;</span><span style="color: black;">&#41;</span>
        etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
        continuer=<span style="color: #0080ff;">false</span>;
	reussi=<span style="color: #0080ff;">false</span>;
	enavant=debutlex;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">1</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;=&quot;</span><span style="color: black;">&#41;</span>
        etat=<span style="color: #cc66cc;">2</span>;
      <span style="color: #0000ff;">else</span>
	etat=<span style="color: #cc66cc;">3</span>;
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">2</span>:
      ulex=deuxpointsegal;<span style="color: #808080;">//ulex est un attribut de la classe lexical</span>
      continuer=<span style="color: #0080ff;">false</span>;
      reussi=<span style="color: #0080ff;">true</span>;
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">3</span>:
      ulex=deuxpoints;
      enavant-=taille;
      reussi=<span style="color: #0080ff;">true</span>;
      continuer=<span style="color: #0080ff;">false</span>;
      <span style="color: #0000ff;">break</span>;
    <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">return</span> reussi;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> lexical::obtenirnombre<span style="color: black;">&#40;</span>terminal &amp;ulex,std::string &amp;lexeme<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">int</span> etat=<span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">bool</span> continuer=<span style="color: #0080ff;">true</span>;
  <span style="color: #0000ff;">bool</span> reussi;
  lexeme=<span style="color: #FF0000;">&quot;&quot;</span>;
  debutlex=enavant;
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>continuer<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>etat<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">0</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;,&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">2</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu&gt;=<span style="color: #FF0000;">&quot;0&quot;</span> &amp;&amp; caracterelu&lt;=<span style="color: #FF0000;">&quot;9&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	continuer=<span style="color: #0080ff;">false</span>;
	reussi=<span style="color: #0080ff;">false</span>;
	enavant=debutlex;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">1</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;,&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">2</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu&gt;=<span style="color: #FF0000;">&quot;0&quot;</span> &amp;&amp; caracterelu&lt;=<span style="color: #FF0000;">&quot;9&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span>
	etat=<span style="color: #cc66cc;">4</span>;<span style="color: #808080;">//autre</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">2</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu&gt;=<span style="color: #FF0000;">&quot;0&quot;</span> &amp;&amp; caracterelu&lt;=<span style="color: #FF0000;">&quot;9&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">3</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	enavant=debutlex;
	continuer=<span style="color: #0080ff;">false</span>;
	reussi=<span style="color: #0080ff;">false</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">3</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu&gt;=<span style="color: #FF0000;">&quot;0&quot;</span> &amp;&amp; caracterelu&lt;=<span style="color: #FF0000;">&quot;9&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">3</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	etat=<span style="color: #cc66cc;">4</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">4</span>:
      continuer=<span style="color: #0080ff;">false</span>;
      reussi=<span style="color: #0080ff;">true</span>;
      ulex=nombre;
      enavant-=taille;<span style="color: #808080;">//reculer pour le d&eacute;passement de caract&egrave;re (autre caract&egrave;re)</span>
    <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">return</span> reussi;
<span style="color: black;">&#125;</span>
&nbsp;
std::string lexical::carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span>texte<span style="color: black;">&#91;</span>enavant<span style="color: black;">&#93;</span> &lt;= <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span><span style="color: #cc66cc;">127</span><span style="color: black;">&#41;</span>
    taille=<span style="color: #cc66cc;">1</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span>texte<span style="color: black;">&#91;</span>enavant<span style="color: black;">&#93;</span> &gt;= <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span><span style="color: #cc66cc;">0xC2</span> &amp;&amp; <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span>texte<span style="color: black;">&#91;</span>enavant<span style="color: black;">&#93;</span> &lt;= <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span><span style="color: #cc66cc;">0xdf</span><span style="color: black;">&#41;</span>
    taille=<span style="color: #cc66cc;">2</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span>texte<span style="color: black;">&#91;</span>enavant<span style="color: black;">&#93;</span> &gt;= <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span><span style="color: #cc66cc;">0xe0</span> &amp;&amp; <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span>texte<span style="color: black;">&#91;</span>enavant<span style="color: black;">&#93;</span> &lt;= <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span><span style="color: #cc66cc;">0xef</span><span style="color: black;">&#41;</span>
    taille=<span style="color: #cc66cc;">3</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span>texte<span style="color: black;">&#91;</span>enavant<span style="color: black;">&#93;</span> &gt;= <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span><span style="color: #cc66cc;">0xf0</span> &amp;&amp; <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span>texte<span style="color: black;">&#91;</span>enavant<span style="color: black;">&#93;</span> &lt;= <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span><span style="color: #cc66cc;">0xff</span><span style="color: black;">&#41;</span>
    taille=<span style="color: #cc66cc;">4</span>;
  <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
    std::cerr&lt;&lt;<span style="color: #FF0000;">&quot;caract&egrave;re non UTF-8&quot;</span>&lt;&lt;std::endl;
    enavant++;
    <span style="color: #0000ff;">return</span> carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
  <span style="color: black;">&#125;</span>
  std::string c=texte.substr<span style="color: black;">&#40;</span>enavant,taille<span style="color: black;">&#41;</span>;
  enavant+=taille;
  <span style="color: #0000ff;">return</span> c;
<span style="color: black;">&#125;</span></pre></td></tr></table></pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>emmesse</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/116855-emmesse/b10521/l-analyse-lexicale-premiere-phase-compilation/</guid>
		</item>
		<item>
			<title><![CDATA[un algorithme pour détecter les récursivités à gauche d'une grammaire hors-contexte]]></title>
			<link>https://www.developpez.net/forums/blogs/116855-emmesse/b10431/algorithme-detecter-recursivites-gauche-d-grammaire-contexte/</link>
			<pubDate>Mon, 20 Feb 2023 01:18:02 GMT</pubDate>
			<description>Introduction 
 
Cet...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><font size="4">Introduction</font><br />
<br />
Cet algorithme prend en entrée une grammaire non contextuelle et donne la liste des non terminaux à parcourir pour obtenir les récursivités à gauches.<br />
<br />
<font size="4">Lignes d'enchaînement</font><br />
<br />
<font size="3">Définition</font><br />
<br />
Une ligne d'enchaînement est une suite de non terminaux tel que chacun de ces non terminaux, si celui-ci ne débute pas la ligne, soit l'un des premiers symboles du non terminal précédent.<br />
<br />
<font size="3">Exemple de construction d'une liste de lignes d'enchaînement</font><br />
<br />
Soit la grammaire suivante:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0">A -&gt; B a
A -&gt; C b
B -&gt; c i
C -&gt; d e f
C -&gt; F g
F -&gt; f h</pre></td></tr></table></pre>
</div>Il y a deux productions qui ont A pour tête, et donnent ainsi deux lignes d'enchaînement qui commencent par A. La liste des lignes d'enchaînement est pour l'instant:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">A
A</pre></td></tr></table></pre>
</div>Comme le non terminal B est l'un des premiers symboles de A, on l'ajoute à une des lignes qui commencent par A, lesquelles sont identiques. De même pour le non terminal C. On a donc pour l'instant les deux lignes suivantes:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">A B
A C</pre></td></tr></table></pre>
</div>Soit la production B:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">B -&gt; c i</pre>
</div>Comme c est un terminal, on ajoute rien à la première ligne se terminant par B, qui est unique.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">C -&gt; d e f
C -&gt; F g</pre></td></tr></table></pre>
</div>Comme on a deux productions dont C est la tête, on prend une ligne se terminant par C, et on la duplique. On a alors les lignes:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">AB
AC
AC</pre></td></tr></table></pre>
</div>Considérons la production<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">C -&gt; d e f</pre>
</div>Comme d est un terminal, on ajoute rien, ici, aux ligne se terminant par C.<br />
Dans la production suivante<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">C -&gt; F g</pre>
</div>Le symbole non terminal F étant l'un des premiers symboles de C, on ajoute F à l'une des lignes se terminant par C. Ces lignes sont identiques car AC a été dupliqué. On a donc la liste des enchaînements:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">AB
AC
ACF</pre></td></tr></table></pre>
</div>Dans la production suivante:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">F -&gt; f h,</pre>
</div>Le symbole f étant un terminal, on ajoute rien à la ligne se terminant par F.<br />
En définitive, on a la liste des lignes d'enchaînement suivante:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">A B
A C
A C F</pre></td></tr></table></pre>
</div>Si l'opérateur ou ( &quot;|&quot; ) a été utilisé, on considère chaque opérande comme une production. La tête de la production est distribuée à chacune de ces production.<br />
<br />
Si un non terminal se répète dans une ligne, on a une récursivité à gauche<br />
<br />
<font size="4">l'algorithme</font><br />
Nous considéreront chaque production de la grammaire les unes après les autres.<br />
Soit la production A &#8594; B R où B est le premier symbole de la partie droite de cette production et R le reste de cette production.<br />
Si A est absent des fins de ligne de la liste, on ajoute A en début de ligne autant de fois que A apparaît en tête de production.<br />
Si  B est un non terminal:<br />
On cherche B dans les lignes, de la liste, se terminant par A. Si ce B est trouvé dans une de ces lignes, une récursivité à gauche a été trouvée. On supprime les premiers non terminaux différents du symbole A. On met cette ligne de côté et on la supprime de la liste.<br />
Sinon, si B est absent de toutes les lignes se terminant par A, on ajoute B à l'une et seulement l'une  de ces lignes, et on fait apparaître cette ligne autant de  fois que B apparaît en tête de production.<br />
Si B est un terminal, on supprime une ligne se terminant par A.<br />
Les lignes misent de côté indiquent les récursivités à gauche qui ont été trouvés<br />
<br />
<font size="4">un exemple</font><br />
la grammaire est la suivante:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0">S &#8594; A a
S &#8594; b
A &#8594; A c
A &#8594; S d
A &#8594; &#949;</pre></td></tr></table></pre>
</div>La première production est S &#8594; A a. Il y a deux productions dont la tête est S, on écrit donc deux ligne avec juste S. Le premier symbole de cette production est A. C'est un non terminal. Comme les deux lignes sont constitués d'un seul S, on ne trouvera pas de A dans ces lignes. Il y a trois productions dont la tête est A. on ajoute A au premier S et on fait apparaître 3 fois cette nouvelle ligne. La liste est alors la suivante:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0">S A
S A
S A
S</pre></td></tr></table></pre>
</div>pour la production suivante, S &#8594; b, b est un terminal. On supprime alors la première ligne se terminant par S. La liste est:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">S A
S A
S A</pre></td></tr></table></pre>
</div>à la production A &#8594; A c, A est un non terminal. Il apparaît dans au moins une ligne se terminant par A. Une récursivité à gauche est détectée. On supprime au début de cette ligne les non terminaux différents de A. Cela donne une ligne ne contenant un seul A. On archive cette ligne et on la supprime de la liste. Il reste donc dans la liste les lignes suivantes:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">S A
S A</pre></td></tr></table></pre>
</div>la production suivante est A &#8594; S d. Le premier symbole est S. On le trouve dans au moins une ligne se terminant par A. La deuxième récursivité à gauche est détectée. Elle commence par S, on la garde donc telle quelle. On l'archive et il reste dans la liste:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">S A</pre>
</div>La dernière production est A &#8594; &#949;. &#949; est un terminal. On supprime alors la première ligne se terminant par A. La liste est alors vide. On a considéré toutes les productions. L'algorithme est terminé. On a alors archivé les lignes A et S-A. Ce qui s’interprète de la sorte: Le premier A indique une récursivité directe dans la production A, et S-A une récursivité indirecte qui commence à la production S &#8594; A a puis se termine à A &#8594; S d.<br />
<br />
<font size="4">un autre exemple</font><br />
Voici un autre exemple avec la grammaire suivante où les non terminaux A et B sont inaccessibles:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:144px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0">X &#8594; Y
Y &#8594; Y D
Y &#8594; Y a
Y &#8594; b
A &#8594; B
B &#8594; B d
C &#8594; c
D &#8594; D C
D &#8594; &#949;</pre></td></tr></table></pre>
</div>    1. X &#8594; Y<br />
       X n'apparaît sur aucune ligne de la liste car elle est vide. On ajoute donc une ligne commençant par X à cette liste. Puis on ajoute Y à cette ligne. Et comme Y apparaît dans trois têtes de production, on fait apparaître trois fois cette ligne:<br />
       <div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">X Y
X Y
X Y</pre></td></tr></table></pre>
</div>    2. Y &#8594; Y D<br />
       La tête de cette production est Y. Nous allons donc nous occuper de la première ligne, où apparaît ce Y en fin de ligne. on considère ensuite le premier symbole de la partie droite, qui est aussi Y. Comme ce Y est déjà présent dans cette ligne, on a trouvé une récursivité à gauche. On supprime du début de la ligne les symboles différents de Y. la ligne devient Y tout court. On l'archive et on la supprime de la liste. La liste est alors:<br />
     <div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">X Y
X Y</pre></td></tr></table></pre>
</div>    3. Y &#8594; Y a<br />
       Comme précédemment, on a trouvé une récursivité à gauche. Seul Y est archivé car X est au début de la ligne et est différent de Y. Une ligne de la liste est supprimée. La liste est alors:<br />
        <div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">X Y</pre>
</div>    4. Y &#8594; b<br />
       la tête de production est Y. On considère une ligne se terminant par Y, puis on la supprime car b est un terminal. La liste est ainsi vide<br />
    5. A &#8594; B<br />
       La liste étant vide, on ajoute A, qui ne se trouve qu’une fois en tête de production, sur une ligne. Puis on considère le premier symbole, qui est B, et est ajouté à la ligne A. B étant présent qu'une fois en tête de production, cette ligne ne doit apparaître qu'une fois dans la liste, que voici:<br />
       <div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">A B</pre>
</div>    6. B &#8594; B d<br />
       La tête et le premier symbole sont tous les deux B. On considère la ligne de la liste, qui est A B car elle se termine par B. B, le premier symbole, est présent dans A-B. Il y a donc récursivité à gauche. On supprime les non terminaux du début de la ligne, jusqu'à B. On a donc B seul. On l'archive et supprime cette ligne. La liste est alors vide.<br />
    7. C &#8594; c<br />
       La liste étant vide, on ajoute C à cette liste. Or 'c' est un terminal. La ligne précédemment ajoutée est supprimée. La liste est encore vide<br />
    8. D &#8594; D C<br />
       La liste est vide, D apparaît deux fois en tête de production.on ajoute donc deux lignes débutant par D. Mais D est aussi le premier symbole de la partie droite de la production. Étant présente dans au moins une des lignes, qui est constituée de D seul, on est encore face à une récursivité à gauche. La première ligne commençant par D, elle est archivée telle quelle et supprimée de la liste.<br />
    9. D &#8594; &#949;<br />
       &#949; est un terminal. La ligne se terminant par D est supprimée. La liste est vide et on a utilisé toutes les productions.<br />
l'archive est (Y;Y;B;D). Ces quatre éléments n'ont qu'un symbole. Il s'agit donc de récursivités à gauches immédiates. Deux en Y, une en B et une en D</blockquote>

]]></content:encoded>
			<dc:creator>emmesse</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/116855-emmesse/b10431/algorithme-detecter-recursivites-gauche-d-grammaire-contexte/</guid>
		</item>
		<item>
			<title><![CDATA[un générateur de lignes d'accords en notation abc]]></title>
			<link>https://www.developpez.net/forums/blogs/116855-emmesse/b10374/generateur-lignes-d-accords-notation-abc/</link>
			<pubDate>Tue, 23 Aug 2022 08:00:35 GMT</pubDate>
			<description><![CDATA[Générateur de ligne d'accords...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Générateur de ligne d'accords pour le reggae<br />
<br />
<font size="3">introduction</font><br />
selon le cycle des quintes, les accdord voisin du do majeur sont les accords suivants:<br />
fa majeur,sol majeur,ré mineur,la mineur,mi minieur.<br />
il parait que si on choisi quatre accords voisins du do dans le cycle des quintes, do y compris, on obtient quelque chose de potable.<br />
<br />
<font size="3">le programme</font><br />
chaque mesure sera joué en contre-temps avec le même accord. Chacune de ces mesures n'est donc constituée que d'un seul accord. On implémente ces mesures dans le tableau &quot;accord&quot;:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:144px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0">
  std::string accord[6]={
    &quot;z [CEG] z [CEG]|&quot;,//do majeur (do mi sol)
    &quot;z [DFA] z [DFA]|&quot;,//ré mineur (ré fa la)
    &quot;z [EGB] z [EGB]|&quot;,//mi mineur (mi sol si)
    &quot;z [FAc] z [FAc]|&quot;,//fa majeur (fa la do)
    &quot;z [GBd] z [GBd]|&quot;,//sol majeur (sol si ré)
    &quot;z [Ace] z [Ace]|&quot;//la mineur (la do mi)
  };</pre></td></tr></table></pre>
</div>Pour l'entête, un std::cout sera utilisé ainsi:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">std::cout&lt;&lt;&quot;X: 1\nK: C\nM: 4/4\nL: 1/4&quot;&lt;&lt;std::endl;</pre>
</div>La ligne se constitue de quatre accord. Le programme écrit quatre mesures.<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">for(int i=0;i&lt;4;i++)
  std::cout&lt;&lt;accord[distr(eng)]
std::cout&lt;&lt;&quot;]&quot;&lt;&lt;std::endl;</pre></td></tr></table></pre>
</div>voici le programme complet:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br /></div></td><td valign="top"><pre style="margin: 0">#include &lt;iostream&gt;
#include &lt;random&gt;
#include &lt;string&gt;

int main(){
  std::random_device rd;
  std::mt19937 eng(rd());
  std::uniform_int_distribution&lt;int&gt; distr(0,5);
  std::string accord[6]={
    &quot; z [CEG] z [CEG] |&quot;,
    &quot; z [DFA] z [DFA] |&quot;,
    &quot; z [EGB] z [EGB] |&quot;,
    &quot; z [FAc] z [FAc] |&quot;,
    &quot; z [GBd] z [GBd] |&quot;,
    &quot; z [Ace] z [Ace] |&quot;
  };
  std::cout&lt;&lt;&quot;X: 1\nK: C\nM: 4/4\nL: 1/4&quot;&lt;&lt;std::endl;
  for(int i=0;i&lt;4;i++)
    std::cout&lt;&lt;accord[distr(eng)];
  std::cout&lt;&lt;&quot;]&quot;&lt;&lt;std::endl;
}</pre></td></tr></table></pre>
</div>cela pourrait donner ceci:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0">X: 1
K: C
M: 4/4
L: 1/4
z [FAc] z [FAc]|z [Ace] z [Ace]|z [GBd] z [GBd]|z [GBd] z [GBd]|]</pre></td></tr></table></pre>
</div><font size="3">utilisation</font><br />
il faudra installer abcmidi, timidity:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">$  sudo apt install abcmidi timidity</pre>
</div>supposons que l’exécutable se nome genR, ce programme s'utilise ainsi:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">$  genR | tee nomfichier.abc
$  abc2midi nomfichier.abc
$  timidity nomfichier1.mid (le 1 est ajouté par abc2midi)</pre></td></tr></table></pre>
</div>on peut aussi convertir en wav, puis en mp3:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">$  sudo apt install lame
$  timidity -Ow nomfichier1.mid (pour convertir en wav)
$  lame nomfichier1.wav (pour convertir en mp3)</pre></td></tr></table></pre>
</div>pour voir la partition écrite:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">$  sudo apt install abc2ps ps2pdf
$  genR &gt; nomfichier.abc
$  abcm2ps -O nomfichier.ps nomfichier.abc</pre></td></tr></table></pre>
</div>evince saura afficher ce fichier:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">$  evince nomfichier.ps</pre>
</div>pour le convertir en pdf:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">$  ps2pdf nomfichier.ps
$  evince nomfichier.pdf</pre></td></tr></table></pre>
</div>voici en pdf quelques exemples<br />
<a href="https://www.developpez.net/forums/attachment.php?attachmentid=644106&amp;d=1695046783"  title="Nom : musique4.pdf
Affichages : 47
Taille : 4,2 Ko">musique4.pdf</a><br />
<a href="https://www.developpez.net/forums/attachment.php?attachmentid=644107&amp;d=1695046846"  title="Nom : musique5.pdf
Affichages : 42
Taille : 4,2 Ko">musique5.pdf</a><br />
<a href="https://www.developpez.net/forums/attachment.php?attachmentid=644108&amp;d=1695046924"  title="Nom : musique6.pdf
Affichages : 45
Taille : 4,3 Ko">musique6.pdf</a><br />
<a href="https://www.developpez.net/forums/attachment.php?attachmentid=644109&amp;d=1695046959"  title="Nom : musique7.pdf
Affichages : 38
Taille : 4,3 Ko">musique7.pdf</a></blockquote>

]]></content:encoded>
			<dc:creator>emmesse</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/116855-emmesse/b10374/generateur-lignes-d-accords-notation-abc/</guid>
		</item>
		<item>
			<title>attributs dans une production de liste à droite</title>
			<link>https://www.developpez.net/forums/blogs/116855-emmesse/b10343/attributs-production-liste/</link>
			<pubDate>Sun, 05 Jun 2022 04:41:46 GMT</pubDate>
			<description>voici les production pour une...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">voici les production pour une liste à droite:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">A -&gt; a A
  -&gt; b</pre></td></tr></table></pre>
</div>on pourrais croire le schéma de traduction dirigée par la syntaxe serait le suivant:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">A -&gt; a { A1.h = f( a.unilex ; A.h )} A1 { A.s = A1.s }
  -&gt; b { A.s = g( b.unilex ; A.h ) }</pre></td></tr></table></pre>
</div>Ce qui pose problème est que le non terminal A possède un attribut hérité. A ne peut donc pas être un axiome car à la racine de l'arbre, il n'y a ni de frères de gauche ni parent. L'attribut hérité au nœud A de l'arbre syntaxique décoré à l'axiome est alors incalculable.<br />
je propose d'ajouter un non terminal qui sera à la racine et fournit une valeur nulle pour l'attribut du premier A:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">P -&gt; A
A -&gt; a A
  -&gt; b</pre></td></tr></table></pre>
</div>le schéma de traduction est:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">P -&gt; { A.h = nil } A { P.s = A.s }
A -&gt; a { A1.h = f( A.h ; a.unilex ) } A1 { A.s = A1.s }
  -&gt; b { A.s = g( A.h ; b.unilex ) }</pre></td></tr></table></pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>emmesse</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/116855-emmesse/b10343/attributs-production-liste/</guid>
		</item>
		<item>
			<title>imprimer avec emacs sous debian</title>
			<link>https://www.developpez.net/forums/blogs/116855-emmesse/b10287/imprimer-emacs-sous-debian/</link>
			<pubDate>Thu, 27 Jan 2022 15:17:07 GMT</pubDate>
			<description>Bonjour, 
 
avec Debian, Je...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Bonjour,<br />
<br />
avec Debian, Je n'arrivais pas à imprimer avec emacs. En bas de la fenêtre il y avait quelque chose ressemblant à &quot;spooling done&quot; (désolé mais je ne m'en souviens pas très bien) et rien à l'imprimante.<br />
La solution était d'installer le paquet cups-bsd. (installer lpr ne donnait rien)<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">su
apt install cups-bsd</pre></td></tr></table></pre>
</div>maintenant ça marche<br />
<br />
si cela peut aider quelqu'un qui utilise debian et emacs.</blockquote>

]]></content:encoded>
			<dc:creator>emmesse</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/116855-emmesse/b10287/imprimer-emacs-sous-debian/</guid>
		</item>
		<item>
			<title>tri par segmentation</title>
			<link>https://www.developpez.net/forums/blogs/116855-emmesse/b10271/tri-segmentation/</link>
			<pubDate>Sun, 02 Jan 2022 16:15:18 GMT</pubDate>
			<description>on segmente le sous-tableau T...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">on segmente le sous-tableau T en trois parties, place étant un indice:<br />
* indices de inf à place-1<div style="margin-left:40px">dans cette partie, les valeurs sont inférieures à T[place]</div>* indice valant place<br />
* indices de place+1 à sup<div style="margin-left:40px">dans cette partie, les valeurs sont supérieures à T[place]</div><br />
on initialise pivot à T[inf]<br />
<br />
l'assertion de boucle pour la segmentation est:<br />
<i>{ si inf+1&lt;=x&lt;=i-1 alors T[x]&lt;=pivot } et { si j+1&lt;=x&lt;=sup alors T[x]&gt;pivot } et { les éléments, du sous-tableau d'indices i à j ne sont pas triés }</i><br />
* i = j+1<br />
<div style="margin-left:40px">on a :<br />
 <i>{si inf+1&lt;=x&lt;=j alors T[x]&lt;=pivot } et { si j+1&lt;=x&lt;=sup alors T[x]&gt;pivot }</i><br />
Comme pivot=T[inf], on permute T[inf] et T[j] et on obtient :<br />
<i>{ si inf&lt;=x&lt;=j alors T[x]&lt;=pivot } et { si j+1&lt;=x&lt;=sup alors T[x]&gt;pivot }</i><br />
Dans ce cas, la segmentation de cette partie de ce sous-tableau est terminée. L'indice du pivot est la valeur de j car T[j]=pivot. On retourne donc cette valeur</div>* i &lt;= j<br />
<div style="margin-left:40px">** T[i] &lt;= pivot<br />
<div style="margin-left:40px">On a <i>si inf+1&lt;=x&lt;=i alors T[x]&lt;=inf</i><br />
On incrémente i pour retrouver <i>{ si inf+1&lt;=x&lt;=i-1 alors T[x]&lt;=pivot } et { si j+1&lt;=x&lt;=sup alors T[x]&gt;pivot } et { les éléments, du sous-tableau d'indices i à j ne sont pas triés }</i></div>** T[i] &gt; pivot<br />
<div style="margin-left:40px">On permute T[i] et T[j]. On a alors :<br />
<i>{ si inf+1&lt;=x&lt;=i-1 } et { si j&lt;=x&lt;=sup alors T[x]&gt;pivot } et { les éléments, du sous-tableau, d'indices i à j - 1, ne sont pas triés }</i><br />
On décrémente j pour retrouver <i>{ si inf+1&lt;=x&lt;=i-1 alors T[x]&lt;=pivot } et { si j+1&lt;=x&lt;=sup alors T[x]&gt;pivot} et { les éléments, du sous-tableau, d'indices i à j, ne sont pas triés }</i></div></div>puis, le retour de la segmentation étant dans la variable &quot;place&quot;, on trie le sous-tableau d'indices inf à place-1 et celui d'indices place+1 à sup.<br />
<font size="4">implémentation:</font><br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br /></div></td><td valign="top"><pre style="margin: 0">#include &lt;iostream&gt;
#include &lt;vector&gt;

class tableau{
public:
  tableau();
  void triseg(int const &amp;inf,int const &amp;sup);
  void ajouter(int const &amp;i);
  void permuter(int const &amp;i,int const &amp;j);
  void ecrire();
  int taille();
private:
  int segmentation(int const &amp;inf,int const &amp;sup);
  std::vector&lt;int&gt;T;
};

int main(){
  tableau tab;
  tab.triseg(0,tab.taille()-1);
  //tab.taille()-1 est l'indice du dernier élément du tableau
  tab.ecrire();
}

tableau::tableau(){
  int n,x;
  std::cout&lt;&lt;&quot;Combien d'éléments?&quot;;
  std::cin&gt;&gt;n;
  for(int i=0;i&lt;n;i++){
    std::cout&lt;&lt;&quot;élément n°&quot;&lt;&lt;i+1&lt;&lt;&quot;?&quot;;
    std::cin&gt;&gt;x;
    ajouter(x);
  }
}

int tableau::taille(){
  return T.size();
}

void tableau::triseg(int const &amp;inf,int const &amp;sup){
  int place;
  if(inf&lt;sup){
    place=segmentation(inf,sup);
    triseg(inf,place-1);
    triseg(place+1,sup);
  }
}

void tableau::ajouter(int const &amp;i){
  T.push_back(i);
}

void tableau::ecrire(){
  for(auto i:T)
    std::cout&lt;&lt;i&lt;&lt;&quot; &quot;;
  std::cout&lt;&lt;std::endl;
}

void tableau::permuter(int const &amp;i,int const &amp;j){
  int t;
  t=T[i];
  T[i]=T[j];
  T[j]=t;
}

int tableau::segmentation(int const &amp;inf,int const &amp;sup){
  int i=inf+1,j=sup,pivot=T[inf];
  while(i&lt;=j)
    if(T[i]&lt;=pivot)
      i++;
    else{
      permuter(i,j);
      j--;
    }
  permuter(inf,j);
  return j;
}</pre></td></tr></table></pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>emmesse</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/116855-emmesse/b10271/tri-segmentation/</guid>
		</item>
		<item>
			<title>erreur dans le purple dragonbook</title>
			<link>https://www.developpez.net/forums/blogs/116855-emmesse/b10263/erreur-purple-dragonbook/</link>
			<pubDate>Sun, 02 Jan 2022 00:10:13 GMT</pubDate>
			<description>Bonjour, 
 
je me suis aperçu...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Bonjour,<br />
<br />
je me suis aperçu qu'il y a une erreur dans la version française du dragonbook. En effet, à la page 295,on nous propose cette grammaire hors contexte:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0">T -&gt; B C
B -&gt; int
B -&gt; float
C -&gt; [ nbre ] C
C -&gt; epsilon</pre></td></tr></table></pre>
</div>cette grammaire est illustrée avec cet arbre à la page 294:<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=610071&amp;d=1639294480" border="0" alt="Nom : trouvé dans dragonbook.png
Affichages : 958
Taille : 1,0 Ko"  style="float: CONFIG" /><br />
<br />
il me semblerai qu'ils auraient mieux fait de présenter cet arbre abstrait pour le texte &quot;int[2][3]&quot;:<br />
<img src="https://www.developpez.net/forums/attachment.php?attachmentid=610074&amp;d=1639296823" border="0" alt="Nom : arbre dragonbook2.png
Affichages : 95
Taille : 1,5 Ko"  style="float: CONFIG" /></blockquote>

]]></content:encoded>
			<dc:creator>emmesse</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/116855-emmesse/b10263/erreur-purple-dragonbook/</guid>
		</item>
		<item>
			<title>grammaire hors contexte LL, exposant et opérations associatives à droite</title>
			<link>https://www.developpez.net/forums/blogs/116855-emmesse/b10256/grammaire-contexte-ll-exposant-operations-associatives/</link>
			<pubDate>Sun, 02 Jan 2022 00:09:39 GMT</pubDate>
			<description>La puissance est un opérateur...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">La puissance est un opérateur associatif à droite. Cela signifie que l'expression 2^2^3 est égal à 2^(2^3) et non pas à (2^2)^3<br />
À savoir pour lire ce billet :<br />
nb est un nombre<br />
id est un identificateur<br />
epsilon est la production vide<br />
<br />
<font size="3">La grammaire</font><br />
<br />
Soit F un facteur dans une expression:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0">F -&gt; nb
F -&gt; id
F -&gt; ( F )
F -&gt; - F (moins unaire)</pre></td></tr></table></pre>
</div>Comme l'exponentiation est prioritaire par rapport aux autres opérateurs, il doit se trouver dans F:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0">F -&gt; nb P
F -&gt; id P
F -&gt; ( F ) P
F -&gt; -F</pre></td></tr></table></pre>
</div>On n'ajoute pas P dans la production F -&gt; - F car P est déjà présent dans  (- F).<br />
Puis vient l'opérateur ^ d'exponentiation.<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">P -&gt; ^ F
P -&gt; epsilon</pre></td></tr></table></pre>
</div>La grammaire est donc:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0">F -&gt; nb P
  -&gt; id P
  -&gt; ( F ) P
  -&gt; - F
P -&gt; ^ F
  -&gt; epsilon</pre></td></tr></table></pre>
</div><font size="3">La traduction dirigée par la syntaxe</font><br />
<br />
Nous allons faire une traduction dirigée par la syntaxe qui ajoute des parenthèses autour du deuxième opérande.<br />
Par exemple, -u ^ -87 ^ 43 sera traduit par - ( u ^ ( - ( 87 ^ ( 43 )  )  )  )<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">-u ^ -87 ^ 43 = - ( u ^ ( - ( 87 ^ ( 43 )  )  )  )</pre>
</div>Dans la définition dirigée par la syntaxe (DDS) la règle sémantique du non-terminal P, dont le symbole || est la concaténation de chaines, est :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">P.s = P.h || &quot; ^ ( &quot; || F.val || &quot; )&quot;</pre>
</div>Voici la définition dirigée par la syntaxe :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:144px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0">F -&gt; nb P       |   P.h = nb.valex
                |   F.val = P.s
F -&gt; id P       |   P.h = id.unilex
                |   F.val = P.s
F -&gt; ( F1 ) P   |   P.h = &quot; ( &quot; || F1.val || &quot; ) &quot;
                |   F.val = P.s
F -&gt; - F1       |   F.val = &quot; - ( &quot; || F1.val || &quot; ) &quot;
P -&gt; ^ F        |   P.s = P.h || &quot; ^ ( &quot; || F.val || &quot; ) &quot;
P -&gt; epsilon    |   P.s = P.h</pre></td></tr></table></pre>
</div>voici le schéma de traduction dirigé par la syntaxe:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0">F -&gt; nb { P.h = nb.valex } P { F.val = P.s }
F -&gt; id { P.h = id.unilex } P { F.val = P.s }
F -&gt; ( F1 ) { P.h = &quot; ( &quot; || F1.val || &quot; ) &quot; } P { F.val = P.s }
F -&gt; - F1 { F.val = &quot; - ( &quot; || F1.val || &quot; ) &quot; }
P -&gt; ^ F { P.s = P.h || &quot; ^ ( &quot; || F.val || &quot; ) &quot; }
P -&gt; epsilon { P.s = P.h }</pre></td></tr></table></pre>
</div>voici l'implémentation de cette grammaire selon la méthode de la decente récursive prédictive:<br />
main.cpp<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code c++ :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;iostream&gt;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;vector&gt;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &quot;syntaxique.hpp&quot;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: black;">&#40;</span><span style="color: #0000ff;">int</span> argc,<span style="color: #0000ff;">char</span> *argv<span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  std::vector&lt;std::string&gt;args;
  <span style="color: #0000ff;">for</span><span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> i=<span style="color: #cc66cc;">0</span>;i&lt;<span style="color: #0000ff;">static_cast</span>&lt;<span style="color: #0000ff;">unsigned</span>&gt;<span style="color: black;">&#40;</span>argc<span style="color: black;">&#41;</span>;++i<span style="color: black;">&#41;</span>
    args.push_back<span style="color: black;">&#40;</span>argv<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>argc&gt;<span style="color: #cc66cc;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    syntaxique S<span style="color: black;">&#40;</span>args<span style="color: black;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>;
    std::cout&lt;&lt;S.facteur<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>&lt;&lt;std::endl;
  <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
    syntaxique S<span style="color: black;">&#40;</span><span style="color: #FF0000;">&quot;&quot;</span><span style="color: black;">&#41;</span>;
    std::cout&lt;&lt;S.facteur<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>&lt;&lt;std::endl;
  <span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span></pre></td></tr></table></pre>
</div>lexical.hpp<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code c++ :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #339933;">#ifndef LEXICAL_HPP</span>
<span style="color: #339933;">#define LEXICAL_HPP</span>
&nbsp;
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;string&gt;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;fstream&gt;</span>
&nbsp;
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &quot;terminal.hpp&quot;</span>
&nbsp;
<span style="color: #0000ff;">class</span> lexical<span style="color: black;">&#123;</span>
<span style="color: #0000ff;">public</span>:
  lexical<span style="color: black;">&#40;</span>std::string textedentree<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">void</span> analex<span style="color: black;">&#40;</span>terminal &amp;ulex,std::string &amp;lexeme,<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">long</span> <span style="color: #0000ff;">int</span> &amp;ligne<span style="color: black;">&#41;</span>;
<span style="color: #0000ff;">private</span>:
  std::string texte;
  std::ifstream entree;
  <span style="color: #0000ff;">size_t</span> enavant,debutlex;
  <span style="color: #0000ff;">int</span> taille;
  <span style="color: #0000ff;">bool</span> obtenirFDF<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">bool</span> obtenirseparateur<span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">long</span> <span style="color: #0000ff;">int</span> &amp;ligne<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">bool</span> obteniridentificateur<span style="color: black;">&#40;</span>terminal &amp;ulex,std::string &amp;lexeme<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">bool</span> obtenirnombre<span style="color: black;">&#40;</span>terminal &amp;ulex,std::string &amp;lexeme<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">bool</span> obtenirmoins<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">bool</span> obtenirchapeau<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">bool</span> obtenirpo<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span>;<span style="color: #808080;">//obtenir parenth&egrave;se ouvrante</span>
  <span style="color: #0000ff;">bool</span> obtenirpf<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span>;<span style="color: #808080;">//obtenir parenth&egrave;se fermante</span>
  std::string carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
<span style="color: black;">&#125;</span>;
<span style="color: #339933;">#endif</span></pre></td></tr></table></pre>
</div>lexical.cpp<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code c++ :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br />201<br />202<br />203<br />204<br />205<br />206<br />207<br />208<br />209<br />210<br />211<br />212<br />213<br />214<br />215<br />216<br />217<br />218<br />219<br />220<br />221<br />222<br />223<br />224<br />225<br />226<br />227<br />228<br />229<br />230<br />231<br />232<br />233<br />234<br />235<br />236<br />237<br />238<br />239<br />240<br />241<br />242<br />243<br />244<br />245<br />246<br />247<br />248<br />249<br />250<br />251<br />252<br />253<br />254<br />255<br />256<br />257<br />258<br />259<br />260<br />261<br />262<br />263<br />264<br />265<br />266<br />267<br />268<br />269<br />270<br />271<br />272<br />273<br />274<br />275<br />276<br />277<br />278<br />279<br />280<br />281<br />282<br />283<br />284<br />285<br />286<br />287<br />288<br />289<br />290<br />291<br />292<br />293<br />294<br />295<br />296<br />297<br />298<br />299<br />300<br />301<br />302<br />303<br />304<br />305<br />306<br />307<br />308<br />309<br />310<br />311<br />312<br />313<br />314<br />315<br />316<br />317<br />318<br />319<br />320<br />321<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;string&gt;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;iostream&gt;</span>
&nbsp;
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &quot;lexical.hpp&quot;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &quot;terminal.hpp&quot;</span>
&nbsp;
lexical::lexical<span style="color: black;">&#40;</span>std::string textedentree<span style="color: black;">&#41;</span>:enavant<span style="color: black;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  texte = textedentree;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> lexical::analex<span style="color: black;">&#40;</span>terminal &amp;ulex,std::string &amp;lexeme,<span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">long</span> <span style="color: #0000ff;">int</span> &amp;ligne<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>obtenirseparateur<span style="color: black;">&#40;</span>ligne<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    analex<span style="color: black;">&#40;</span>ulex,lexeme,ligne<span style="color: black;">&#41;</span>;<span style="color: #808080;">//ignorer le blanc. enavant pointe sur le premier caract&egrave;re du lexeme suivant</span>
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>obtenirFDF<span style="color: black;">&#40;</span>ulex<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">return</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>obteniridentificateur<span style="color: black;">&#40;</span>ulex,lexeme<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">return</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>obtenirnombre<span style="color: black;">&#40;</span>ulex,lexeme<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">return</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>obtenirchapeau<span style="color: black;">&#40;</span>ulex<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">return</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>obtenirpo<span style="color: black;">&#40;</span>ulex<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #808080;">//po=paenth&egrave;se ouvrante</span>
    <span style="color: #0000ff;">return</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>obtenirpf<span style="color: black;">&#40;</span>ulex<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #808080;">//pf=parenth&egrave;se fermante</span>
    <span style="color: #0000ff;">return</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>obtenirmoins<span style="color: black;">&#40;</span>ulex<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">return</span>;
  <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
    std::cerr&lt;&lt;<span style="color: #FF0000;">&quot;carat&egrave;re hors langage&quot;</span>&lt;&lt;std::endl;
    enavant+=taille;<span style="color: #808080;">//ignorer le caract&egrave;re hors  langage</span>
    analex<span style="color: black;">&#40;</span>ulex,lexeme,ligne<span style="color: black;">&#41;</span>;
  <span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> lexical::obtenirseparateur<span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">long</span> <span style="color: #0000ff;">int</span> &amp;ligne<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">int</span> etat=<span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">bool</span> continuer=<span style="color: #0080ff;">true</span>;
  <span style="color: #0000ff;">bool</span> reussi;
  debutlex=enavant;
  std::string caracterelu;
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>continuer<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>etat<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">0</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;<span style="color: #800000;">\n</span>&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	ligne++;
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot; &quot;</span>||caracterelu==<span style="color: #FF0000;">&quot;<span style="color: #800000;">\t</span>&quot;</span>||caracterelu==<span style="color: #FF0000;">&quot;<span style="color: #800000;">\r</span>&quot;</span><span style="color: black;">&#41;</span>
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	continuer=<span style="color: #0080ff;">false</span>;
	reussi=<span style="color: #0080ff;">false</span>;
	enavant=debutlex;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">1</span>:
      continuer=<span style="color: #0080ff;">false</span>;
      reussi=<span style="color: #0080ff;">true</span>;
    <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">return</span> reussi;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> lexical::obtenirFDF<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">int</span> etat=<span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">bool</span> continuer=<span style="color: #0080ff;">true</span>;
  <span style="color: #0000ff;">bool</span> reussi;
  debutlex=enavant;
  std::string caracterelu;
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>continuer<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>etat<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">0</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu<span style="color: black;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: black;">&#93;</span>==<span style="color: #FF0000;">'</span><span style="color: #800000;">\0</span><span style="color: #FF0000;">'</span><span style="color: black;">&#41;</span>
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	continuer=<span style="color: #0080ff;">false</span>;
	reussi=<span style="color: #0080ff;">false</span>;
	enavant=debutlex;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">1</span>:
      continuer=<span style="color: #0080ff;">false</span>;
      reussi=<span style="color: #0080ff;">true</span>;
      ulex=FDF;
      <span style="color: #0000ff;">break</span>;
    <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">return</span> reussi;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> lexical::obteniridentificateur<span style="color: black;">&#40;</span>terminal &amp;ulex,std::string &amp;lexeme<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">int</span> etat=<span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">bool</span> continuer=<span style="color: #0080ff;">true</span>;
  <span style="color: #0000ff;">bool</span> reussi;
  lexeme=<span style="color: #FF0000;">&quot;&quot;</span>;
  debutlex=enavant;
  std::string caracterelu;
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>continuer<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>etat<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">0</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;_&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">0</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu &gt;=<span style="color: #FF0000;">&quot;A&quot;</span> &amp;&amp; caracterelu&lt;=<span style="color: #FF0000;">&quot;Z&quot;</span> || caracterelu &gt;= <span style="color: #FF0000;">&quot;a&quot;</span> &amp;&amp; caracterelu &lt;= <span style="color: #FF0000;">&quot;z&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span><span style="color: #808080;">//echec</span>
	enavant=debutlex;
	continuer=<span style="color: #0080ff;">false</span>;
	reussi=<span style="color: #0080ff;">false</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">1</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu &gt;=<span style="color: #FF0000;">&quot;A&quot;</span> &amp;&amp; caracterelu&lt;=<span style="color: #FF0000;">&quot;Z&quot;</span> || caracterelu &gt;= <span style="color: #FF0000;">&quot;a&quot;</span> &amp;&amp; caracterelu &lt;= <span style="color: #FF0000;">&quot;z&quot;</span> || caracterelu &gt;=<span style="color: #FF0000;">&quot;0&quot;</span> &amp;&amp; caracterelu &lt;= <span style="color: #FF0000;">&quot;9&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span> <span style="color: #808080;">//autre caract&egrave;re</span>
	etat=<span style="color: #cc66cc;">2</span>;
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">2</span>:
      continuer=<span style="color: #0080ff;">false</span>;
      reussi=<span style="color: #0080ff;">true</span>;
      enavant-=taille;<span style="color: #808080;">//reculer pour le d&eacute;passement de caract&egrave;re (autre caract&egrave;re)</span>
      ulex=identificateur;
    <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">return</span> reussi;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> lexical::obtenirnombre<span style="color: black;">&#40;</span>terminal &amp;ulex,std::string &amp;lexeme<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">int</span> etat=<span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">bool</span> continuer=<span style="color: #0080ff;">true</span>;
  <span style="color: #0000ff;">bool</span> reussi;
  lexeme=<span style="color: #FF0000;">&quot;&quot;</span>;
  debutlex=enavant;
  std::string caracterelu;
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>continuer<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>etat<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">0</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;,&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">2</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu&gt;=<span style="color: #FF0000;">&quot;0&quot;</span> &amp;&amp; caracterelu&lt;=<span style="color: #FF0000;">&quot;9&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	continuer=<span style="color: #0080ff;">false</span>;
	reussi=<span style="color: #0080ff;">false</span>;
	enavant=debutlex;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">1</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;,&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">2</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu&gt;=<span style="color: #FF0000;">&quot;0&quot;</span> &amp;&amp; caracterelu&lt;=<span style="color: #FF0000;">&quot;9&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span>
	etat=<span style="color: #cc66cc;">4</span>;<span style="color: #808080;">//autre</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">2</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu&gt;=<span style="color: #FF0000;">&quot;0&quot;</span> &amp;&amp; caracterelu&lt;=<span style="color: #FF0000;">&quot;9&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">3</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	enavant=debutlex;
	continuer=<span style="color: #0080ff;">false</span>;
	reussi=<span style="color: #0080ff;">false</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">3</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu&gt;=<span style="color: #FF0000;">&quot;0&quot;</span> &amp;&amp; caracterelu&lt;=<span style="color: #FF0000;">&quot;9&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
	lexeme+=caracterelu;
	etat=<span style="color: #cc66cc;">3</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	etat=<span style="color: #cc66cc;">4</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">4</span>:
      continuer=<span style="color: #0080ff;">false</span>;
      reussi=<span style="color: #0080ff;">true</span>;
      ulex=nombre;
      enavant-=taille;<span style="color: #808080;">//reculer pour le d&eacute;passement de caract&egrave;re (autre caract&egrave;re)</span>
    <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">return</span> reussi;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> lexical::obtenirmoins<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
<span style="color: #0000ff;">int</span> etat=<span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">bool</span> continuer=<span style="color: #0080ff;">true</span>;
  <span style="color: #0000ff;">bool</span> reussi;
  debutlex=enavant;
  std::string caracterelu;
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>continuer<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>etat<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">0</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;-&quot;</span><span style="color: black;">&#41;</span>
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	enavant=debutlex;
	reussi=continuer=<span style="color: #0080ff;">false</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">1</span>:
      continuer=<span style="color: #0080ff;">false</span>;
      reussi=<span style="color: #0080ff;">true</span>;
      ulex=moins;
    <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">return</span> reussi;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> lexical::obtenirchapeau<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">int</span> etat=<span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">bool</span> continuer=<span style="color: #0080ff;">true</span>;
  <span style="color: #0000ff;">bool</span> reussi;
  debutlex=enavant;
  std::string caracterelu;
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>continuer<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>etat<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">0</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;^&quot;</span><span style="color: black;">&#41;</span>
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	enavant=debutlex;
	reussi=continuer=<span style="color: #0080ff;">false</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">1</span>:
      continuer=<span style="color: #0080ff;">false</span>;
      reussi=<span style="color: #0080ff;">true</span>;
      ulex=chapeau;
    <span style="color: black;">&#125;</span>
    <span style="color: #0000ff;">return</span> reussi;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> lexical::obtenirpo<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span><span style="color: #808080;">//obtenir une parenth&egrave;se ouvrante</span>
<span style="color: #0000ff;">int</span> etat=<span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">bool</span> continuer=<span style="color: #0080ff;">true</span>;
  <span style="color: #0000ff;">bool</span> reussi;
  debutlex=enavant;
  std::string caracterelu;
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>continuer<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>etat<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">0</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;(&quot;</span><span style="color: black;">&#41;</span>
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	enavant=debutlex;
	reussi=continuer=<span style="color: #0080ff;">false</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">1</span>:
      continuer=<span style="color: #0080ff;">false</span>;
      reussi=<span style="color: #0080ff;">true</span>;
      ulex=po;<span style="color: #808080;">//parnth&egrave;se ouvrante</span>
    <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">return</span> reussi;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">bool</span> lexical::obtenirpf<span style="color: black;">&#40;</span>terminal &amp;ulex<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span><span style="color: #808080;">//obtenir une parenth&egrave;se fermante</span>
<span style="color: #0000ff;">int</span> etat=<span style="color: #cc66cc;">0</span>;
  <span style="color: #0000ff;">bool</span> continuer=<span style="color: #0080ff;">true</span>;
  <span style="color: #0000ff;">bool</span> reussi;
  debutlex=enavant;
  std::string caracterelu;
  <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>continuer<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">switch</span><span style="color: black;">&#40;</span>etat<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">0</span>:
      caracterelu=carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
      <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>caracterelu==<span style="color: #FF0000;">&quot;)&quot;</span><span style="color: black;">&#41;</span>
	etat=<span style="color: #cc66cc;">1</span>;
      <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
	enavant=debutlex;
	reussi=continuer=<span style="color: #0080ff;">false</span>;
      <span style="color: black;">&#125;</span>
      <span style="color: #0000ff;">break</span>;
    <span style="color: #0000ff;">case</span> <span style="color: #cc66cc;">1</span>:
      continuer=<span style="color: #0080ff;">false</span>;
      reussi=<span style="color: #0080ff;">true</span>;
      ulex=pf;<span style="color: #808080;">//parenth&egrave;se fermante</span>
    <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">return</span> reussi;
<span style="color: black;">&#125;</span>
&nbsp;
std::string lexical::carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span>texte<span style="color: black;">&#91;</span>enavant<span style="color: black;">&#93;</span> &gt;= <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span><span style="color: #cc66cc;">0</span> &amp;&amp; texte<span style="color: black;">&#91;</span>enavant<span style="color: black;">&#93;</span> &lt;= <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span><span style="color: #cc66cc;">127</span><span style="color: black;">&#41;</span>
    taille=<span style="color: #cc66cc;">1</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span>texte<span style="color: black;">&#91;</span>enavant<span style="color: black;">&#93;</span> &gt;= <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span><span style="color: #cc66cc;">0xC2</span> &amp;&amp; <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span>texte<span style="color: black;">&#91;</span>enavant<span style="color: black;">&#93;</span> &lt;= <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span><span style="color: #cc66cc;">0xdf</span><span style="color: black;">&#41;</span>
    taille=<span style="color: #cc66cc;">2</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span>texte<span style="color: black;">&#91;</span>enavant<span style="color: black;">&#93;</span> &gt;= <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span><span style="color: #cc66cc;">0xe0</span> &amp;&amp; <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span>texte<span style="color: black;">&#91;</span>enavant<span style="color: black;">&#93;</span> &lt;= <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span><span style="color: #cc66cc;">0xef</span><span style="color: black;">&#41;</span>
    taille=<span style="color: #cc66cc;">3</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span>texte<span style="color: black;">&#91;</span>enavant<span style="color: black;">&#93;</span> &gt;= <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span><span style="color: #cc66cc;">0xf0</span> &amp;&amp; <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span>texte<span style="color: black;">&#91;</span>enavant<span style="color: black;">&#93;</span> &lt;= <span style="color: black;">&#40;</span><span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">char</span><span style="color: black;">&#41;</span><span style="color: #cc66cc;">0xff</span><span style="color: black;">&#41;</span>
    taille=<span style="color: #cc66cc;">4</span>;
  <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
    std::cerr&lt;&lt;<span style="color: #FF0000;">&quot;caract&egrave;re non UTF-8&quot;</span>&lt;&lt;std::endl;
    enavant++;
    <span style="color: #0000ff;">return</span> carsuiv<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
  <span style="color: black;">&#125;</span>
  std::string c=texte.substr<span style="color: black;">&#40;</span>enavant,taille<span style="color: black;">&#41;</span>;
  enavant+=taille;
  <span style="color: #0000ff;">return</span> c;
<span style="color: black;">&#125;</span></pre></td></tr></table></pre>
</div>terminal.hpp<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code c++ :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">#ifndef TERMINAL_HPP</span>
<span style="color: #339933;">#define TERMINAL_HPP</span>
&nbsp;
<span style="color: #0000ff;">enum</span> terminal <span style="color: black;">&#123;</span>identificateur,nombre,moins,chapeau,po,pf,FDF<span style="color: black;">&#125;</span>;
&nbsp;
<span style="color: #339933;">#endif</span></pre></td></tr></table></pre>
</div>syntaxique.hpp<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code c++ :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">#ifndef SYNTAXIQUE_HPP</span>
<span style="color: #339933;">#define SYNTAXIQUE_HPP</span>
&nbsp;
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;string&gt;</span>
&nbsp;
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &quot;lexical.hpp&quot;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &quot;terminal.hpp&quot;</span>
&nbsp;
&nbsp;
<span style="color: #0000ff;">class</span> syntaxique<span style="color: black;">&#123;</span>
<span style="color: #0000ff;">public</span>:
  syntaxique<span style="color: black;">&#40;</span>std::string <span style="color: #0000ff;">const</span> &amp;textedentree<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">void</span> consommer<span style="color: black;">&#40;</span>terminal s<span style="color: black;">&#41;</span>;
  std::string facteur<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
  std::string puissance<span style="color: black;">&#40;</span>std::string <span style="color: #0000ff;">const</span> &amp;puissance_h<span style="color: black;">&#41;</span>;
<span style="color: #0000ff;">private</span>:
  lexical L;
  terminal ulex;
  std::string lexeme;
  <span style="color: #0000ff;">unsigned</span> <span style="color: #0000ff;">long</span> <span style="color: #0000ff;">int</span> ligne;
<span style="color: black;">&#125;</span>;
&nbsp;
<span style="color: #339933;">#endif</span></pre></td></tr></table></pre>
</div>syntaxique.cpp<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code c++ :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;iostream&gt;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;string&gt;</span>
&nbsp;
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &quot;terminal.hpp&quot;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &quot;syntaxique.hpp&quot;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &quot;lexical.hpp&quot;</span>
&nbsp;
syntaxique::syntaxique<span style="color: black;">&#40;</span>std::string <span style="color: #0000ff;">const</span> &amp;textedentree<span style="color: black;">&#41;</span>:L<span style="color: black;">&#40;</span>textedentree<span style="color: black;">&#41;</span>,
							ligne<span style="color: black;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  L.analex<span style="color: black;">&#40;</span>ulex,lexeme,ligne<span style="color: black;">&#41;</span>;
<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> syntaxique::consommer<span style="color: black;">&#40;</span>terminal s<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>s==FDF&amp;&amp;ulex==s<span style="color: black;">&#41;</span>
    <span style="color: #0000ff;">return</span>;
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>s==ulex<span style="color: black;">&#41;</span>
    L.analex<span style="color: black;">&#40;</span>ulex,lexeme,ligne<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">else</span>
    std::cerr&lt;&lt;<span style="color: #FF0000;">&quot;syntaxe incorrecte&quot;</span>&lt;&lt;std::endl;
<span style="color: black;">&#125;</span>
&nbsp;
std::string syntaxique::facteur<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  std::string retour;
  <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span> ulex == nombre <span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    std::string nb_vallex = lexeme;
    consommer<span style="color: black;">&#40;</span> nombre <span style="color: black;">&#41;</span>;
    std::string  puissance_h = nb_vallex;
    std::string puissance_s = puissance<span style="color: black;">&#40;</span> puissance_h <span style="color: black;">&#41;</span>;
    std::string facteur_val = puissance_s;
    retour= facteur_val;
  <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span> ulex == identificateur<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    std::string id_unilex = lexeme;
    consommer<span style="color: black;">&#40;</span> identificateur <span style="color: black;">&#41;</span>;
    std::string puissance_h = id_unilex;
    std::string puissance_s = puissance<span style="color: black;">&#40;</span> puissance_h <span style="color: black;">&#41;</span>;
    std::string facteur_val = puissance_s;
    retour = facteur_val;
  <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span> ulex == po <span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>  <span style="color: #808080;">// po = parenth&egrave;se ouvrante</span>
    consommer<span style="color: black;">&#40;</span>po<span style="color: black;">&#41;</span>;
    std::string facteur1_val = facteur<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
    consommer<span style="color: black;">&#40;</span>pf<span style="color: black;">&#41;</span>;  <span style="color: #808080;">//pf = parenth&egrave;se fermante</span>
    std::string puissance_h = <span style="color: #FF0000;">&quot; ( &quot;</span> + facteur1_val + <span style="color: #FF0000;">&quot; ) &quot;</span>;
    std::string puissance_s = puissance<span style="color: black;">&#40;</span> puissance_h <span style="color: black;">&#41;</span>;
    std::string facteur_val = puissance_s;
    retour = facteur_val;
  <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span> ulex == moins <span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    consommer<span style="color: black;">&#40;</span>moins<span style="color: black;">&#41;</span>;
    std::string facteur1_val = facteur<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
    std::string facteur_val = <span style="color: #FF0000;">&quot;- ( &quot;</span> + facteur1_val + <span style="color: #FF0000;">&quot; ) &quot;</span>;
    retour=facteur_val;
  <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>ulex==chapeau<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    <span style="color: #0000ff;">while</span><span style="color: black;">&#40;</span>ulex!=pf &amp;&amp; ulex!=FDF<span style="color: black;">&#41;</span>
      L.analex<span style="color: black;">&#40;</span>ulex,lexeme,ligne<span style="color: black;">&#41;</span>;
    std::cerr&lt;&lt;<span style="color: #FF0000;">&quot;chapeau inattendu&quot;</span>&lt;&lt;std::endl;
    retour = <span style="color: #FF0000;">&quot;&quot;</span>;
  <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>ulex==pf<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    std::cerr&lt;&lt;<span style="color: #FF0000;">&quot;utilisation erron&eacute;e des parenth&egrave;ses&quot;</span>&lt;&lt;std::endl;
    retour=<span style="color: #FF0000;">&quot;&quot;</span>;
  <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span> <span style="color: #808080;">//ulex=FDF</span>
    std::cerr&lt;&lt;<span style="color: #FF0000;">&quot;fin d'expression pr&eacute;matur&eacute;e&quot;</span>&lt;&lt;std::endl;
    retour=<span style="color: #FF0000;">&quot;&quot;</span>;
  <span style="color: black;">&#125;</span>
  consommer<span style="color: black;">&#40;</span>FDF<span style="color: black;">&#41;</span>;
  <span style="color: #0000ff;">return</span> retour;
<span style="color: black;">&#125;</span>
&nbsp;
std::string syntaxique::puissance<span style="color: black;">&#40;</span>std::string <span style="color: #0000ff;">const</span> &amp;puissance_h<span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
  std::string puissance_s;
  <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span> ulex == chapeau <span style="color: black;">&#41;</span><span style="color: black;">&#123;</span>
    consommer<span style="color: black;">&#40;</span>chapeau<span style="color: black;">&#41;</span>;
    std::string facteur_val=facteur<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
    puissance_s = puissance_h +<span style="color: #FF0000;">&quot; ^ ( &quot;</span> + facteur_val + <span style="color: #FF0000;">&quot; ) &quot;</span>;
  <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span><span style="color: black;">&#40;</span>ulex == FDF || ulex==pf <span style="color: black;">&#41;</span><span style="color: #808080;">//pf=parenth&egrave;se fermante</span>
    puissance_s = puissance_h;
  <span style="color: #0000ff;">else</span><span style="color: black;">&#123;</span>
    L.analex<span style="color: black;">&#40;</span>ulex,lexeme,ligne<span style="color: black;">&#41;</span>;
    std::cerr&lt;&lt;<span style="color: #FF0000;">&quot;op&eacute;ration non permise&quot;</span>&lt;&lt;std::endl;
    puissance_s = <span style="color: #FF0000;">&quot;&quot;</span>;
  <span style="color: black;">&#125;</span>
  <span style="color: #0000ff;">return</span> puissance_s;
<span style="color: black;">&#125;</span></pre></td></tr></table></pre>
</div><div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">g++ -o puissances *cpp
$ ./puissances a^b
a ^ ( b )</pre></td></tr></table></pre>
</div>si vous utilisez des espaces, il faudra mettre l'expression entre guillemets<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">$ ./puissances -u ^ -87 ^ 43
- ( u )</pre></td></tr></table></pre>
</div><div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">$ ./puissances &quot;-u ^ -87 ^ 43&quot;
- ( u ^ ( - ( 87 ^ ( 43 )  )  )  )</pre></td></tr></table></pre>
</div>de même avec les parenthèses<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0">$ ./puissances 48^(3^p)
bash: erreur de syntaxe près du symbole inattendu « ( »
$ ./puissances &quot;48^(3^p)&quot;
48 ^ (  ( 3 ^ ( p )  )  )</pre></td></tr></table></pre>
</div>ou bien en utilisant le backslash avant les parenthèses:<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:60px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br /></div></td><td valign="top"><pre style="margin: 0">./puissance 4^\(r^-5\)
4 ^ (  ( r ^ ( - ( 5 )  )  )  )</pre></td></tr></table></pre>
</div>et les cas d'erreur:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br /></div></td><td valign="top"><pre style="margin: 0">$ ./puissance &quot;3 o&quot;
opération non permise

$ ./puissance ^^x
chapeau inattendu

$ ./puissance x^^6
chapeau inattendu
x ^ (  ) 
$ ./puissance r-4
opération non permise
syntaxe incorrecte


$ ./puissance &quot;(5)(r)&quot;
syntaxe incorrecte
opération non permise
syntaxe incorrecte

$ ./puissance +
caratère hors langage
fin d'expression prématurée

$ ./puissance a+b
caratère hors langage
opération non permise

$ ./puissance &quot;a)&quot;
syntaxe incorrecte
a
$ ./puissance g^
fin d'expression prématurée
g ^ (  ) 
$ ./puissance 4^-
fin d'expression prématurée
4 ^ ( - (  )  ) 
$ ./puissance &quot;4^)&quot;
utilisation erronée des parenthèses
syntaxe incorrecte
syntaxe incorrecte
4 ^ (  ) 
$ ./puissance &quot;()&quot;
utilisation erronée des parenthèses
syntaxe incorrecte
 (  ) 
$ ./puissance &quot;)&quot;
utilisation erronée des parenthèses
syntaxe incorrecte

$ ./puissance &quot;)i^6&quot;
utilisation erronée des parenthèses
syntaxe incorrecte

$ ./puissance &quot;&quot;
fin d'expression prématurée

$ ./puissance
fin d'expression prématurée

$ ./puissance ^x
chapeau inattendu</pre></td></tr></table></pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>emmesse</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/116855-emmesse/b10256/grammaire-contexte-ll-exposant-operations-associatives/</guid>
		</item>
		<item>
			<title>fusion de liste grammaire hors contexte LL</title>
			<link>https://www.developpez.net/forums/blogs/116855-emmesse/b10255/fusion-liste-grammaire-contexte-ll/</link>
			<pubDate>Sun, 05 Dec 2021 00:38:46 GMT</pubDate>
			<description>Je vais vous parler ici de la...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Je vais vous parler ici de la fusion de deux listes en une seule dans une grammaire LL.<br />
<br />
Voici une grammaire LL pour une liste de 'd' séparés d'un 'sep', sachant que epsilon est la production vide<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">C -&gt; d Cprim
Cprim -&gt; sep d Cprim
      -&gt; epsilon</pre></td></tr></table></pre>
</div>Idem pour une liste S de 'i' séparés par le même séparateur 'sep'<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:72px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">S  -&gt; i Sprim
Sprim -&gt; sep i Sprim
      -&gt; epsilon</pre></td></tr></table></pre>
</div>Si on veut une liste éventuelle de 'd' puis une liste de 'i', on serait tenté d'ajouter le non-terminal L suivant, qui prend une liste C et une liste S, et les sépare par le séparateur sep:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:120px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0">L -&gt; C sep S | C | S
C -&gt; d Cprim
Cprim -&gt; sep d Cprim
      -&gt; epsilon
S -&gt; i Sprim
Sprim -&gt; sep i Sprim
      -&gt; epsilon</pre></td></tr></table></pre>
</div>Et bien non:<br />
D'une part 'sep' est dans premiers(Cprim) par la production Cprim -&gt; sep d Cprim<br />
et est d'autre part dans suivants(Cprim) car on a par dérivation gauche:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;"> L =&gt; C sep S =&gt; d Cprim sep S</pre>
</div>Ceci fait que la table d'analyse LL contient, à la ligne Cprim et à la colonne 'sep', les productions [Cprim -&gt; sep d Cprim] et [Cprim -&gt; epsilon ]<br />
La table contient donc deux productions dans une même case, et ceci fait que cette grammaire est ambiguë<br />
<br />
Voici la fusion d'une liste de d suivit par une liste de i, séparés d'un sep:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:144px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0">C0 -&gt; C
   -&gt; epsilon
C -&gt; d  Cprim
  -&gt; S
Cprim -&gt; sep C
      -&gt; epsilon
S -&gt; i Sprim
Sprim -&gt; sep i Sprim
      -&gt; epsilon</pre></td></tr></table></pre>
</div>On obtient soit une liste de d suivi de la liste S, soit une liste de d, soit la liste S, ou soit la liste vide.<br />
voici le schéma de traduction dirigé par la syntaxe (le symbole || est la concaténation d'attributs):<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:144px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0">C0 -&gt; { C.h = C0.h } C { C0.s = C.s }
   -&gt; epsilon { C0.s = C0.h }
C -&gt; d { Cprim.h = C.h || d.s } Cprim { C.s = Cprim.s }
  -&gt; { S.h = C.h } S { C.s = S.s }
Cprim -&gt; sep { C.h = Cprim.h } C { Cprim.s = C.s }
      -&gt; epsilon { Cprim.s = Cprim.h }
S -&gt; i { Sprim.h = S.h || i.s } Sprim { S.s = Sprim.s }
Sprim -&gt; sep i { Sprim1.h= Sprim.h || i.s } Sprim1 { Sprim.s = Sprim1.s }
      -&gt; epsilon { Sprim.s = Sprim.h }</pre></td></tr></table></pre>
</div>Ceci peut servir pour les corps d'instruction constitués de déclarations et d'une séquence d'instructions (ici le point-virgule n'indique pas la fin d'une instruction mais la séquentialité entre déclarations et instructions, entre déclarations, ou entre instructions):<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:144px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0">corpsopt -&gt; corps
         -&gt; epsilon
corps -&gt; déclaration corpsprim
      -&gt; séquence
corpsprim -&gt; point-virgule corps
          -&gt; epsilon
séquence -&gt; instruction sequenceprim 
sequenceprim -&gt; point-virgule instruction sequenceprim
             -&gt; epsilon</pre></td></tr></table></pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>emmesse</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/116855-emmesse/b10255/fusion-liste-grammaire-contexte-ll/</guid>
		</item>
		<item>
			<title>shared_ptr et polymorphisme</title>
			<link>https://www.developpez.net/forums/blogs/116855-emmesse/b10076/shared_ptr-polymorphisme/</link>
			<pubDate>Mon, 15 Mar 2021 13:43:30 GMT</pubDate>
			<description><![CDATA[Bonjour, 
 
j'ai voulu savoir...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Bonjour,<br />
<br />
j'ai voulu savoir comment on fait une méthode polymorphe avec shared_ptr, mais je n'ai pas trouvé mon bonheur. J'ai donc dû expérimenter diverse technique, infructueuses. Alors voici mes conclusions:<br />
Voici deux classe B et C qui héritent d'une classe A, avec, dans celle-ci, une méthode virtuelle pure (évidement, on est pas obligé de rendre la classe A abstraite) :<br />
classes.hpp<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br /></div></td><td valign="top"><pre style="margin: 0">
class A{
public:
  virtual void quelObjet()=0;
};

class B:public A{
public:
  void quelObjet()override;
};

class C:public A{
public:
  void quelObjet()override;
};</pre></td></tr></table></pre>
</div>classes.cpp<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:156px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td valign="top"><pre style="margin: 0">#include &lt;iostream&gt;
#include &quot;classes.hpp&quot;

void B::quelObjet(){
  std::cout&lt;&lt;&quot;objet B&quot;&lt;&lt;std::endl;
}

void C::quelObjet(){
  std::cout&lt;&lt;&quot;objet C&quot;&lt;&lt;std::endl;
}</pre></td></tr></table></pre>
</div>et main.cpp<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br /></div></td><td valign="top"><pre style="margin: 0">#include &lt;memory&gt;
#include &lt;vector&gt;
#include &quot;classes.hpp&quot;

int main(){
  std::vector&lt;std::shared_ptr&lt;A&gt;&gt;V;
  auto b=std::shared_ptr&lt;A&gt;(new B);
  auto c=std::shared_ptr&lt;A&gt;(new C);
  b-&gt;quelObjet();
  c-&gt;quelObjet();
  V.push_back(b);
  V.push_back(c);
  V[0]-&gt;quelObjet();
  V[1]-&gt;quelObjet();
}</pre></td></tr></table></pre>
</div>lorsque l'on exécute tout ça, on obtient bien:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0">objet B
objet C
objet B
objet C</pre></td></tr></table></pre>
</div>les appels &quot;b-&gt;quelObjet()&quot; et &quot;V[0]-&gt;quelObjet()&quot; sont bien les appels de &quot;quelObjet()&quot; de la classe B et les appels &quot;c-&gt;quelObjet()&quot; et &quot;V[1]-&gt;quelObjet&quot; les appels de &quot;quelObjet()&quot; de la classe C</blockquote>

]]></content:encoded>
			<dc:creator>emmesse</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/116855-emmesse/b10076/shared_ptr-polymorphisme/</guid>
		</item>
		<item>
			<title><![CDATA[un C unique, ou absent, dans une liste B d'une grammaire hors contexte LL]]></title>
			<link>https://www.developpez.net/forums/blogs/116855-emmesse/b8574/c-unique-absent-liste-b-d-grammaire-contexte-ll/</link>
			<pubDate>Sun, 08 Dec 2019 17:14:25 GMT</pubDate>
			<description>bonjour, 
 
Nous allons voir...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">bonjour,<br />
<br />
Nous allons voir ici une grammaire hors-contexte LL d'une liste où C apparraît au plus une fois.<br />
On a le non-terminal A qui est une liste B avec un C qui apparaît zéro ou une fois. Ici, le point virgule n'est pas la fin de ligne de code mais la séquentialité entre deux lignes<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:96px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br /></div></td><td valign="top"><pre style="margin: 0">A -&gt; B
A -&gt; B ; C
A -&gt; C ; B
A -&gt; B ; C ; B
A -&gt; C</pre></td></tr></table></pre>
</div>en factorisant à gauche (EPSILON est la production vide):<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:120px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td valign="top"><pre style="margin: 0">A -&gt; B X
A -&gt; C Y
X -&gt; ; C
X -&gt; ; C ; B
X -&gt; EPSILON
Y -&gt; ; B
Y -&gt; EPSILON</pre></td></tr></table></pre>
</div>X se factorise à gauche comme ceci:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:84px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0">X -&gt; ; C Z
X -&gt; EPSILON
Z -&gt; ; B
Z -&gt; EPSILON</pre></td></tr></table></pre>
</div>ce qui donne:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:132px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br /></div></td><td valign="top"><pre style="margin: 0">A -&gt; B X
A -&gt; C Y
X -&gt; ; C Z
X -&gt; EPSILON
Z -&gt; ; B
Z -&gt; EPSILON
Y -&gt; ; B
Y -&gt; EPSILON</pre></td></tr></table></pre>
</div>comme Z et Y sont pareils, on peut simplifier ainsi:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0">A -&gt; B X
A -&gt; C Y
X -&gt; ; C Y
X -&gt; EPSILON
Y -&gt; ; B
Y -&gt; EPSILON</pre></td></tr></table></pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>emmesse</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/116855-emmesse/b8574/c-unique-absent-liste-b-d-grammaire-contexte-ll/</guid>
		</item>
		<item>
			<title>suppression des epsilon-production dans une grammaire hors contexte</title>
			<link>https://www.developpez.net/forums/blogs/116855-emmesse/b7925/suppression-epsilon-production-grammaire-contexte/</link>
			<pubDate>Thu, 22 Aug 2019 04:40:38 GMT</pubDate>
			<description>nous allons voir ici la...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">nous allons voir ici la suppression des epsilon-productions<br />
<br />
Soit le non-terminal N pouvant prendre la forme d'une production vide:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">N -&gt; c1 | c2 | c3 ... | ck | epsilon</pre>
</div>on dit que N est annulable.<br />
<br />
lorsque N est présent dans une production, on a les trois cas suivants:<br />
<br />
premier cas<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">A -&gt; a N b</pre>
</div>dans ce cas, on supprime les epsilon-production en réécrivant A ainsi;<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:108px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td valign="top"><pre style="margin: 0">A-&gt;a c1 b
 -&gt;a c2 b
 -&gt;a c3 b
...
 -&gt; a ck b
 -&gt; a b</pre></td></tr></table></pre>
</div>deuxième cas:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">A -&gt; a N</pre>
</div>on supprime epsilon comme ceci<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">A -&gt; a c1 | a c2 | a c3 ... | a ck | a</pre>
</div>troisième cas:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">A -&gt; N b</pre>
</div>A se réécrit de la sorte:<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">A -&gt; c1 b | c2 b | c3 b ... | ck b | b</pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>emmesse</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/116855-emmesse/b7925/suppression-epsilon-production-grammaire-contexte/</guid>
		</item>
	</channel>
</rss>
