Implémentation de l'incrément dans CPython. Cette fois, je présenterai les grandes lignes de l'augmentation et les résultats obtenus. Dans la prochaine édition d'implémentation, nous examinerons la méthode d'implémentation par ordre chronologique.
Les trois fois plus une édition supplémentaire. Présentation et résumé de l'ajout de post-incrémentation à CPython [J'ai essayé d'ajouter un post-incrément à CPython Implémentation Liste de toutes les modifications apportées par l'ajout de post-incrémentation à CPython Édition supplémentaire de l'ajout de post-incrémentation à CPython
Tout d'abord, veuillez avoir une brève diapositive qui résume les résultats.
Cela fonctionne comme ça.
>>> i=0
>>> i++
0
>>> i
1
>>> lst=[x for x in range(5)]
>>> lst
[0, 1, 2, 3, 4]
>>> lst[0]++
0
>>> lst
[1, 1, 2, 3, 4]
>>> class cls:
... a=5
...
>>> cls_obj=cls()
>>> cls_obj.a
5
>>> cls_obj.a++
5
>>> cls_obj.a
6
L'incrément peut être implémenté non seulement pour les variables mais également pour les listes et les variables membres. De plus, l'évaluation est renvoyée en même temps que la variable est réécrite.
Voici ce que j'ai trouvé en regardant le code source de CPython 3.5.0 lors de la mise en œuvre des incréments.
Le script Python est exécuté comme suit.
--Analyse des phrases - Include/tokenizer.h - Parser/tokenizer.c
Il existe une page appelée 23. Changer la grammaire de CPython dans le Guide du développeur Python, vous pouvez donc vous y référer. Cela dit, cela ne suffit pas, j'ai donc résumé quelques changements plus spécifiques.
'for'
en "(' for '|' foreach ')
, mais si vous réécrivez le deep'elif', ce sera en Python / ast.c. Il semble qu'il soit nécessaire de changer autour de ast.c car il tombera avec l'affirmation de (non confirmé)Si vous souhaitez ajouter une grammaire qui utilise des symboles déjà utilisés dans d'autres significations
-Par exemple, lister la notation d'inclusion[x + 1 | x <- range(10)]
Changer pour pouvoir écrire (|
Est déjà utilisé dans le sens du bit OU)
-Étant donné que les jetons gravés sont transmis à l'analyseur généré automatiquement en séquence, l'opération sur les bits est effectuée au moment précédent.|Ou lister la notation d'inclusion|J'ai pensé qu'il serait bon de juger si c'était le cas, mais j'ai abandonné parce qu'il faudrait du temps pour le faire à partir de zéro.
――Je pense que cela devrait être fait par l'analyseur en premier lieu, mais la grammaire Python, qui est à l'origine LL (1), n'est-elle plus LL (1)? → Il semble nécessaire de lire la partie génération automatique de l'analyseur que je n'ai pas touché et de connaître la capacité de l'analyseur
--Je n'ai pas tout à fait compris (pour cette raison, dans cette expérience, j'ai implémenté en utilisant $
au lieu de |
et j'ai triché)
Si vous souhaitez définir une syntaxe d'enrobage de sucre --En plus de tokenizer. *, Grammar, il semble bon de le refaire dans un arbre synonyme avec Python / ast.c.
Si vous souhaitez ajouter une grammaire qui dépasse le cadre des expressions et des phrases ou qui n'existe pas dans celles existantes --tokenizer, Grammar, .. Parfois, compile.c devrait aussi cracher du beau code d'octet. Si nécessaire, définissez également un nouveau code opération et son interprétation
Au fait, si vous apportez une modification destructrice à une mélodie, vous ne pourrez pas compiler la bibliothèque au moment de make install
.
Dans cette implémentation d'incrément, il y avait au moins une expression ++ 2
et une erreur a été générée (c'est un mystère pourquoi elle est écrite en premier lieu).
compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated
if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]
while_stmt: 'while' test ':' suite ['else' ':' suite]
for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite]
Recommended Posts