Question

J'aimerais définir un ensemble de valeurs non ordonnées à l'aide d'une grammaire de contexte de formulaire de backus-naure étendu (EBNF).Il est facile de définir une liste non ordonnée de valeurs dans EBNF, par exemple:

value = 'A' | 'B' | 'C';
list = value, {',', value};

Cependant, j'ai des doutes, cela peut être fait pour un ensemble non ordonné.

Vous trouverez ci-dessous des exemples d'ensembles de valeurs non ordonnés valides:

A, B, C, D
A, B, D, C
A, D, C, B
...
D, C, B, A

tandis que les listes non valides seraient:

A, A, C, D
B, C, C, B
A, A, A, A
...

ou listes de longueur arbitraire.

A, A, B, C, D, A
A, B, C, D, A, B, C, D
...

Était-ce utile?

La solution

vous peut définir des ensembles non ordonnés dans EBNF, mais uniquement en répertoriant toutes les énumérations possibles. C'est peu pratique pour les ensembles supérieurs à environ deux éléments.

La norme - dans la mesure où Ebnf est Une notation standardisée - vous permet d'utiliser l'anglais (ou toute autre langue que vous vous sentez à l'aise) pour décrire une séquence qui n'est pas décrite autrement. Par exemple, l'EBNF pour EBNF inclut cette production:

syntactic exception
= ? a syntactic-factor that could be replaced 
    by a syntactic-factor containing no
    meta-identifiers
  ? ;

De même, vous pouvez écrire quelque chose comme:

value = 'A' | 'B' | 'C';
list = value, {',', value};
set = ? a "list" where all "value"s are unique ? ;

ou peut-être

set = ? a "list" with exactly three values
        where all "value"s are unique
      ? ;

Ce n'est pas très utile pour la construction d'un générateur d'analyseurs, mais il pourrait être utile pour un lecteur humain qui comprend la même langue que vous.

Pour les générateurs d'analyseurs réels, une stratégie commune consiste à autoriser n'importe quelle liste, qui pourrait inclure des éléments répétés, puis rejeter des listes non valides pendant une analyse sémantique. (Ou même plus tôt. Ce n'est pas une analyse difficile.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top