2 votes

Syntaxe de règle de production de grammaire Java du manuel Oracle

J'ai un doute syntaxique concernant une règle de grammaire de programme Java mentionnée dans le manuel de spécification Java d'Oracle. Voici une approximation de cette règle, dans la mesure où les restrictions HTML de SO le permettent.

ArrayInitializer: { [VariableInitializerList] [,] } VariableInitializerList:   VariableInitializer {, VariableInitializer}

Cela est donné dans la section 2.4 du manuel Java. [x] désigne zéro ou une occurrence de x et {x} désigne zéro ou plusieurs.

Cependant, j'ai les doutes suivants :

  1. Pour le non-terminal ArrayInitializer, la première accolade { désigne une accolade terminale ou le sens syntaxique que j'ai mentionné ci-dessus.
  2. Aussi, pour le non-terminal VariableInitializerList, je sais que _{_, _VariableInitializer}_ signifie quelque chose d'équivalent à l'expression régulière (a,b)*, mais ce type de grammaire acceptera également une autre chaîne qui ne correspond pas réellement au critère, n'est-ce pas ?
  3. Je veux aussi confirmer si les crochets dans la première production désignent l'expression régulière ou des terminaux simples.

Je trouve cette spécification de grammaire confuse. Pouvez-vous m'aider à la comprendre ?

1voto

rici Points 45980

La spécification Java utilise des styles de police pour distinguer entre les caractères littéraux, tels qu'ils sont trouvés dans l'entrée, et les symboles grammaticaux (non-terminaux et opérateurs grammaticaux). Les littéraux sont affichés en largeur fixe, tandis que les symboles grammaticaux sont affichés en italique.

C'est une distinction assez subtile, en particulier pour certains symboles de ponctuation [Note 1]. Heureusement, la seule ponctuation utilisée comme opérateurs grammaticaux sont les crochets et les accolades, et ce n'est pas si difficile de voir si une accolade est penchée (italique) ou droite. L'accolade dans ArrayInitializer est droite, et le crochet est penché, tout comme l'accolade dans VariableInitializerList. Ainsi, l'accolade dans ArrayInitializer est un caractère littéral. Les crochets dans cette production indiquent que les symboles grammaticaux inclus sont facultatifs, et les accolades dans VariableInitializerList indiquent que les symboles inclus peuvent être répétés un nombre illimité de fois, y compris zéro. (C'est effectivement l'opérateur de Kleene *, qui, comme vous le dites, est utilisé dans les expressions régulières.)

J'espère que cela répond à vos questions (1) et (3). Je ne comprends pas vraiment votre question 2. Notez que la virgule dans VariableInitializer { , VariableInitializer } est un caractère littéral (il n'est pas en italique), donc ce qui est décrit est une liste non vide d'initialiseurs séparés par des virgules. Je ne sais pas pourquoi vous pensez que cela diffère des autres opérateurs de Kleene étoile.


Notes

  1. Il n'aide pas qu'un bug CSS affecte les exemples de la section 2.4, qui sont censés illustrer la grammaire. Le CSS force tout dans une "note" à être en italique, masquant ainsi la distinction entre les opérateurs grammaticaux et les caractères littéraux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X