Le plus souvent, dans un langage impératif à usage général - les points-virgules comme délimiteurs d'instructions sont soit requis, soit totalement interdits (par exemple C et Python).
Cependant, certaines langues, comme JavaScript, vous permettent de désactiver la délimitation de vos déclarations avec des points-virgules, au profit d'autres délimiteurs (comme une nouvelle ligne).
Quelles sont les décisions de conception derrière cela? Je comprends que les points-virgules sont essentiels lors de l'écriture de plusieurs instructions sur la même ligne, mais y a-t-il une autre raison pour les rendre obligatoires (sauf en suivant C)?
programming-languages
syntax
Aber Kled
la source
la source
I understand that semicolons are essential when writing multiple statements on the same line
- Dépend de la langue. Mon favori n'a pas de délimiteurs de ce type, l'instruction suivante commence lorsque tous les arguments de fonction ont été utilisés.}
ou à la fin du fichier).Réponses:
Les rendre obligatoires (ou les interdire complètement) réduit le nombre de cas d'angle, élimine une source potentielle de bogues obscurs et simplifie la conception du compilateur / interprète.
Les concepteurs de langage qui ont choisi de les rendre facultatifs ont choisi de vivre avec l'ambiguïté en échange d'une plus grande flexibilité syntaxique.
la source
JavaScript nous a montré que c'est une très mauvaise idée. Par exemple:
En C, cela renvoie une valeur de 0. En JavaScript, cela revient
undefined
car un point-virgule est inséré après l'instruction de retour, et il n'est pas immédiatement évident pourquoi votre code se casse, sauf si vous connaissez les détails de l'insertion automatique du point-virgule.la source
return
est l'un des rares cas où JavaScript insérera un point-virgule même si le programme serait valide sans lui. (Mais bien sûr, cela sape le point de Mason Wheeler. Le problème n'est pas que les points-virgules sont facultatifs, c'est que les règles ne sont pas cohérentes.)Il simplifie quelque peu votre grammaire et votre analyseur pour rendre les points-virgules obligatoires. Essentiellement, cela permet au lexer de vider tous les espaces, y compris les nouvelles lignes, et l'analyseur n'a pas à s'en soucier du tout.
D'un autre côté, une fois que vous commencez à vouloir parler à l'analyseur des espaces blancs, ce n'est pas si difficile de rendre les points-virgules facultatifs. Vous pouvez souvent les regrouper avec un
whitespace
jeton et votre analyseur peut très bien le gérer.Par exemple, essayez d'insérer les points-virgules dans la série d'instructions C suivante.
Bien qu'il y ait des choses étranges que vous ne pouvez plus faire, comme
while(1);
, pour la plupart, il est relativement facile avec les techniques d'analyse modernes de déterminer où se terminent les instructions sans délimiteur spécifique. Même si vous voulez toujours autoriser les trucs bizarres, ce n'est pas si difficile de faire unnewline_or_semicolon
non-terminal.la source
Les points-virgules sont utiles dans une grammaire pour 2 raisons. Tout d'abord, il vous permet de diviser de longues instructions en plusieurs lignes sans avoir de personnages de continuation (je parle de vous, Fortran et Basic). Deuxièmement, cela permet à l'analyseur d'avoir un moyen de "renoncer" à l'analyse lorsque la syntaxe est vraiment compliquée à cause d'une faute de frappe. Volant l'exemple de Karl Bielefeldt,
imaginez que vous avez tapé un paren ouvert supplémentaire:
maintenant où est l'erreur? Si vous aviez les points-virgules, il est plus facile pour l'analyseur d'abandonner au premier point-virgule. Il pourrait même continuer à analyser après le point-virgule s'il le voulait.
Il est désormais plus facile pour l'analyseur de signaler une erreur et de localiser plus facilement la ligne / colonne où elle s'est produite.
la source
Les points-virgules ne sont pas toujours tout ou rien comme vous le mentionnez dans votre question. Par exemple, la grammaire de Lua est soigneusement conçue pour être de forme libre (tous les espaces, y compris les retours à la ligne, peuvent être ignorés) mais aussi sans avoir besoin d'utiliser de point-virgule. Par exemple, les programmes suivants sont équivalents:
la source
Hormis la conception et la construction, je pense que beaucoup de programmeurs viennent d'horizons différents et certains ont appris à utiliser le point-virgule et d'autres non. Un grand nombre de nouvelles langues émergentes ne nécessitent pas de point-virgule mais permettent tout de même d'exister. Je pense que cela pourrait simplement être un moyen d'amener plus de programmeurs à apprendre à coder dans ces nouveaux langages sans avoir à renoncer à leurs habitudes depuis le début.
la source