2010-10-08 9 views
4

Je me demande comment est générée la grammaire du langage Python et comment il est compris par l'interpréteur.Comment est générée la grammaire python et comment l'interprète la comprend?

En python, le fichier graminit.c semble implémenter la grammaire, mais je ne la comprends pas clairement. Plus généralement, quelles sont les différentes façons de générer une grammaire et y a-t-il des différences entre la façon dont la grammaire est implémentée dans des langages tels que Perl, Python ou Lua.

Répondre

8

Les grammaires ont généralement la même forme: la forme Backus-Naur (BNF) est typique.

Lexer/analyseurs peuvent prendre des formes très différentes.

La lexer décompose le fichier d'entrée en jetons. L'analyseur utilise la grammaire pour voir si le flux de jetons est "valide" selon ses règles.

Habituellement, le résultat est un arbre de syntaxe abstraite (AST) qui peut ensuite être utilisé pour générer tout ce que vous voulez, comme un code octet ou un assemblage.

+0

réponse Petit qui soulève de nouvelles questions. Je connaissais les formes descriptives des langues mais je ne savais pas qu'elles s'appelaient BNF. Je suppose que l'arbre AST et son code source sont générés par un Lexer. Avez-vous des exemples typiques? – ohe

+0

Tous ceux que je connais sont basés sur Java: ANTLR, Bison, JavaCC. Je ne sais pas à propos de Python. – duffymo

+0

Je veux dire, avez-vous des exemples typiques et simples d'implémentation grammaticale BNF/AST .. – ohe

2

Il y a plusieurs façons d'implémenter lexing/parsing, il s'agit vraiment d'identifier les patterns et comment ils s'emboîtent. Il y a quelques très bons paquets Python pour ce faire qui vont du python pur au code C enveloppé. Pyparsing en particulier a beaucoup d'excellents exemples. Une chose à noter, trouver un analyseur EBNF/BNF est un peu difficile - écrire un analyseur avec le code Python n'est pas terrible, mais c'est un peu plus loin de la grammaire brute qui pourrait être important pour vous.