J'essaie de comprendre la compilation et l'interprétation, étape par étape pour trouver une image totale. J'ai donc posé une question en lisant http://www.cs.man.ac.uk/~pjj/farrell/comp3.html cet article
Ça dit :
La prochaine étape du compilateur est appelée l'analyseur. Cette partie du compilateur a une compréhension de la grammaire du langage. Il est chargé d'identifier les erreurs de syntaxe et de traduire un programme sans erreur en structures de données internes pouvant être interprétées ou écrites dans une autre langue.
Mais je n'ai pas pu comprendre comment le tokenizer peut correctement tokenize le flux donné qui a l'erreur de syntaxe.
Il doit y être collé ou donner des informations erronées à l'analyseur. Je veux dire, la tokenisation n'est-elle pas aussi une sorte de traducteur?
Alors, comment cela a-t-il surmonté les lignes de code lexicales corrompues lors de la tokenisation?
Il y a un exemple de jeton à l'intérieur du lien ci-dessus à l'en- tête The Tokenizer .
Si je comprends bien, la forme du jeton semble, s'il y a quelque chose de mal dans le jeton de code, il serait également corrompu.
Pourriez-vous clarifier mon malentendu?
and
ou&&
ou autre chose. C'est (principalement) séparé et différent de l'analyse. L'optimisation (le cas échéant) est un effet secondaire presque accidentel.Vous vous attendez généralement à ce que la plupart des erreurs de syntaxe proviennent de l'analyseur, pas du lexeur.
Le lexer générerait une erreur si (et surtout seulement si) il y a quelque chose dans l'entrée qui ne peut pas être symbolisé. Dans de nombreuses langues, cependant, presque toutes les séquences de caractères peuvent être transformées en jetons, les erreurs sont donc assez inhabituelles.
L'analyseur générera une erreur si l'entrée contient des jetons valides, mais ces jetons ne sont pas organisés de sorte qu'ils forment des instructions / expressions valides dans la langue cible. C'est beaucoup plus courant en règle générale.
la source
Tokenizer divise simplement le flux de caractères en jetons. Du tokenizer POV, cela est complètement valide:
et se traduit par quelque chose comme:
["1", MULTIPLY, MULTIPLY, "1"]
Seul l'analyseur peut rejeter de telles expressions - il sait que l'opérateur multiplier ne peut pas suivre un autre opérateur multiplier. Par exemple, en JavaScript, cela produit:Il y a des erreurs qui peuvent être détectées par le tokenizer. Par exemple littéraux de chaîne inachevées:
"abc
ou des numéros invalides:0x0abcdefg
. Ils peuvent néanmoins être signalés comme des erreurs de syntaxe:Notez cependant que le jeton n'a pas été reconnu et est signalé comme
ILLEGAL
.la source