Python est un bon langage de script. Il vous donne même accès à son propre analyseur et le compilateur. Il vous donne également accès à différents autres analyseurs à des fins spéciales comme XML et cordes modèles.
Mais parfois vous pouvez avoir votre propre analyseur. Ce est ce qui est pour pyPEG.
Pour obtenir une vue rapide sur ce qui se passe, se il vous plaît lire cet article sur la façon d'analyser une langue arbitraire XML avec pyPEG sur mon blog.
Qu'est-ce PEG?
PEG signifie Parser packrat. Ce est quelque chose comme l'idée d'expressions régulières pour contexte langues gratuits; une explication très claire que vous trouverez dans l'article de Wikipedia sur les PEG.
Avec PEG vous pouvez décrire les mêmes langues comme avec BNF (et ils sont même similaires).
Qu'est-ce qu'un Parser-interprète?
Analyseurs communes ne utilisent pas PEG et l'analyse descendante, mais LR (n) ou LL (n) et l'analyse bottom-up. Cela se traduit par l'idée de la mise en œuvre des générateurs d'analyseur.
Parce qu'avec LR (n) ou LL (n) analyseurs vous devez calculer un premier DFA, généralement vous laissez le générateur de parser le faire pour vous. Le résultat est une implémentation de l'analyseur pour votre grammaire BNF, qui était l'entrée. On pourrait appeler un générateur d'analyseurs un compilateur du BNF à une mise en œuvre de l'analyseur.
Un Parser-interprète fait un travail d'interprète au lieu d'être un tel compilateur. Juste donner votre grammaire en entrée, et il analyse le langage décrit sur texte. Il n'y aura pas de programme généré.
Utilisation pyPEG
Cela signifie: l'aide pyPEG est très facile;-) Si vous connaissez déjà les expressions régulières, vous apprendrez à utiliser pyPEG rapidement.
Un petit échantillon
Un exemple: pensez à un langage simple comme celui-ci:
fonction FAK (n) {
& Nbsp; if (n == 0) {// 0! 1 est, par définition,
& Nbsp; retourner une;
& Nbsp;} else {
& Nbsp; retour n * FAK (n - 1);
& Nbsp;};
}
Un pyPEG pour cette langue ressemble au code suivant (voir aussi l'exemple de script):
def commentaire (): return [re.compile (r "//.*"), re.compile ("/*.*?*/", re.S)]
def littérale (): retour re.compile («.? *" R'D * .d * | | + d ')
symbole de def (): retour re.compile (r "w +")
opérateur def (): retour re.compile (r "+ | - | * | / | ==")
opération de def (): symbole de retour, opérateur, [littéral, functioncall]
expression def (): return [littérale, l'exploitation, functioncall]
def expressionlist (): retourne expression, -1, (",", expression)
def returnstatement (): retour mot-clé («retour»), expression
def ifstatement (): retour mot-clé ("si"), "(", expression, ")", bloc, mot-clé («autre»), bloc
instruction def (): return [ifstatement, returnstatement], ";"
bloc de def (): return "{", -2, déclaration, "}"
def parameterList (): return "(", symbole, -1, (",", symbole), ")"
def functioncall (): retourne le symbole "(", expressionlist, ")"
fonction def (): retour mot-clé ("fonction"), symbole, parameterList, bloc
def simpleLanguage (): fonction de retour
Quoi de neuf dans cette version:
- Ce est une version de nettoyage. Le code de parse () et composer () a été fixé.
Ce qui est nouveau dans la version 1.4:.
- Cette version corrige quelques bugs avec packrat analyse
Ce qui est nouveau dans la version 1.3:
- Remplacement de la tuple de noms dans Pyast par le symbole (la liste ) classe, ce qui est assez compatible, mais soutient code plus descriptive backends de compilation, aussi.
Quoi de neuf dans la version 1.2:.
- Bugs avec Unicode dans le traitement des erreurs ont été fixés
Ce qui est nouveau dans la version 1.1:.
- Le support Unicode a été ajouté
Ce qui est nouveau dans la version 0.46:.
- pyPEG.print_trace True
- Conversion pyPEG à Python 3.x fonctionne maintenant de façon transparente en utilisant 2to3
- Les règles de grammaire qui sont appliquées peut éventuellement être tracée par la mise en
- pyPEG va afficher cette trace sur stderr.
Ce qui est nouveau dans la version 0.45:.
- Correction de bugs
Ce qui est nouveau dans la version 0.44:
- pyPEG orne désormais chaque objet Pyast avec le nom du fichier source et la ligne nombre.
Exigences :
- Python
Commentaires non trouvées