J'essaie de comprendre la compilation et l'interprétation, étape par étape déterminant une image totale. Je suis donc venu à une question lors de la lecture http://www.cs.man.ac.uk/~pjj/farrell/comp3.html Cet article
Ça dit :
La prochaine étape du compilateur s'appelle l'analyseur. Cette partie du compilateur comprend une compréhension de la grammaire de la langue. Il est chargé d'identifier les erreurs de syntaxe et de la traduction d'un programme sans erreur dans des structures de données internes pouvant être interprétées ou écrites dans une autre langue.
Mais je ne pouvais pas comprendre comment le tokéniseur peut adhérer correctement le flux donné qui a l'erreur de syntaxe.
Il devrait être bloqué à là ou donner des informations erronées à l'analyseur. Je veux dire, ce n'est pas la tokénisation aussi une sorte de traducteur?
Alors, comment il vient de surmonter les lignes de code lexicales corrompues lors de la tokenision.
Il y a un exemple de jeton à l'intérieur du lien ci-dessus à le tobenizer .
Si je comprends bien, la forme du jeton semble, s'il y a quelque chose qui ne va pas dans le jeton de code serait aussi corrompu.
Pourriez-vous s'il vous plaît clarifier mon malentendu?
Un tokéniseur n'est qu'une optimisation d'analyses. Il est parfaitement possible de mettre en œuvre un analyseur sans jeton.
Un tokéniseur (ou lexer ou scanner) côtelettes l'entrée dans une liste de jetons. Certaines parties de la chaîne (commentaires, espaces) sont généralement ignorées. Chaque jeton a un type (la signification de cette chaîne dans la langue) et une valeur (la chaîne qui constitue le jeton). Par exemple, le PHP Source Snippet
$a + $b
pourrait être représenté par les jetons
Variable('$a'),
Plus('+'),
Variable('$b')
Le Tokenizer ne considère pas si un jeton est possible dans ce contexte. Par exemple, l'entrée
$a $b + +
produirait bonheur le flux de jeton
Variable('$a'),
Variable('$b'),
Plus('+'),
Plus('+')
Lorsque l'analyseur consomme ensuite ces jetons, il remarquera que deux variables ne peuvent pas se suivre mutuellement et ne peuvent ni deux opérateurs d'infixes. (Notez que d'autres langues ont des syntaxes différentes dans lesquelles un tel flux de jetons peut être légal, mais pas en PHP).
Un analyseur peut toujours échouer au stade du tokéniseur. Par exemple, il pourrait y avoir un caractère illégal:
$a × ½ — 3
A PHP tokenizer serait incapable de faire correspondre cette entrée à ses règles et produirait une erreur avant que l'analyse principale ne commence.
Plus formellement, des jetons sont utilisés lorsque chaque jeton peut être décrit comme une langue régulière. Les jetons peuvent ensuite être appariés de manière extrêmement efficace, éventuellement mise en œuvre comme une DFA. En revanche, la grammaire principale est généralement sans contexte et nécessite un algorithme d'analyse plus compliqué et moins performant tel que Lalr.
Vous auriez généralement Attendez-vous à ce que la plupart des erreurs de syntaxe proviennent de l'analyseur, pas de Lexer.
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 tokenized. Dans de nombreuses langues, toutefois, presque toute séquence de caractères peut être transformée en jetons de quelque sorte, alors les erreurs ici sont assez inhabituelles.
L'analyseur générera une erreur si l'entrée contient des jetons valides, mais ces jetons ne sont pas arrangés afin de former des déclarations/expressions valides dans la langue cible. C'est beaucoup plus courant en tant que règle.
Le tokéniseur divise simplement le flux de caractères dans des jetons. De Tokenizer POV, c'est complètement valide:
1 * * 1
et traduit à quelque chose comme: ["1", MULTIPLY, MULTIPLY, "1"]
Seul un analyseur peut rejeter de telles expressions - il sait que la multiplication opérateur ne peut pas suivre un autre opérateur multiplier. Par exemple dans JavaScript, cela produit:
Uncaught SyntaxError: Unexpected token *(…)
Il y a des erreurs qui pourraient être détectées par Tokenizer. Par exemple, les lignes de chaîne non finis: "abc
ou numéros invalides: 0x0abcdefg
. Ils pourraient encore être signalés comme des erreurs de syntaxe:
Uncaught SyntaxError: Unexpected token ILLEGAL
Notez Toutefois, le jeton n'a pas été reconnu et est rapporté comme ILLEGAL
.