Pregunta

Me gustaría definir un conjunto de valores desordenados usando una forma de contexto ADMINT BACKUS-NAUR (EBNF) Gramática libre.Es fácil definir una lista de valores desordenados en EBNF, por ejemplo:

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

Sin embargo, estoy teniendo dudas que se puede hacer para un conjunto desordenado.

A continuación se presentan ejemplos de conjuntos de valores válidos y desordenados:

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

Si bien las listas inválidas serían:

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

o listas de longitud arbitraria.

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

¿Fue útil?

Solución

Usted puede Definir conjuntos desordenados en EBNF, pero solo al listar todas las enumeraciones posibles. Eso es poco práctico para los conjuntos más grandes que aproximadamente dos elementos.

El estándar - En la medida en que EBNF es Una notación estandarizada: le permite usar el inglés (o cualquier otro idioma con el que se sienta cómodo) para describir una secuencia que no es de otra manera se puede describir. Por ejemplo, el EBNF para EBNF incluye esta producción:

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

de manera similar, podrías escribir algo como:

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

o tal vez

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

No es mucho uso para construir un generador de analizador, pero podría ser útil para un lector humano que entiende el mismo idioma que usted.

Para los generadores de parser reales, una estrategia común es permitir cualquier lista, que puede incluir elementos repetidos y luego rechazar las listas inválidas durante el análisis semántico. (O incluso antes. No es un análisis difícil.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top