[{"data":1,"prerenderedAt":3134},["ShallowReactive",2],{"blog-creer-mini-compilateur-ply":3},{"id":4,"title":5,"body":6,"coverImage":3119,"description":3120,"extension":3121,"meta":3122,"navigation":425,"path":3123,"published":425,"publishedAt":3124,"readTime":563,"seo":3125,"stem":3126,"tags":3127,"__hash__":3133},"blog\u002Fblog\u002Fcreer-mini-compilateur-ply.md","Créer un mini compilateur avec PLY en Python",{"type":7,"value":8,"toc":3074},"minimark",[9,13,18,22,30,49,52,72,76,79,102,106,109,112,123,130,134,137,164,167,171,174,179,189,193,196,219,222,233,236,254,258,275,279,282,285,323,327,333,336,340,346,349,355,358,390,394,397,928,932,965,969,972,975,995,999,1002,1626,1630,1636,1642,1647,1650,1655,1658,1663,1666,1671,1674,1678,1683,2812,2816,2819,2824,2827,2833,2837,2843,2846,2852,2856,2859,2861,2867,2874,2881,2885,2888,2892,2898,2902,2909,2912,2918,2921,2927,2930,2934,2937,2962,2966,2969,2994,2998,3002,3005,3009,3012,3016,3022,3026,3029,3033,3037,3044,3048,3054,3058,3063,3067,3070],[10,11,5],"h1",{"id":12},"créer-un-mini-compilateur-avec-ply-en-python",[14,15,17],"h2",{"id":16},"introduction","Introduction",[19,20,21],"p",{},"Créer un compilateur peut sembler réservé aux langages de bas niveau ou aux personnes très avancées. En réalité, on peut déjà comprendre les bases d'un compilateur en construisant un mini projet simple avec Python et PLY.",[19,23,24,25,29],{},"PLY signifie ",[26,27,28],"strong",{},"Python Lex-Yacc",". C'est une bibliothèque qui permet de faire deux choses essentielles :",[31,32,33,42],"ul",{},[34,35,36,37,41],"li",{},"découper une chaîne de caractères en tokens avec ",[38,39,40],"code",{},"lex"," ;",[34,43,44,45,48],{},"analyser la structure grammaticale avec ",[38,46,47],{},"yacc",".",[19,50,51],{},"L'idée de ce tutoriel est de construire un petit compilateur pour un langage très simple, capable de comprendre :",[31,53,54,57,60,63,66],{},[34,55,56],{},"des nombres ;",[34,58,59],{},"des opérations arithmétiques ;",[34,61,62],{},"des variables ;",[34,64,65],{},"des affectations ;",[34,67,68,69,48],{},"des affichages avec ",[38,70,71],{},"print",[14,73,75],{"id":74},"ce-que-vous-allez-apprendre","Ce que vous allez apprendre",[19,77,78],{},"À la fin de ce tutoriel, vous saurez :",[31,80,81,84,87,90,93,96,99],{},[34,82,83],{},"comprendre le rôle d'un compilateur ;",[34,85,86],{},"distinguer l'analyse lexicale et l'analyse syntaxique ;",[34,88,89],{},"installer PLY ;",[34,91,92],{},"écrire les tokens de base ;",[34,94,95],{},"définir une grammaire simple ;",[34,97,98],{},"construire un mini interpréteur ;",[34,100,101],{},"tester votre mini langage avec plusieurs exemples.",[14,103,105],{"id":104},"_1-quest-ce-quun-compilateur","1. Qu'est-ce qu'un compilateur ?",[19,107,108],{},"Un compilateur est un programme qui transforme un code source en une autre forme exploitable.",[19,110,111],{},"Selon le contexte, il peut :",[31,113,114,117,120],{},[34,115,116],{},"produire du code machine ;",[34,118,119],{},"produire un langage intermédiaire ;",[34,121,122],{},"exécuter directement une structure interne comme un arbre syntaxique.",[19,124,125,126,129],{},"Dans ce tutoriel, nous allons construire un ",[26,127,128],{},"mini compilateur de type interpréteur",". Cela veut dire que notre programme va analyser une petite syntaxe, puis calculer directement le résultat.",[14,131,133],{"id":132},"_2-les-grandes-étapes-du-traitement","2. Les grandes étapes du traitement",[19,135,136],{},"Un compilateur suit souvent plusieurs étapes :",[138,139,140,146,152,158],"ol",{},[34,141,142,145],{},[26,143,144],{},"Analyse lexicale"," : on découpe le texte en tokens.",[34,147,148,151],{},[26,149,150],{},"Analyse syntaxique"," : on vérifie que les tokens forment une structure valide.",[34,153,154,157],{},[26,155,156],{},"Construction d'une représentation interne"," : souvent un arbre syntaxique.",[34,159,160,163],{},[26,161,162],{},"Exécution ou génération de code"," : on produit un résultat.",[19,165,166],{},"PLY aide précisément à gérer les deux premières étapes.",[14,168,170],{"id":169},"_3-préparer-le-projet","3. Préparer le projet",[19,172,173],{},"Avant d'écrire le code, il faut préparer le dossier du projet.",[175,176,178],"h3",{"id":177},"structure-conseillée","Structure conseillée",[180,181,187],"pre",{"className":182,"code":184,"language":185,"meta":186},[183],"language-text","mini-compilateur\u002F\n├── main.py\n└── requirements.txt\n","text","",[38,188,184],{"__ignoreMap":186},[175,190,192],{"id":191},"installation-de-ply","Installation de PLY",[19,194,195],{},"Dans votre terminal :",[180,197,201],{"className":198,"code":199,"language":200,"meta":186,"style":186},"language-bash shiki shiki-themes github-light github-dark","pip install ply\n","bash",[38,202,203],{"__ignoreMap":186},[204,205,208,212,216],"span",{"class":206,"line":207},"line",1,[204,209,211],{"class":210},"sScJk","pip",[204,213,215],{"class":214},"sZZnC"," install",[204,217,218],{"class":214}," ply\n",[19,220,221],{},"Ou, si vous préférez utiliser un fichier de dépendances :",[180,223,227],{"className":224,"code":225,"language":226,"meta":186,"style":186},"language-txt shiki shiki-themes github-light github-dark","ply\n","txt",[38,228,229],{"__ignoreMap":186},[204,230,231],{"class":206,"line":207},[204,232,225],{},[19,234,235],{},"Puis :",[180,237,239],{"className":198,"code":238,"language":200,"meta":186,"style":186},"pip install -r requirements.txt\n",[38,240,241],{"__ignoreMap":186},[204,242,243,245,247,251],{"class":206,"line":207},[204,244,211],{"class":210},[204,246,215],{"class":214},[204,248,250],{"class":249},"sj4cs"," -r",[204,252,253],{"class":214}," requirements.txt\n",[175,255,257],{"id":256},"où-mettre-le-code","Où mettre le code ?",[31,259,260,266,272],{},[34,261,262,263,41],{},"le code Python principal dans ",[38,264,265],{},"main.py",[34,267,268,269,41],{},"les dépendances dans ",[38,270,271],{},"requirements.txt",[34,273,274],{},"les exemples d'entrée directement dans le fichier Python pour commencer.",[14,276,278],{"id":277},"_4-définir-le-mini-langage","4. Définir le mini langage",[19,280,281],{},"Pour apprendre clairement, nous allons partir d'un langage très simple.",[19,283,284],{},"Il supportera :",[31,286,287,290,306,309,312,318],{},[34,288,289],{},"les nombres entiers ;",[34,291,292,293,296,297,296,300,296,303,41],{},"les opérations ",[38,294,295],{},"+",", ",[38,298,299],{},"-",[38,301,302],{},"*",[38,304,305],{},"\u002F",[34,307,308],{},"les parenthèses ;",[34,310,311],{},"les variables ;",[34,313,314,315,41],{},"les affectations avec ",[38,316,317],{},"=",[34,319,320,321,48],{},"l'instruction ",[38,322,71],{},[175,324,326],{"id":325},"exemples-valides","Exemples valides",[180,328,331],{"className":329,"code":330,"language":185,"meta":186},[183],"a = 10\nb = 5\nprint(a + b * 2)\n",[38,332,330],{"__ignoreMap":186},[19,334,335],{},"Le but est de comprendre comment transformer ce texte en calcul réel.",[14,337,339],{"id":338},"_5-lanalyse-lexicale-avec-ply-lex","5. L'analyse lexicale avec PLY Lex",[19,341,342,343,48],{},"L'analyse lexicale consiste à découper le texte en morceaux compréhensibles appelés ",[26,344,345],{},"tokens",[19,347,348],{},"Par exemple, cette ligne :",[180,350,353],{"className":351,"code":352,"language":185,"meta":186},[183],"print(a + 3)\n",[38,354,352],{"__ignoreMap":186},[19,356,357],{},"peut être découpée en :",[31,359,360,365,370,375,380,385],{},[34,361,362],{},[38,363,364],{},"PRINT",[34,366,367],{},[38,368,369],{},"LPAREN",[34,371,372],{},[38,373,374],{},"ID",[34,376,377],{},[38,378,379],{},"PLUS",[34,381,382],{},[38,383,384],{},"NUMBER",[34,386,387],{},[38,388,389],{},"RPAREN",[175,391,393],{"id":392},"exemple-de-tokens","Exemple de tokens",[19,395,396],{},"Voici une première base pour notre analyse lexicale :",[180,398,402],{"className":399,"code":400,"language":401,"meta":186,"style":186},"language-python shiki shiki-themes github-light github-dark","import ply.lex as lex\n\nreserved = {\n    'print': 'PRINT',\n}\n\ntokens = [\n    'ID',\n    'NUMBER',\n    'PLUS',\n    'MINUS',\n    'TIMES',\n    'DIVIDE',\n    'LPAREN',\n    'RPAREN',\n    'EQUALS',\n] + list(reserved.values())\n\n# Tokens simples\nt_PLUS = r'\\+'\nt_MINUS = r'-'\nt_TIMES = r'\\*'\nt_DIVIDE = r'\u002F'\nt_LPAREN = r'\\('\nt_RPAREN = r'\\)'\nt_EQUALS = r'='\n\nt_ignore = ' \\t'\n\ndef t_NUMBER(t):\n    r'\\d+'\n    t.value = int(t.value)\n    return t\n\ndef t_ID(t):\n    r'[a-zA-Z_][a-zA-Z0-9_]*'\n    t.type = reserved.get(t.value, 'ID')\n    return t\n\ndef t_newline(t):\n    r'\\n+'\n    t.lexer.lineno += len(t.value)\n\ndef t_error(t):\n    print(f\"Caractère illégal : {t.value[0]!r}\")\n    t.lexer.skip(1)\n\nlexer = lex.lex()\n","python",[38,403,404,420,427,438,453,459,464,475,483,491,499,507,515,523,531,539,547,561,566,573,594,611,628,644,661,678,694,699,715,720,732,741,755,764,769,779,787,804,811,816,826,834,848,853,863,901,912,917],{"__ignoreMap":186},[204,405,406,410,414,417],{"class":206,"line":207},[204,407,409],{"class":408},"szBVR","import",[204,411,413],{"class":412},"sVt8B"," ply.lex ",[204,415,416],{"class":408},"as",[204,418,419],{"class":412}," lex\n",[204,421,423],{"class":206,"line":422},2,[204,424,426],{"emptyLinePlaceholder":425},true,"\n",[204,428,430,433,435],{"class":206,"line":429},3,[204,431,432],{"class":412},"reserved ",[204,434,317],{"class":408},[204,436,437],{"class":412}," {\n",[204,439,441,444,447,450],{"class":206,"line":440},4,[204,442,443],{"class":214},"    'print'",[204,445,446],{"class":412},": ",[204,448,449],{"class":214},"'PRINT'",[204,451,452],{"class":412},",\n",[204,454,456],{"class":206,"line":455},5,[204,457,458],{"class":412},"}\n",[204,460,462],{"class":206,"line":461},6,[204,463,426],{"emptyLinePlaceholder":425},[204,465,467,470,472],{"class":206,"line":466},7,[204,468,469],{"class":412},"tokens ",[204,471,317],{"class":408},[204,473,474],{"class":412}," [\n",[204,476,478,481],{"class":206,"line":477},8,[204,479,480],{"class":214},"    'ID'",[204,482,452],{"class":412},[204,484,486,489],{"class":206,"line":485},9,[204,487,488],{"class":214},"    'NUMBER'",[204,490,452],{"class":412},[204,492,494,497],{"class":206,"line":493},10,[204,495,496],{"class":214},"    'PLUS'",[204,498,452],{"class":412},[204,500,502,505],{"class":206,"line":501},11,[204,503,504],{"class":214},"    'MINUS'",[204,506,452],{"class":412},[204,508,510,513],{"class":206,"line":509},12,[204,511,512],{"class":214},"    'TIMES'",[204,514,452],{"class":412},[204,516,518,521],{"class":206,"line":517},13,[204,519,520],{"class":214},"    'DIVIDE'",[204,522,452],{"class":412},[204,524,526,529],{"class":206,"line":525},14,[204,527,528],{"class":214},"    'LPAREN'",[204,530,452],{"class":412},[204,532,534,537],{"class":206,"line":533},15,[204,535,536],{"class":214},"    'RPAREN'",[204,538,452],{"class":412},[204,540,542,545],{"class":206,"line":541},16,[204,543,544],{"class":214},"    'EQUALS'",[204,546,452],{"class":412},[204,548,550,553,555,558],{"class":206,"line":549},17,[204,551,552],{"class":412},"] ",[204,554,295],{"class":408},[204,556,557],{"class":249}," list",[204,559,560],{"class":412},"(reserved.values())\n",[204,562,564],{"class":206,"line":563},18,[204,565,426],{"emptyLinePlaceholder":425},[204,567,569],{"class":206,"line":568},19,[204,570,572],{"class":571},"sJ8bj","# Tokens simples\n",[204,574,576,579,581,584,587,591],{"class":206,"line":575},20,[204,577,578],{"class":412},"t_PLUS ",[204,580,317],{"class":408},[204,582,583],{"class":408}," r",[204,585,586],{"class":214},"'",[204,588,590],{"class":589},"snhLl","\\+",[204,592,593],{"class":214},"'\n",[204,595,597,600,602,604,606,609],{"class":206,"line":596},21,[204,598,599],{"class":412},"t_MINUS ",[204,601,317],{"class":408},[204,603,583],{"class":408},[204,605,586],{"class":214},[204,607,299],{"class":608},"sA_wV",[204,610,593],{"class":214},[204,612,614,617,619,621,623,626],{"class":206,"line":613},22,[204,615,616],{"class":412},"t_TIMES ",[204,618,317],{"class":408},[204,620,583],{"class":408},[204,622,586],{"class":214},[204,624,625],{"class":589},"\\*",[204,627,593],{"class":214},[204,629,631,634,636,638,640,642],{"class":206,"line":630},23,[204,632,633],{"class":412},"t_DIVIDE ",[204,635,317],{"class":408},[204,637,583],{"class":408},[204,639,586],{"class":214},[204,641,305],{"class":608},[204,643,593],{"class":214},[204,645,647,650,652,654,656,659],{"class":206,"line":646},24,[204,648,649],{"class":412},"t_LPAREN ",[204,651,317],{"class":408},[204,653,583],{"class":408},[204,655,586],{"class":214},[204,657,658],{"class":589},"\\(",[204,660,593],{"class":214},[204,662,664,667,669,671,673,676],{"class":206,"line":663},25,[204,665,666],{"class":412},"t_RPAREN ",[204,668,317],{"class":408},[204,670,583],{"class":408},[204,672,586],{"class":214},[204,674,675],{"class":589},"\\)",[204,677,593],{"class":214},[204,679,681,684,686,688,690,692],{"class":206,"line":680},26,[204,682,683],{"class":412},"t_EQUALS ",[204,685,317],{"class":408},[204,687,583],{"class":408},[204,689,586],{"class":214},[204,691,317],{"class":608},[204,693,593],{"class":214},[204,695,697],{"class":206,"line":696},27,[204,698,426],{"emptyLinePlaceholder":425},[204,700,702,705,707,710,713],{"class":206,"line":701},28,[204,703,704],{"class":412},"t_ignore ",[204,706,317],{"class":408},[204,708,709],{"class":214}," ' ",[204,711,712],{"class":249},"\\t",[204,714,593],{"class":214},[204,716,718],{"class":206,"line":717},29,[204,719,426],{"emptyLinePlaceholder":425},[204,721,723,726,729],{"class":206,"line":722},30,[204,724,725],{"class":408},"def",[204,727,728],{"class":210}," t_NUMBER",[204,730,731],{"class":412},"(t):\n",[204,733,735,738],{"class":206,"line":734},31,[204,736,737],{"class":408},"    r",[204,739,740],{"class":214},"'\\d+'\n",[204,742,744,747,749,752],{"class":206,"line":743},32,[204,745,746],{"class":412},"    t.value ",[204,748,317],{"class":408},[204,750,751],{"class":249}," int",[204,753,754],{"class":412},"(t.value)\n",[204,756,758,761],{"class":206,"line":757},33,[204,759,760],{"class":408},"    return",[204,762,763],{"class":412}," t\n",[204,765,767],{"class":206,"line":766},34,[204,768,426],{"emptyLinePlaceholder":425},[204,770,772,774,777],{"class":206,"line":771},35,[204,773,725],{"class":408},[204,775,776],{"class":210}," t_ID",[204,778,731],{"class":412},[204,780,782,784],{"class":206,"line":781},36,[204,783,737],{"class":408},[204,785,786],{"class":214},"'[a-zA-Z_][a-zA-Z0-9_]*'\n",[204,788,790,793,795,798,801],{"class":206,"line":789},37,[204,791,792],{"class":412},"    t.type ",[204,794,317],{"class":408},[204,796,797],{"class":412}," reserved.get(t.value, ",[204,799,800],{"class":214},"'ID'",[204,802,803],{"class":412},")\n",[204,805,807,809],{"class":206,"line":806},38,[204,808,760],{"class":408},[204,810,763],{"class":412},[204,812,814],{"class":206,"line":813},39,[204,815,426],{"emptyLinePlaceholder":425},[204,817,819,821,824],{"class":206,"line":818},40,[204,820,725],{"class":408},[204,822,823],{"class":210}," t_newline",[204,825,731],{"class":412},[204,827,829,831],{"class":206,"line":828},41,[204,830,737],{"class":408},[204,832,833],{"class":214},"'\\n+'\n",[204,835,837,840,843,846],{"class":206,"line":836},42,[204,838,839],{"class":412},"    t.lexer.lineno ",[204,841,842],{"class":408},"+=",[204,844,845],{"class":249}," len",[204,847,754],{"class":412},[204,849,851],{"class":206,"line":850},43,[204,852,426],{"emptyLinePlaceholder":425},[204,854,856,858,861],{"class":206,"line":855},44,[204,857,725],{"class":408},[204,859,860],{"class":210}," t_error",[204,862,731],{"class":412},[204,864,866,869,872,875,878,881,884,887,890,893,896,899],{"class":206,"line":865},45,[204,867,868],{"class":249},"    print",[204,870,871],{"class":412},"(",[204,873,874],{"class":408},"f",[204,876,877],{"class":214},"\"Caractère illégal : ",[204,879,880],{"class":249},"{",[204,882,883],{"class":412},"t.value[",[204,885,886],{"class":249},"0",[204,888,889],{"class":412},"]",[204,891,892],{"class":408},"!r",[204,894,895],{"class":249},"}",[204,897,898],{"class":214},"\"",[204,900,803],{"class":412},[204,902,904,907,910],{"class":206,"line":903},46,[204,905,906],{"class":412},"    t.lexer.skip(",[204,908,909],{"class":249},"1",[204,911,803],{"class":412},[204,913,915],{"class":206,"line":914},47,[204,916,426],{"emptyLinePlaceholder":425},[204,918,920,923,925],{"class":206,"line":919},48,[204,921,922],{"class":412},"lexer ",[204,924,317],{"class":408},[204,926,927],{"class":412}," lex.lex()\n",[175,929,931],{"id":930},"explication","Explication",[31,933,934,939,945,951,959],{},[34,935,936,938],{},[38,937,345],{}," contient la liste des types reconnus ;",[34,940,941,944],{},[38,942,943],{},"t_NUMBER"," convertit les nombres en entiers ;",[34,946,947,950],{},[38,948,949],{},"t_ID"," reconnaît les noms de variables ;",[34,952,953,956,957,41],{},[38,954,955],{},"reserved"," permet de distinguer les mots-clés comme ",[38,958,71],{},[34,960,961,964],{},[38,962,963],{},"t_error"," gère les erreurs lexicales.",[14,966,968],{"id":967},"_6-lanalyse-syntaxique-avec-ply-yacc","6. L'analyse syntaxique avec PLY Yacc",[19,970,971],{},"L'analyse syntaxique vérifie que les tokens sont assemblés dans le bon ordre.",[19,973,974],{},"Par exemple :",[31,976,977,983,989],{},[34,978,979,982],{},[38,980,981],{},"a = 3"," est valide ;",[34,984,985,988],{},[38,986,987],{},"= a 3"," ne l'est pas ;",[34,990,991,994],{},[38,992,993],{},"print(a + 2)"," suit une structure bien définie.",[175,996,998],{"id":997},"construire-la-grammaire","Construire la grammaire",[19,1000,1001],{},"Nous allons maintenant décrire les règles de notre mini langage.",[180,1003,1005],{"className":399,"code":1004,"language":401,"meta":186,"style":186},"import ply.yacc as yacc\n\n# ... tokens et lexer déjà définis ...\n\nprecedence = (\n    ('left', 'PLUS', 'MINUS'),\n    ('left', 'TIMES', 'DIVIDE'),\n)\n\nnames = {}\n\ndef p_statement_assign(p):\n    'statement : ID EQUALS expression'\n    names[p[1]] = p[3]\n    p[0] = p[3]\n\n\ndef p_statement_print(p):\n    'statement : PRINT LPAREN expression RPAREN'\n    print(p[3])\n    p[0] = p[3]\n\n\ndef p_expression_binop(p):\n    '''expression : expression PLUS expression\n                  | expression MINUS expression\n                  | expression TIMES expression\n                  | expression DIVIDE expression'''\n    if p[2] == '+':\n        p[0] = p[1] + p[3]\n    elif p[2] == '-':\n        p[0] = p[1] - p[3]\n    elif p[2] == '*':\n        p[0] = p[1] * p[3]\n    elif p[2] == '\u002F':\n        p[0] = p[1] \u002F p[3]\n\n\ndef p_expression_group(p):\n    'expression : LPAREN expression RPAREN'\n    p[0] = p[2]\n\n\ndef p_expression_number(p):\n    'expression : NUMBER'\n    p[0] = p[1]\n\n\ndef p_expression_id(p):\n    'expression : ID'\n    p[0] = names.get(p[1], 0)\n\n\ndef p_error(p):\n    if p:\n        print(f\"Erreur de syntaxe près de {p.value!r}\")\n    else:\n        print(\"Erreur de syntaxe à la fin de l'entrée\")\n\nparser = yacc.yacc()\n",[38,1006,1007,1019,1023,1028,1032,1042,1063,1081,1085,1089,1099,1103,1113,1118,1139,1156,1160,1164,1173,1178,1190,1206,1210,1214,1223,1228,1233,1238,1243,1264,1289,1307,1331,1348,1372,1389,1413,1417,1421,1430,1435,1451,1455,1459,1468,1473,1489,1493,1497,1507,1513,1536,1541,1546,1556,1564,1590,1598,1610,1615],{"__ignoreMap":186},[204,1008,1009,1011,1014,1016],{"class":206,"line":207},[204,1010,409],{"class":408},[204,1012,1013],{"class":412}," ply.yacc ",[204,1015,416],{"class":408},[204,1017,1018],{"class":412}," yacc\n",[204,1020,1021],{"class":206,"line":422},[204,1022,426],{"emptyLinePlaceholder":425},[204,1024,1025],{"class":206,"line":429},[204,1026,1027],{"class":571},"# ... tokens et lexer déjà définis ...\n",[204,1029,1030],{"class":206,"line":440},[204,1031,426],{"emptyLinePlaceholder":425},[204,1033,1034,1037,1039],{"class":206,"line":455},[204,1035,1036],{"class":412},"precedence ",[204,1038,317],{"class":408},[204,1040,1041],{"class":412}," (\n",[204,1043,1044,1047,1050,1052,1055,1057,1060],{"class":206,"line":461},[204,1045,1046],{"class":412},"    (",[204,1048,1049],{"class":214},"'left'",[204,1051,296],{"class":412},[204,1053,1054],{"class":214},"'PLUS'",[204,1056,296],{"class":412},[204,1058,1059],{"class":214},"'MINUS'",[204,1061,1062],{"class":412},"),\n",[204,1064,1065,1067,1069,1071,1074,1076,1079],{"class":206,"line":466},[204,1066,1046],{"class":412},[204,1068,1049],{"class":214},[204,1070,296],{"class":412},[204,1072,1073],{"class":214},"'TIMES'",[204,1075,296],{"class":412},[204,1077,1078],{"class":214},"'DIVIDE'",[204,1080,1062],{"class":412},[204,1082,1083],{"class":206,"line":477},[204,1084,803],{"class":412},[204,1086,1087],{"class":206,"line":485},[204,1088,426],{"emptyLinePlaceholder":425},[204,1090,1091,1094,1096],{"class":206,"line":493},[204,1092,1093],{"class":412},"names ",[204,1095,317],{"class":408},[204,1097,1098],{"class":412}," {}\n",[204,1100,1101],{"class":206,"line":501},[204,1102,426],{"emptyLinePlaceholder":425},[204,1104,1105,1107,1110],{"class":206,"line":509},[204,1106,725],{"class":408},[204,1108,1109],{"class":210}," p_statement_assign",[204,1111,1112],{"class":412},"(p):\n",[204,1114,1115],{"class":206,"line":517},[204,1116,1117],{"class":214},"    'statement : ID EQUALS expression'\n",[204,1119,1120,1123,1125,1128,1130,1133,1136],{"class":206,"line":525},[204,1121,1122],{"class":412},"    names[p[",[204,1124,909],{"class":249},[204,1126,1127],{"class":412},"]] ",[204,1129,317],{"class":408},[204,1131,1132],{"class":412}," p[",[204,1134,1135],{"class":249},"3",[204,1137,1138],{"class":412},"]\n",[204,1140,1141,1144,1146,1148,1150,1152,1154],{"class":206,"line":533},[204,1142,1143],{"class":412},"    p[",[204,1145,886],{"class":249},[204,1147,552],{"class":412},[204,1149,317],{"class":408},[204,1151,1132],{"class":412},[204,1153,1135],{"class":249},[204,1155,1138],{"class":412},[204,1157,1158],{"class":206,"line":541},[204,1159,426],{"emptyLinePlaceholder":425},[204,1161,1162],{"class":206,"line":549},[204,1163,426],{"emptyLinePlaceholder":425},[204,1165,1166,1168,1171],{"class":206,"line":563},[204,1167,725],{"class":408},[204,1169,1170],{"class":210}," p_statement_print",[204,1172,1112],{"class":412},[204,1174,1175],{"class":206,"line":568},[204,1176,1177],{"class":214},"    'statement : PRINT LPAREN expression RPAREN'\n",[204,1179,1180,1182,1185,1187],{"class":206,"line":575},[204,1181,868],{"class":249},[204,1183,1184],{"class":412},"(p[",[204,1186,1135],{"class":249},[204,1188,1189],{"class":412},"])\n",[204,1191,1192,1194,1196,1198,1200,1202,1204],{"class":206,"line":596},[204,1193,1143],{"class":412},[204,1195,886],{"class":249},[204,1197,552],{"class":412},[204,1199,317],{"class":408},[204,1201,1132],{"class":412},[204,1203,1135],{"class":249},[204,1205,1138],{"class":412},[204,1207,1208],{"class":206,"line":613},[204,1209,426],{"emptyLinePlaceholder":425},[204,1211,1212],{"class":206,"line":630},[204,1213,426],{"emptyLinePlaceholder":425},[204,1215,1216,1218,1221],{"class":206,"line":646},[204,1217,725],{"class":408},[204,1219,1220],{"class":210}," p_expression_binop",[204,1222,1112],{"class":412},[204,1224,1225],{"class":206,"line":663},[204,1226,1227],{"class":214},"    '''expression : expression PLUS expression\n",[204,1229,1230],{"class":206,"line":680},[204,1231,1232],{"class":214},"                  | expression MINUS expression\n",[204,1234,1235],{"class":206,"line":696},[204,1236,1237],{"class":214},"                  | expression TIMES expression\n",[204,1239,1240],{"class":206,"line":701},[204,1241,1242],{"class":214},"                  | expression DIVIDE expression'''\n",[204,1244,1245,1248,1250,1253,1255,1258,1261],{"class":206,"line":717},[204,1246,1247],{"class":408},"    if",[204,1249,1132],{"class":412},[204,1251,1252],{"class":249},"2",[204,1254,552],{"class":412},[204,1256,1257],{"class":408},"==",[204,1259,1260],{"class":214}," '+'",[204,1262,1263],{"class":412},":\n",[204,1265,1266,1269,1271,1273,1275,1277,1279,1281,1283,1285,1287],{"class":206,"line":722},[204,1267,1268],{"class":412},"        p[",[204,1270,886],{"class":249},[204,1272,552],{"class":412},[204,1274,317],{"class":408},[204,1276,1132],{"class":412},[204,1278,909],{"class":249},[204,1280,552],{"class":412},[204,1282,295],{"class":408},[204,1284,1132],{"class":412},[204,1286,1135],{"class":249},[204,1288,1138],{"class":412},[204,1290,1291,1294,1296,1298,1300,1302,1305],{"class":206,"line":734},[204,1292,1293],{"class":408},"    elif",[204,1295,1132],{"class":412},[204,1297,1252],{"class":249},[204,1299,552],{"class":412},[204,1301,1257],{"class":408},[204,1303,1304],{"class":214}," '-'",[204,1306,1263],{"class":412},[204,1308,1309,1311,1313,1315,1317,1319,1321,1323,1325,1327,1329],{"class":206,"line":743},[204,1310,1268],{"class":412},[204,1312,886],{"class":249},[204,1314,552],{"class":412},[204,1316,317],{"class":408},[204,1318,1132],{"class":412},[204,1320,909],{"class":249},[204,1322,552],{"class":412},[204,1324,299],{"class":408},[204,1326,1132],{"class":412},[204,1328,1135],{"class":249},[204,1330,1138],{"class":412},[204,1332,1333,1335,1337,1339,1341,1343,1346],{"class":206,"line":757},[204,1334,1293],{"class":408},[204,1336,1132],{"class":412},[204,1338,1252],{"class":249},[204,1340,552],{"class":412},[204,1342,1257],{"class":408},[204,1344,1345],{"class":214}," '*'",[204,1347,1263],{"class":412},[204,1349,1350,1352,1354,1356,1358,1360,1362,1364,1366,1368,1370],{"class":206,"line":766},[204,1351,1268],{"class":412},[204,1353,886],{"class":249},[204,1355,552],{"class":412},[204,1357,317],{"class":408},[204,1359,1132],{"class":412},[204,1361,909],{"class":249},[204,1363,552],{"class":412},[204,1365,302],{"class":408},[204,1367,1132],{"class":412},[204,1369,1135],{"class":249},[204,1371,1138],{"class":412},[204,1373,1374,1376,1378,1380,1382,1384,1387],{"class":206,"line":771},[204,1375,1293],{"class":408},[204,1377,1132],{"class":412},[204,1379,1252],{"class":249},[204,1381,552],{"class":412},[204,1383,1257],{"class":408},[204,1385,1386],{"class":214}," '\u002F'",[204,1388,1263],{"class":412},[204,1390,1391,1393,1395,1397,1399,1401,1403,1405,1407,1409,1411],{"class":206,"line":781},[204,1392,1268],{"class":412},[204,1394,886],{"class":249},[204,1396,552],{"class":412},[204,1398,317],{"class":408},[204,1400,1132],{"class":412},[204,1402,909],{"class":249},[204,1404,552],{"class":412},[204,1406,305],{"class":408},[204,1408,1132],{"class":412},[204,1410,1135],{"class":249},[204,1412,1138],{"class":412},[204,1414,1415],{"class":206,"line":789},[204,1416,426],{"emptyLinePlaceholder":425},[204,1418,1419],{"class":206,"line":806},[204,1420,426],{"emptyLinePlaceholder":425},[204,1422,1423,1425,1428],{"class":206,"line":813},[204,1424,725],{"class":408},[204,1426,1427],{"class":210}," p_expression_group",[204,1429,1112],{"class":412},[204,1431,1432],{"class":206,"line":818},[204,1433,1434],{"class":214},"    'expression : LPAREN expression RPAREN'\n",[204,1436,1437,1439,1441,1443,1445,1447,1449],{"class":206,"line":828},[204,1438,1143],{"class":412},[204,1440,886],{"class":249},[204,1442,552],{"class":412},[204,1444,317],{"class":408},[204,1446,1132],{"class":412},[204,1448,1252],{"class":249},[204,1450,1138],{"class":412},[204,1452,1453],{"class":206,"line":836},[204,1454,426],{"emptyLinePlaceholder":425},[204,1456,1457],{"class":206,"line":850},[204,1458,426],{"emptyLinePlaceholder":425},[204,1460,1461,1463,1466],{"class":206,"line":855},[204,1462,725],{"class":408},[204,1464,1465],{"class":210}," p_expression_number",[204,1467,1112],{"class":412},[204,1469,1470],{"class":206,"line":865},[204,1471,1472],{"class":214},"    'expression : NUMBER'\n",[204,1474,1475,1477,1479,1481,1483,1485,1487],{"class":206,"line":903},[204,1476,1143],{"class":412},[204,1478,886],{"class":249},[204,1480,552],{"class":412},[204,1482,317],{"class":408},[204,1484,1132],{"class":412},[204,1486,909],{"class":249},[204,1488,1138],{"class":412},[204,1490,1491],{"class":206,"line":914},[204,1492,426],{"emptyLinePlaceholder":425},[204,1494,1495],{"class":206,"line":919},[204,1496,426],{"emptyLinePlaceholder":425},[204,1498,1500,1502,1505],{"class":206,"line":1499},49,[204,1501,725],{"class":408},[204,1503,1504],{"class":210}," p_expression_id",[204,1506,1112],{"class":412},[204,1508,1510],{"class":206,"line":1509},50,[204,1511,1512],{"class":214},"    'expression : ID'\n",[204,1514,1516,1518,1520,1522,1524,1527,1529,1532,1534],{"class":206,"line":1515},51,[204,1517,1143],{"class":412},[204,1519,886],{"class":249},[204,1521,552],{"class":412},[204,1523,317],{"class":408},[204,1525,1526],{"class":412}," names.get(p[",[204,1528,909],{"class":249},[204,1530,1531],{"class":412},"], ",[204,1533,886],{"class":249},[204,1535,803],{"class":412},[204,1537,1539],{"class":206,"line":1538},52,[204,1540,426],{"emptyLinePlaceholder":425},[204,1542,1544],{"class":206,"line":1543},53,[204,1545,426],{"emptyLinePlaceholder":425},[204,1547,1549,1551,1554],{"class":206,"line":1548},54,[204,1550,725],{"class":408},[204,1552,1553],{"class":210}," p_error",[204,1555,1112],{"class":412},[204,1557,1559,1561],{"class":206,"line":1558},55,[204,1560,1247],{"class":408},[204,1562,1563],{"class":412}," p:\n",[204,1565,1567,1570,1572,1574,1577,1579,1582,1584,1586,1588],{"class":206,"line":1566},56,[204,1568,1569],{"class":249},"        print",[204,1571,871],{"class":412},[204,1573,874],{"class":408},[204,1575,1576],{"class":214},"\"Erreur de syntaxe près de ",[204,1578,880],{"class":249},[204,1580,1581],{"class":412},"p.value",[204,1583,892],{"class":408},[204,1585,895],{"class":249},[204,1587,898],{"class":214},[204,1589,803],{"class":412},[204,1591,1593,1596],{"class":206,"line":1592},57,[204,1594,1595],{"class":408},"    else",[204,1597,1263],{"class":412},[204,1599,1601,1603,1605,1608],{"class":206,"line":1600},58,[204,1602,1569],{"class":249},[204,1604,871],{"class":412},[204,1606,1607],{"class":214},"\"Erreur de syntaxe à la fin de l'entrée\"",[204,1609,803],{"class":412},[204,1611,1613],{"class":206,"line":1612},59,[204,1614,426],{"emptyLinePlaceholder":425},[204,1616,1618,1621,1623],{"class":206,"line":1617},60,[204,1619,1620],{"class":412},"parser ",[204,1622,317],{"class":408},[204,1624,1625],{"class":412}," yacc.yacc()\n",[175,1627,1629],{"id":1628},"ce-que-fait-chaque-règle","Ce que fait chaque règle",[1631,1632,1634],"h4",{"id":1633},"p_statement_assign",[38,1635,1633],{},[19,1637,1638,1639,48],{},"Cette règle traite une affectation comme ",[38,1640,1641],{},"a = 10",[1631,1643,1645],{"id":1644},"p_statement_print",[38,1646,1644],{},[19,1648,1649],{},"Cette règle traite l'affichage d'une expression.",[1631,1651,1653],{"id":1652},"p_expression_binop",[38,1654,1652],{},[19,1656,1657],{},"Cette règle gère les opérations arithmétiques.",[1631,1659,1661],{"id":1660},"p_expression_group",[38,1662,1660],{},[19,1664,1665],{},"Elle permet de gérer les parenthèses.",[1631,1667,1669],{"id":1668},"p_expression_id",[38,1670,1668],{},[19,1672,1673],{},"Elle récupère la valeur d'une variable déjà définie.",[14,1675,1677],{"id":1676},"_7-construire-un-fichier-complet","7. Construire un fichier complet",[19,1679,1680,1681,48],{},"Voici une version complète du mini compilateur dans un seul fichier ",[38,1682,265],{},[180,1684,1686],{"className":399,"code":1685,"language":401,"meta":186,"style":186},"import ply.lex as lex\nimport ply.yacc as yacc\n\nreserved = {\n    'print': 'PRINT',\n}\n\ntokens = [\n    'ID',\n    'NUMBER',\n    'PLUS',\n    'MINUS',\n    'TIMES',\n    'DIVIDE',\n    'LPAREN',\n    'RPAREN',\n    'EQUALS',\n] + list(reserved.values())\n\nt_PLUS = r'\\+'\nt_MINUS = r'-'\nt_TIMES = r'\\*'\nt_DIVIDE = r'\u002F'\nt_LPAREN = r'\\('\nt_RPAREN = r'\\)'\nt_EQUALS = r'='\n\nt_ignore = ' \\t'\n\ndef t_NUMBER(t):\n    r'\\d+'\n    t.value = int(t.value)\n    return t\n\ndef t_ID(t):\n    r'[a-zA-Z_][a-zA-Z0-9_]*'\n    t.type = reserved.get(t.value, 'ID')\n    return t\n\ndef t_newline(t):\n    r'\\n+'\n    t.lexer.lineno += len(t.value)\n\ndef t_error(t):\n    print(f\"Caractère illégal : {t.value[0]!r}\")\n    t.lexer.skip(1)\n\nlexer = lex.lex()\n\nprecedence = (\n    ('left', 'PLUS', 'MINUS'),\n    ('left', 'TIMES', 'DIVIDE'),\n)\n\nnames = {}\n\ndef p_program_statement(p):\n    'program : statement'\n    p[0] = p[1]\n\n\ndef p_statement_assign(p):\n    'statement : ID EQUALS expression'\n    names[p[1]] = p[3]\n    p[0] = p[3]\n\n\ndef p_statement_print(p):\n    'statement : PRINT LPAREN expression RPAREN'\n    print(p[3])\n    p[0] = p[3]\n\n\ndef p_expression_binop(p):\n    '''expression : expression PLUS expression\n                  | expression MINUS expression\n                  | expression TIMES expression\n                  | expression DIVIDE expression'''\n    if p[2] == '+':\n        p[0] = p[1] + p[3]\n    elif p[2] == '-':\n        p[0] = p[1] - p[3]\n    elif p[2] == '*':\n        p[0] = p[1] * p[3]\n    elif p[2] == '\u002F':\n        p[0] = p[1] \u002F p[3]\n\n\ndef p_expression_group(p):\n    'expression : LPAREN expression RPAREN'\n    p[0] = p[2]\n\n\ndef p_expression_number(p):\n    'expression : NUMBER'\n    p[0] = p[1]\n\n\ndef p_expression_id(p):\n    'expression : ID'\n    p[0] = names.get(p[1], 0)\n\n\ndef p_error(p):\n    if p:\n        print(f\"Erreur de syntaxe près de {p.value!r}\")\n    else:\n        print(\"Erreur de syntaxe à la fin de l'entrée\")\n\nparser = yacc.yacc()\n\nif __name__ == '__main__':\n    while True:\n        try:\n            text = input('mini> ')\n        except EOFError:\n            break\n\n        if not text:\n            continue\n\n        parser.parse(text)\n",[38,1687,1688,1698,1708,1712,1720,1730,1734,1738,1746,1752,1758,1764,1770,1776,1782,1788,1794,1800,1810,1814,1828,1842,1856,1870,1884,1898,1912,1916,1928,1932,1940,1946,1956,1962,1966,1974,1980,1992,1998,2002,2010,2016,2026,2030,2038,2064,2072,2076,2084,2088,2096,2112,2128,2132,2136,2144,2148,2157,2162,2178,2182,2187,2196,2201,2218,2235,2240,2245,2254,2259,2270,2287,2292,2297,2306,2311,2316,2321,2326,2343,2368,2385,2410,2427,2452,2469,2494,2499,2504,2513,2518,2535,2540,2545,2554,2559,2576,2581,2586,2595,2600,2621,2626,2631,2640,2647,2670,2677,2688,2693,2702,2707,2724,2735,2743,2761,2772,2778,2783,2795,2801,2806],{"__ignoreMap":186},[204,1689,1690,1692,1694,1696],{"class":206,"line":207},[204,1691,409],{"class":408},[204,1693,413],{"class":412},[204,1695,416],{"class":408},[204,1697,419],{"class":412},[204,1699,1700,1702,1704,1706],{"class":206,"line":422},[204,1701,409],{"class":408},[204,1703,1013],{"class":412},[204,1705,416],{"class":408},[204,1707,1018],{"class":412},[204,1709,1710],{"class":206,"line":429},[204,1711,426],{"emptyLinePlaceholder":425},[204,1713,1714,1716,1718],{"class":206,"line":440},[204,1715,432],{"class":412},[204,1717,317],{"class":408},[204,1719,437],{"class":412},[204,1721,1722,1724,1726,1728],{"class":206,"line":455},[204,1723,443],{"class":214},[204,1725,446],{"class":412},[204,1727,449],{"class":214},[204,1729,452],{"class":412},[204,1731,1732],{"class":206,"line":461},[204,1733,458],{"class":412},[204,1735,1736],{"class":206,"line":466},[204,1737,426],{"emptyLinePlaceholder":425},[204,1739,1740,1742,1744],{"class":206,"line":477},[204,1741,469],{"class":412},[204,1743,317],{"class":408},[204,1745,474],{"class":412},[204,1747,1748,1750],{"class":206,"line":485},[204,1749,480],{"class":214},[204,1751,452],{"class":412},[204,1753,1754,1756],{"class":206,"line":493},[204,1755,488],{"class":214},[204,1757,452],{"class":412},[204,1759,1760,1762],{"class":206,"line":501},[204,1761,496],{"class":214},[204,1763,452],{"class":412},[204,1765,1766,1768],{"class":206,"line":509},[204,1767,504],{"class":214},[204,1769,452],{"class":412},[204,1771,1772,1774],{"class":206,"line":517},[204,1773,512],{"class":214},[204,1775,452],{"class":412},[204,1777,1778,1780],{"class":206,"line":525},[204,1779,520],{"class":214},[204,1781,452],{"class":412},[204,1783,1784,1786],{"class":206,"line":533},[204,1785,528],{"class":214},[204,1787,452],{"class":412},[204,1789,1790,1792],{"class":206,"line":541},[204,1791,536],{"class":214},[204,1793,452],{"class":412},[204,1795,1796,1798],{"class":206,"line":549},[204,1797,544],{"class":214},[204,1799,452],{"class":412},[204,1801,1802,1804,1806,1808],{"class":206,"line":563},[204,1803,552],{"class":412},[204,1805,295],{"class":408},[204,1807,557],{"class":249},[204,1809,560],{"class":412},[204,1811,1812],{"class":206,"line":568},[204,1813,426],{"emptyLinePlaceholder":425},[204,1815,1816,1818,1820,1822,1824,1826],{"class":206,"line":575},[204,1817,578],{"class":412},[204,1819,317],{"class":408},[204,1821,583],{"class":408},[204,1823,586],{"class":214},[204,1825,590],{"class":589},[204,1827,593],{"class":214},[204,1829,1830,1832,1834,1836,1838,1840],{"class":206,"line":596},[204,1831,599],{"class":412},[204,1833,317],{"class":408},[204,1835,583],{"class":408},[204,1837,586],{"class":214},[204,1839,299],{"class":608},[204,1841,593],{"class":214},[204,1843,1844,1846,1848,1850,1852,1854],{"class":206,"line":613},[204,1845,616],{"class":412},[204,1847,317],{"class":408},[204,1849,583],{"class":408},[204,1851,586],{"class":214},[204,1853,625],{"class":589},[204,1855,593],{"class":214},[204,1857,1858,1860,1862,1864,1866,1868],{"class":206,"line":630},[204,1859,633],{"class":412},[204,1861,317],{"class":408},[204,1863,583],{"class":408},[204,1865,586],{"class":214},[204,1867,305],{"class":608},[204,1869,593],{"class":214},[204,1871,1872,1874,1876,1878,1880,1882],{"class":206,"line":646},[204,1873,649],{"class":412},[204,1875,317],{"class":408},[204,1877,583],{"class":408},[204,1879,586],{"class":214},[204,1881,658],{"class":589},[204,1883,593],{"class":214},[204,1885,1886,1888,1890,1892,1894,1896],{"class":206,"line":663},[204,1887,666],{"class":412},[204,1889,317],{"class":408},[204,1891,583],{"class":408},[204,1893,586],{"class":214},[204,1895,675],{"class":589},[204,1897,593],{"class":214},[204,1899,1900,1902,1904,1906,1908,1910],{"class":206,"line":680},[204,1901,683],{"class":412},[204,1903,317],{"class":408},[204,1905,583],{"class":408},[204,1907,586],{"class":214},[204,1909,317],{"class":608},[204,1911,593],{"class":214},[204,1913,1914],{"class":206,"line":696},[204,1915,426],{"emptyLinePlaceholder":425},[204,1917,1918,1920,1922,1924,1926],{"class":206,"line":701},[204,1919,704],{"class":412},[204,1921,317],{"class":408},[204,1923,709],{"class":214},[204,1925,712],{"class":249},[204,1927,593],{"class":214},[204,1929,1930],{"class":206,"line":717},[204,1931,426],{"emptyLinePlaceholder":425},[204,1933,1934,1936,1938],{"class":206,"line":722},[204,1935,725],{"class":408},[204,1937,728],{"class":210},[204,1939,731],{"class":412},[204,1941,1942,1944],{"class":206,"line":734},[204,1943,737],{"class":408},[204,1945,740],{"class":214},[204,1947,1948,1950,1952,1954],{"class":206,"line":743},[204,1949,746],{"class":412},[204,1951,317],{"class":408},[204,1953,751],{"class":249},[204,1955,754],{"class":412},[204,1957,1958,1960],{"class":206,"line":757},[204,1959,760],{"class":408},[204,1961,763],{"class":412},[204,1963,1964],{"class":206,"line":766},[204,1965,426],{"emptyLinePlaceholder":425},[204,1967,1968,1970,1972],{"class":206,"line":771},[204,1969,725],{"class":408},[204,1971,776],{"class":210},[204,1973,731],{"class":412},[204,1975,1976,1978],{"class":206,"line":781},[204,1977,737],{"class":408},[204,1979,786],{"class":214},[204,1981,1982,1984,1986,1988,1990],{"class":206,"line":789},[204,1983,792],{"class":412},[204,1985,317],{"class":408},[204,1987,797],{"class":412},[204,1989,800],{"class":214},[204,1991,803],{"class":412},[204,1993,1994,1996],{"class":206,"line":806},[204,1995,760],{"class":408},[204,1997,763],{"class":412},[204,1999,2000],{"class":206,"line":813},[204,2001,426],{"emptyLinePlaceholder":425},[204,2003,2004,2006,2008],{"class":206,"line":818},[204,2005,725],{"class":408},[204,2007,823],{"class":210},[204,2009,731],{"class":412},[204,2011,2012,2014],{"class":206,"line":828},[204,2013,737],{"class":408},[204,2015,833],{"class":214},[204,2017,2018,2020,2022,2024],{"class":206,"line":836},[204,2019,839],{"class":412},[204,2021,842],{"class":408},[204,2023,845],{"class":249},[204,2025,754],{"class":412},[204,2027,2028],{"class":206,"line":850},[204,2029,426],{"emptyLinePlaceholder":425},[204,2031,2032,2034,2036],{"class":206,"line":855},[204,2033,725],{"class":408},[204,2035,860],{"class":210},[204,2037,731],{"class":412},[204,2039,2040,2042,2044,2046,2048,2050,2052,2054,2056,2058,2060,2062],{"class":206,"line":865},[204,2041,868],{"class":249},[204,2043,871],{"class":412},[204,2045,874],{"class":408},[204,2047,877],{"class":214},[204,2049,880],{"class":249},[204,2051,883],{"class":412},[204,2053,886],{"class":249},[204,2055,889],{"class":412},[204,2057,892],{"class":408},[204,2059,895],{"class":249},[204,2061,898],{"class":214},[204,2063,803],{"class":412},[204,2065,2066,2068,2070],{"class":206,"line":903},[204,2067,906],{"class":412},[204,2069,909],{"class":249},[204,2071,803],{"class":412},[204,2073,2074],{"class":206,"line":914},[204,2075,426],{"emptyLinePlaceholder":425},[204,2077,2078,2080,2082],{"class":206,"line":919},[204,2079,922],{"class":412},[204,2081,317],{"class":408},[204,2083,927],{"class":412},[204,2085,2086],{"class":206,"line":1499},[204,2087,426],{"emptyLinePlaceholder":425},[204,2089,2090,2092,2094],{"class":206,"line":1509},[204,2091,1036],{"class":412},[204,2093,317],{"class":408},[204,2095,1041],{"class":412},[204,2097,2098,2100,2102,2104,2106,2108,2110],{"class":206,"line":1515},[204,2099,1046],{"class":412},[204,2101,1049],{"class":214},[204,2103,296],{"class":412},[204,2105,1054],{"class":214},[204,2107,296],{"class":412},[204,2109,1059],{"class":214},[204,2111,1062],{"class":412},[204,2113,2114,2116,2118,2120,2122,2124,2126],{"class":206,"line":1538},[204,2115,1046],{"class":412},[204,2117,1049],{"class":214},[204,2119,296],{"class":412},[204,2121,1073],{"class":214},[204,2123,296],{"class":412},[204,2125,1078],{"class":214},[204,2127,1062],{"class":412},[204,2129,2130],{"class":206,"line":1543},[204,2131,803],{"class":412},[204,2133,2134],{"class":206,"line":1548},[204,2135,426],{"emptyLinePlaceholder":425},[204,2137,2138,2140,2142],{"class":206,"line":1558},[204,2139,1093],{"class":412},[204,2141,317],{"class":408},[204,2143,1098],{"class":412},[204,2145,2146],{"class":206,"line":1566},[204,2147,426],{"emptyLinePlaceholder":425},[204,2149,2150,2152,2155],{"class":206,"line":1592},[204,2151,725],{"class":408},[204,2153,2154],{"class":210}," p_program_statement",[204,2156,1112],{"class":412},[204,2158,2159],{"class":206,"line":1600},[204,2160,2161],{"class":214},"    'program : statement'\n",[204,2163,2164,2166,2168,2170,2172,2174,2176],{"class":206,"line":1612},[204,2165,1143],{"class":412},[204,2167,886],{"class":249},[204,2169,552],{"class":412},[204,2171,317],{"class":408},[204,2173,1132],{"class":412},[204,2175,909],{"class":249},[204,2177,1138],{"class":412},[204,2179,2180],{"class":206,"line":1617},[204,2181,426],{"emptyLinePlaceholder":425},[204,2183,2185],{"class":206,"line":2184},61,[204,2186,426],{"emptyLinePlaceholder":425},[204,2188,2190,2192,2194],{"class":206,"line":2189},62,[204,2191,725],{"class":408},[204,2193,1109],{"class":210},[204,2195,1112],{"class":412},[204,2197,2199],{"class":206,"line":2198},63,[204,2200,1117],{"class":214},[204,2202,2204,2206,2208,2210,2212,2214,2216],{"class":206,"line":2203},64,[204,2205,1122],{"class":412},[204,2207,909],{"class":249},[204,2209,1127],{"class":412},[204,2211,317],{"class":408},[204,2213,1132],{"class":412},[204,2215,1135],{"class":249},[204,2217,1138],{"class":412},[204,2219,2221,2223,2225,2227,2229,2231,2233],{"class":206,"line":2220},65,[204,2222,1143],{"class":412},[204,2224,886],{"class":249},[204,2226,552],{"class":412},[204,2228,317],{"class":408},[204,2230,1132],{"class":412},[204,2232,1135],{"class":249},[204,2234,1138],{"class":412},[204,2236,2238],{"class":206,"line":2237},66,[204,2239,426],{"emptyLinePlaceholder":425},[204,2241,2243],{"class":206,"line":2242},67,[204,2244,426],{"emptyLinePlaceholder":425},[204,2246,2248,2250,2252],{"class":206,"line":2247},68,[204,2249,725],{"class":408},[204,2251,1170],{"class":210},[204,2253,1112],{"class":412},[204,2255,2257],{"class":206,"line":2256},69,[204,2258,1177],{"class":214},[204,2260,2262,2264,2266,2268],{"class":206,"line":2261},70,[204,2263,868],{"class":249},[204,2265,1184],{"class":412},[204,2267,1135],{"class":249},[204,2269,1189],{"class":412},[204,2271,2273,2275,2277,2279,2281,2283,2285],{"class":206,"line":2272},71,[204,2274,1143],{"class":412},[204,2276,886],{"class":249},[204,2278,552],{"class":412},[204,2280,317],{"class":408},[204,2282,1132],{"class":412},[204,2284,1135],{"class":249},[204,2286,1138],{"class":412},[204,2288,2290],{"class":206,"line":2289},72,[204,2291,426],{"emptyLinePlaceholder":425},[204,2293,2295],{"class":206,"line":2294},73,[204,2296,426],{"emptyLinePlaceholder":425},[204,2298,2300,2302,2304],{"class":206,"line":2299},74,[204,2301,725],{"class":408},[204,2303,1220],{"class":210},[204,2305,1112],{"class":412},[204,2307,2309],{"class":206,"line":2308},75,[204,2310,1227],{"class":214},[204,2312,2314],{"class":206,"line":2313},76,[204,2315,1232],{"class":214},[204,2317,2319],{"class":206,"line":2318},77,[204,2320,1237],{"class":214},[204,2322,2324],{"class":206,"line":2323},78,[204,2325,1242],{"class":214},[204,2327,2329,2331,2333,2335,2337,2339,2341],{"class":206,"line":2328},79,[204,2330,1247],{"class":408},[204,2332,1132],{"class":412},[204,2334,1252],{"class":249},[204,2336,552],{"class":412},[204,2338,1257],{"class":408},[204,2340,1260],{"class":214},[204,2342,1263],{"class":412},[204,2344,2346,2348,2350,2352,2354,2356,2358,2360,2362,2364,2366],{"class":206,"line":2345},80,[204,2347,1268],{"class":412},[204,2349,886],{"class":249},[204,2351,552],{"class":412},[204,2353,317],{"class":408},[204,2355,1132],{"class":412},[204,2357,909],{"class":249},[204,2359,552],{"class":412},[204,2361,295],{"class":408},[204,2363,1132],{"class":412},[204,2365,1135],{"class":249},[204,2367,1138],{"class":412},[204,2369,2371,2373,2375,2377,2379,2381,2383],{"class":206,"line":2370},81,[204,2372,1293],{"class":408},[204,2374,1132],{"class":412},[204,2376,1252],{"class":249},[204,2378,552],{"class":412},[204,2380,1257],{"class":408},[204,2382,1304],{"class":214},[204,2384,1263],{"class":412},[204,2386,2388,2390,2392,2394,2396,2398,2400,2402,2404,2406,2408],{"class":206,"line":2387},82,[204,2389,1268],{"class":412},[204,2391,886],{"class":249},[204,2393,552],{"class":412},[204,2395,317],{"class":408},[204,2397,1132],{"class":412},[204,2399,909],{"class":249},[204,2401,552],{"class":412},[204,2403,299],{"class":408},[204,2405,1132],{"class":412},[204,2407,1135],{"class":249},[204,2409,1138],{"class":412},[204,2411,2413,2415,2417,2419,2421,2423,2425],{"class":206,"line":2412},83,[204,2414,1293],{"class":408},[204,2416,1132],{"class":412},[204,2418,1252],{"class":249},[204,2420,552],{"class":412},[204,2422,1257],{"class":408},[204,2424,1345],{"class":214},[204,2426,1263],{"class":412},[204,2428,2430,2432,2434,2436,2438,2440,2442,2444,2446,2448,2450],{"class":206,"line":2429},84,[204,2431,1268],{"class":412},[204,2433,886],{"class":249},[204,2435,552],{"class":412},[204,2437,317],{"class":408},[204,2439,1132],{"class":412},[204,2441,909],{"class":249},[204,2443,552],{"class":412},[204,2445,302],{"class":408},[204,2447,1132],{"class":412},[204,2449,1135],{"class":249},[204,2451,1138],{"class":412},[204,2453,2455,2457,2459,2461,2463,2465,2467],{"class":206,"line":2454},85,[204,2456,1293],{"class":408},[204,2458,1132],{"class":412},[204,2460,1252],{"class":249},[204,2462,552],{"class":412},[204,2464,1257],{"class":408},[204,2466,1386],{"class":214},[204,2468,1263],{"class":412},[204,2470,2472,2474,2476,2478,2480,2482,2484,2486,2488,2490,2492],{"class":206,"line":2471},86,[204,2473,1268],{"class":412},[204,2475,886],{"class":249},[204,2477,552],{"class":412},[204,2479,317],{"class":408},[204,2481,1132],{"class":412},[204,2483,909],{"class":249},[204,2485,552],{"class":412},[204,2487,305],{"class":408},[204,2489,1132],{"class":412},[204,2491,1135],{"class":249},[204,2493,1138],{"class":412},[204,2495,2497],{"class":206,"line":2496},87,[204,2498,426],{"emptyLinePlaceholder":425},[204,2500,2502],{"class":206,"line":2501},88,[204,2503,426],{"emptyLinePlaceholder":425},[204,2505,2507,2509,2511],{"class":206,"line":2506},89,[204,2508,725],{"class":408},[204,2510,1427],{"class":210},[204,2512,1112],{"class":412},[204,2514,2516],{"class":206,"line":2515},90,[204,2517,1434],{"class":214},[204,2519,2521,2523,2525,2527,2529,2531,2533],{"class":206,"line":2520},91,[204,2522,1143],{"class":412},[204,2524,886],{"class":249},[204,2526,552],{"class":412},[204,2528,317],{"class":408},[204,2530,1132],{"class":412},[204,2532,1252],{"class":249},[204,2534,1138],{"class":412},[204,2536,2538],{"class":206,"line":2537},92,[204,2539,426],{"emptyLinePlaceholder":425},[204,2541,2543],{"class":206,"line":2542},93,[204,2544,426],{"emptyLinePlaceholder":425},[204,2546,2548,2550,2552],{"class":206,"line":2547},94,[204,2549,725],{"class":408},[204,2551,1465],{"class":210},[204,2553,1112],{"class":412},[204,2555,2557],{"class":206,"line":2556},95,[204,2558,1472],{"class":214},[204,2560,2562,2564,2566,2568,2570,2572,2574],{"class":206,"line":2561},96,[204,2563,1143],{"class":412},[204,2565,886],{"class":249},[204,2567,552],{"class":412},[204,2569,317],{"class":408},[204,2571,1132],{"class":412},[204,2573,909],{"class":249},[204,2575,1138],{"class":412},[204,2577,2579],{"class":206,"line":2578},97,[204,2580,426],{"emptyLinePlaceholder":425},[204,2582,2584],{"class":206,"line":2583},98,[204,2585,426],{"emptyLinePlaceholder":425},[204,2587,2589,2591,2593],{"class":206,"line":2588},99,[204,2590,725],{"class":408},[204,2592,1504],{"class":210},[204,2594,1112],{"class":412},[204,2596,2598],{"class":206,"line":2597},100,[204,2599,1512],{"class":214},[204,2601,2603,2605,2607,2609,2611,2613,2615,2617,2619],{"class":206,"line":2602},101,[204,2604,1143],{"class":412},[204,2606,886],{"class":249},[204,2608,552],{"class":412},[204,2610,317],{"class":408},[204,2612,1526],{"class":412},[204,2614,909],{"class":249},[204,2616,1531],{"class":412},[204,2618,886],{"class":249},[204,2620,803],{"class":412},[204,2622,2624],{"class":206,"line":2623},102,[204,2625,426],{"emptyLinePlaceholder":425},[204,2627,2629],{"class":206,"line":2628},103,[204,2630,426],{"emptyLinePlaceholder":425},[204,2632,2634,2636,2638],{"class":206,"line":2633},104,[204,2635,725],{"class":408},[204,2637,1553],{"class":210},[204,2639,1112],{"class":412},[204,2641,2643,2645],{"class":206,"line":2642},105,[204,2644,1247],{"class":408},[204,2646,1563],{"class":412},[204,2648,2650,2652,2654,2656,2658,2660,2662,2664,2666,2668],{"class":206,"line":2649},106,[204,2651,1569],{"class":249},[204,2653,871],{"class":412},[204,2655,874],{"class":408},[204,2657,1576],{"class":214},[204,2659,880],{"class":249},[204,2661,1581],{"class":412},[204,2663,892],{"class":408},[204,2665,895],{"class":249},[204,2667,898],{"class":214},[204,2669,803],{"class":412},[204,2671,2673,2675],{"class":206,"line":2672},107,[204,2674,1595],{"class":408},[204,2676,1263],{"class":412},[204,2678,2680,2682,2684,2686],{"class":206,"line":2679},108,[204,2681,1569],{"class":249},[204,2683,871],{"class":412},[204,2685,1607],{"class":214},[204,2687,803],{"class":412},[204,2689,2691],{"class":206,"line":2690},109,[204,2692,426],{"emptyLinePlaceholder":425},[204,2694,2696,2698,2700],{"class":206,"line":2695},110,[204,2697,1620],{"class":412},[204,2699,317],{"class":408},[204,2701,1625],{"class":412},[204,2703,2705],{"class":206,"line":2704},111,[204,2706,426],{"emptyLinePlaceholder":425},[204,2708,2710,2713,2716,2719,2722],{"class":206,"line":2709},112,[204,2711,2712],{"class":408},"if",[204,2714,2715],{"class":249}," __name__",[204,2717,2718],{"class":408}," ==",[204,2720,2721],{"class":214}," '__main__'",[204,2723,1263],{"class":412},[204,2725,2727,2730,2733],{"class":206,"line":2726},113,[204,2728,2729],{"class":408},"    while",[204,2731,2732],{"class":249}," True",[204,2734,1263],{"class":412},[204,2736,2738,2741],{"class":206,"line":2737},114,[204,2739,2740],{"class":408},"        try",[204,2742,1263],{"class":412},[204,2744,2746,2749,2751,2754,2756,2759],{"class":206,"line":2745},115,[204,2747,2748],{"class":412},"            text ",[204,2750,317],{"class":408},[204,2752,2753],{"class":249}," input",[204,2755,871],{"class":412},[204,2757,2758],{"class":214},"'mini> '",[204,2760,803],{"class":412},[204,2762,2764,2767,2770],{"class":206,"line":2763},116,[204,2765,2766],{"class":408},"        except",[204,2768,2769],{"class":249}," EOFError",[204,2771,1263],{"class":412},[204,2773,2775],{"class":206,"line":2774},117,[204,2776,2777],{"class":408},"            break\n",[204,2779,2781],{"class":206,"line":2780},118,[204,2782,426],{"emptyLinePlaceholder":425},[204,2784,2786,2789,2792],{"class":206,"line":2785},119,[204,2787,2788],{"class":408},"        if",[204,2790,2791],{"class":408}," not",[204,2793,2794],{"class":412}," text:\n",[204,2796,2798],{"class":206,"line":2797},120,[204,2799,2800],{"class":408},"            continue\n",[204,2802,2804],{"class":206,"line":2803},121,[204,2805,426],{"emptyLinePlaceholder":425},[204,2807,2809],{"class":206,"line":2808},122,[204,2810,2811],{"class":412},"        parser.parse(text)\n",[14,2813,2815],{"id":2814},"_8-exemple-dutilisation","8. Exemple d'utilisation",[19,2817,2818],{},"Lancez le programme et testez :",[180,2820,2822],{"className":2821,"code":330,"language":185,"meta":186},[183],[38,2823,330],{"__ignoreMap":186},[19,2825,2826],{},"Résultat attendu :",[180,2828,2831],{"className":2829,"code":2830,"language":185,"meta":186},[183],"20\n",[38,2832,2830],{"__ignoreMap":186},[175,2834,2836],{"id":2835},"autre-exemple","Autre exemple",[180,2838,2841],{"className":2839,"code":2840,"language":185,"meta":186},[183],"x = 8\nprint((x + 2) * 3)\n",[38,2842,2840],{"__ignoreMap":186},[19,2844,2845],{},"Résultat :",[180,2847,2850],{"className":2848,"code":2849,"language":185,"meta":186},[183],"30\n",[38,2851,2849],{"__ignoreMap":186},[14,2853,2855],{"id":2854},"_9-comprendre-lordre-des-opérations","9. Comprendre l'ordre des opérations",[19,2857,2858],{},"Comme en mathématiques, certaines opérations sont prioritaires.",[19,2860,974],{},[180,2862,2865],{"className":2863,"code":2864,"language":185,"meta":186},[183],"10 + 5 * 2\n",[38,2866,2864],{"__ignoreMap":186},[19,2868,2869,2870,2873],{},"Le résultat est ",[38,2871,2872],{},"20",", car la multiplication est effectuée avant l'addition.",[19,2875,2876,2877,2880],{},"La règle ",[38,2878,2879],{},"precedence"," permet de refléter cet ordre dans la grammaire.",[14,2882,2884],{"id":2883},"_10-gérer-les-erreurs","10. Gérer les erreurs",[19,2886,2887],{},"Un compilateur doit savoir détecter les erreurs.",[175,2889,2891],{"id":2890},"erreur-lexicale","Erreur lexicale",[19,2893,2894,2895,2897],{},"Si un caractère n'est pas reconnu, ",[38,2896,963],{}," intervient.",[175,2899,2901],{"id":2900},"erreur-syntaxique","Erreur syntaxique",[19,2903,2904,2905,2908],{},"Si la structure est incorrecte, ",[38,2906,2907],{},"p_error"," affiche un message.",[19,2910,2911],{},"Exemple :",[180,2913,2916],{"className":2914,"code":2915,"language":185,"meta":186},[183],"a =\n",[38,2917,2915],{"__ignoreMap":186},[19,2919,2920],{},"ou",[180,2922,2925],{"className":2923,"code":2924,"language":185,"meta":186},[183],"print(1 + )\n",[38,2926,2924],{"__ignoreMap":186},[19,2928,2929],{},"Ces cas doivent être signalés proprement.",[14,2931,2933],{"id":2932},"_11-améliorations-possibles","11. Améliorations possibles",[19,2935,2936],{},"Une fois la base comprise, vous pouvez aller plus loin :",[31,2938,2939,2942,2945,2948,2951,2956,2959],{},[34,2940,2941],{},"ajouter plusieurs lignes de code ;",[34,2943,2944],{},"gérer les chaînes de caractères ;",[34,2946,2947],{},"créer un vrai arbre syntaxique abstrait ;",[34,2949,2950],{},"ajouter les comparaisons ;",[34,2952,2953,2954,41],{},"ajouter les conditions ",[38,2955,2712],{},[34,2957,2958],{},"ajouter les boucles ;",[34,2960,2961],{},"générer du code Python à partir de l'arbre.",[14,2963,2965],{"id":2964},"_12-résumé","12. Résumé",[19,2967,2968],{},"Dans ce tutoriel, nous avons vu :",[31,2970,2971,2974,2977,2980,2983,2986,2991],{},[34,2972,2973],{},"ce qu'est un compilateur ;",[34,2975,2976],{},"le rôle de l'analyse lexicale ;",[34,2978,2979],{},"le rôle de l'analyse syntaxique ;",[34,2981,2982],{},"comment utiliser PLY avec Python ;",[34,2984,2985],{},"comment créer un mini langage arithmétique ;",[34,2987,2988,2989,41],{},"comment gérer des variables et ",[38,2990,71],{},[34,2992,2993],{},"comment détecter les erreurs.",[14,2995,2997],{"id":2996},"exercices","Exercices",[175,2999,3001],{"id":3000},"exercice-1","Exercice 1",[19,3003,3004],{},"Ajoutez le support des nombres à virgule.",[175,3006,3008],{"id":3007},"exercice-2","Exercice 2",[19,3010,3011],{},"Ajoutez plusieurs lignes de code dans votre mini langage.",[175,3013,3015],{"id":3014},"exercice-3","Exercice 3",[19,3017,3018,3019,3021],{},"Ajoutez une instruction ",[38,3020,71],{}," pour afficher des variables.",[175,3023,3025],{"id":3024},"exercice-4","Exercice 4",[19,3027,3028],{},"Essayez de créer un message d'erreur plus lisible.",[14,3030,3032],{"id":3031},"corrigés","Corrigés",[175,3034,3036],{"id":3035},"correction-exercice-1","Correction exercice 1",[19,3038,3039,3040,3043],{},"Remplacez ",[38,3041,3042],{},"r'\\d+'"," par une règle qui accepte aussi les nombres décimaux.",[175,3045,3047],{"id":3046},"correction-exercice-2","Correction exercice 2",[19,3049,3050,3051,48],{},"Ajoutez une grammaire de type ",[38,3052,3053],{},"program : program statement",[175,3055,3057],{"id":3056},"correction-exercice-3","Correction exercice 3",[19,3059,2876,3060,3062],{},[38,3061,1668],{}," permet déjà de lire la valeur d'une variable.",[14,3064,3066],{"id":3065},"prochaine-étape","Prochaine étape",[19,3068,3069],{},"Quand vous serez à l'aise avec ce mini compilateur, la suite naturelle est de construire un vrai arbre syntaxique abstrait pour séparer l'analyse et l'exécution.",[3071,3072,3073],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .snhLl, html code.shiki .snhLl{--shiki-default:#22863A;--shiki-default-font-weight:bold;--shiki-dark:#85E89D;--shiki-dark-font-weight:bold}html pre.shiki code .sA_wV, html code.shiki .sA_wV{--shiki-default:#032F62;--shiki-dark:#DBEDFF}",{"title":186,"searchDepth":422,"depth":422,"links":3075},[3076,3077,3078,3079,3080,3085,3088,3092,3096,3097,3100,3101,3105,3106,3107,3113,3118],{"id":16,"depth":422,"text":17},{"id":74,"depth":422,"text":75},{"id":104,"depth":422,"text":105},{"id":132,"depth":422,"text":133},{"id":169,"depth":422,"text":170,"children":3081},[3082,3083,3084],{"id":177,"depth":429,"text":178},{"id":191,"depth":429,"text":192},{"id":256,"depth":429,"text":257},{"id":277,"depth":422,"text":278,"children":3086},[3087],{"id":325,"depth":429,"text":326},{"id":338,"depth":422,"text":339,"children":3089},[3090,3091],{"id":392,"depth":429,"text":393},{"id":930,"depth":429,"text":931},{"id":967,"depth":422,"text":968,"children":3093},[3094,3095],{"id":997,"depth":429,"text":998},{"id":1628,"depth":429,"text":1629},{"id":1676,"depth":422,"text":1677},{"id":2814,"depth":422,"text":2815,"children":3098},[3099],{"id":2835,"depth":429,"text":2836},{"id":2854,"depth":422,"text":2855},{"id":2883,"depth":422,"text":2884,"children":3102},[3103,3104],{"id":2890,"depth":429,"text":2891},{"id":2900,"depth":429,"text":2901},{"id":2932,"depth":422,"text":2933},{"id":2964,"depth":422,"text":2965},{"id":2996,"depth":422,"text":2997,"children":3108},[3109,3110,3111,3112],{"id":3000,"depth":429,"text":3001},{"id":3007,"depth":429,"text":3008},{"id":3014,"depth":429,"text":3015},{"id":3024,"depth":429,"text":3025},{"id":3031,"depth":422,"text":3032,"children":3114},[3115,3116,3117],{"id":3035,"depth":429,"text":3036},{"id":3046,"depth":429,"text":3047},{"id":3056,"depth":429,"text":3057},{"id":3065,"depth":422,"text":3066},null,"Un tutoriel complet pour comprendre comment construire un mini compilateur avec PLY, en séparant l'analyse lexicale, l'analyse syntaxique et l'exécution du code.","md",{},"\u002Fblog\u002Fcreer-mini-compilateur-ply","2026-06-09",{"title":5,"description":3120},"blog\u002Fcreer-mini-compilateur-ply",[3128,3129,3130,3131,3132],"Python","PLY","Compilateur","Lex","Yacc","jDcRK3R5uH7CzDnAVgDCJwSuFVFrFXC4YgXLr0k7HBM",1788219651075]