La construction d'un analyseur (Partie I)
Je suis en train de faire mon propre basée sur javascript langage de programmation (ouais, c'est fou, mais c'est pour apprendre que... peut-être?). Eh bien, je suis en train de lire sur les analyseurs et la première étape est de convertir le code source de tokens, comme:
if(x > 5)
return true;
Tokenizer pour:
T_IF "if"
T_LPAREN "("
T_IDENTIFIER "x"
T_GT ">"
T_NUMBER "5"
T_RPAREN ")"
T_IDENTIFIER "return"
T_TRUE "true"
T_TERMINATOR ";"
Je ne sais pas si ma logique est correcte pour que de tout. Sur mon parser, c'est encore mieux (ou pas?) et traduire pour elle (ouais, tableau multidimensionnel):
T_IF "if"
T_EXPRESSION ...
T_IDENTIFIER "x"
T_GT ">"
T_NUMBER "5"
T_CLOSURE ...
T_IDENTIFIER "return"
T_TRUE "true"
J'ai quelques doutes:
- Est ma façon meilleure ou pire que la façon originale? Notez que mon code sera lu et compilé (traduit dans une autre langue, comme PHP), au lieu d'interpréter tout le temps.
- Après je tokenizer, ce que je dois faire exactement? Je suis vraiment perdu sur ce col!
- Il y a quelques bon tutoriel pour savoir comment je peux faire?
Bien, c'est que. Bye!
- Hey, en faisant un langage de programmation n'est pas fou. Beaucoup de gens ici font la même chose.
- Avez-vous essayé le Dragon-Book? Fondamentalement, ce que vous appelez passer de l'un est le lexer étape, suivie par le syntaxiques analyse de l'étape -> idéalement, la sortie d'une sorte d'AST (Abstract syntax Tree) que vous pouvez ensuite analyser sémantiquement (parse) ou de convertir dans votre langue cible
- Haha... Oui, le fou de la partie est qui est très complexe à un peuple le faire. Mais apprendre, c'est une très bonne chose, vraiment. Pour un usage professionnel, je suppose que c'besoin d'une équipe, il est fou de le faire seul. :p
Vous devez vous connecter pour publier un commentaire.
En général, vous voulez séparer les fonctions de la tokeniser (également appelé lexer) à d'autres étapes de votre compilateur ou l'interpréteur. La raison pour cela est la base de la modularité: chaque passage consomme le genre de chose (par exemple, les caractères) et en prépare un autre (par exemple, les jetons).
De sorte que vous avez converti vos personnages de jetons. Maintenant, vous voulez convertir votre appartement liste de jetons à des expressions imbriquées, et c'est ce qu'il est convenu d'appeler analyse. Pour JavaScript comme langage, vous devriez regarder dans récursive descente d'analyse. Pour l'analyse des expressions avec des opérateurs infixes de différents niveaux de priorité, Pratt analyse est très utile, et vous pouvez vous rabattre sur d'ordinaire descente récursive d'analyse pour les cas particuliers.
Juste pour vous donner un exemple plus concret basé sur votre cas, je vais supposer que vous pouvez écrire deux fonctions:
accept(token)
etexpect(token)
, qui, à tester la prochaine jeton dans le flux que vous avez créé. Vous allez faire une fonction pour chaque type d'instruction ou de l'expression de la grammaire d'une langue. Voici Pythonish pseudocode pour unstatement()
fonction, par exemple:Cela vous donne ce qu'on appelle un arbre de syntaxe abstraite (AST) de votre programme, que vous pouvez ensuite manipuler (optimisation et d'analyse), de sortie (compilation), ou à exécuter (interprétation).
La plupart des boîtes à outils diviser le processus en deux séparé pièces
Le tokenizer va diviser les données d'entrée en jetons. L'analyseur ne fonctionne que sur le jeton de "flux" et de construire la structure.
Votre question semble être axée sur le tokenizer. Mais votre deuxième solution mélanges de la grammaire de l'analyseur et le générateur de jetons en une seule étape. Théoriquement, cela est également possible, mais pour un débutant, il est beaucoup plus facile de le faire de la même manière que la plupart des autres outils/framework: gardez les étapes séparées.
À votre première solution: je voudrais marquer votre exemple, comme ceci:
Dans la plupart des langues mots-clés ne peut pas être utilisé comme méthode de noms, les noms de variable et ainsi de suite. Cela se reflète déjà sur le tokenizer niveau (
T_KEYWORD_IF
,T_KEYWORD_RET
,T_KEYWORD_TRUE
).Le prochain niveau de ces flux et par l'application d'une grammaire formelle - serait de construire certains discbased (souvent appelé AST - Arbre de Syntaxe Abstraite) qui pourrait ressembler à ceci:
La mise en œuvre de l'analyseur à la main est généralement fait par certains cadres. La mise en œuvre de quelque chose comme ça à la main et efficace est généralement effectué à l'université dans le cadre d'un semestre. Donc, vous devriez vraiment utiliser une sorte de cadre.
L'entrée pour une grammaire de l'analyseur cadre est généralement une grammaire formelle dans une sorte de BNF. Vos "si" partie mlgh ressembler à ceci:
C'est uniquement pour se faire une idée. L'analyse d'une realworld-langage comme Javascript correctement n'est pas une tâche facile. Mais drôle.
Quelle est la façon originale ? Il existe de nombreuses façons de mettre en œuvre les langues. Je pense que le vôtre est très bien fait, une fois, j'ai essayé de construire un langage de moi-même qui s'est traduit pour le C#, le hack langage de programmation. La langue de nombreux compilateurs traduire d'une langue intermédiaire, il est assez commun.
Après la segmentation, vous devez analyser il. Utiliser quelque chose de bon lexer /analyseur de cadre, comme la Coup de pouce.Esprit, ou Coco, ou quoi que ce soit. Il y a des centaines d'entre eux. Ou vous pouvez mettre en place votre propre lexer, mais cela prend du temps et des ressources. Il existe de nombreuses façons d'analyser le code, je généralement s'appuyer sur récursive descente d'analyse.
Ensuite, vous devez faire de la Génération de Code. C'est la partie la plus difficile à mon avis. Il existe des outils pour cela, mais vous pouvez le faire manuellement si vous le souhaitez, j'ai essayé de faire dans mon projet, mais il était assez basique et le buggy, il y a un code utile ici et ici.
Comme je l'ai suggéré précédemment, l'utilisation outils de le faire. Il y a beaucoup d'assez bonne bien documenté analyseur de cadres. Pour de plus amples informations, vous pouvez essayez de demander à certaines personnes qui connaissent ce genre de choses. @DeadMG , à la Salon C++ est la construction d'un langage de programmation appelé "Large". Vous pouvez essayer de consultation lui.
Disons que j'ai cette déclaration dans un langage de programmation:
L'analyseur lexical va le traduire en:
L'analyseur va ensuite prendre l'information (aka "Jeton de Flux") et de la mettre:
Je ne sais pas si cela va aider ou pas, mais j'espère qu'il ne.