2011-02-01 12 views
5

Los diagramas de ferrocarril son un método popular para visualizar gramáticas libres de contexto y puede mapear el formulario Backus-Naur a estos diagramas. Pero some variants of BNF, por ejemplo W3C-BNF permite excepciones (ya que los idiomas libres de contexto no se cierran bajo diferencia, estas excepciones deben ser regulares). Me gustaría visualizar una gramática con excepciones en un diagrama de ferrocarril. ¿Debo inventar mi propia extensión a la notación gráfica o alguien ya experimentó con esto?¿Existe una extensión de los diagramas ferroviarios para capturar excepciones?

Aquí es un ejemplo de una regla con excepciones (sí, también se puede expresar esta gramática particular, sin excepción, pero eso no es el punto):

comment := "<!--" (string - "--") "-->" 

Una excepción puede ser cualquier gramática regular. Pensé en la adición de excepción conectado a símbolos no terminales por algún tipo especial de flecha o línea (en este caso se indica con un signo de exclamación):

[<] → [!] → [-] → [-] → (string) → [-] → [-] → [>] 
          ! 
          ! → [-] → [-] → ↯ 

PS: La gramática estaba mal, hay que

comment := "<!--" (string - (string "--" string | string "-")) "-->" 

¿Quizás el uso no intuitivo de la negación es una de las razones por las que se usa poco en las gramáticas formales?

Respuesta

4

Al escribir un Railroad Diagram Generator para gramáticas W3C recientemente, pensé por un tiempo cómo representar esto, pero no pude encontrar una solución con la que estuviera contento. No encontré ningún ejemplo a seguir tampoco.

No es solo el operador de diferencia de ajuste, para el cual no existe un equivalente gráfico en los diagramas de ferrocarril convencionales. La notación de puntos de código, rangos y complementos tampoco encaja bien.

Al final me abstuve de extender el modelo gráficamente. Lo que hice fue dibujar una caja de terminales para contener el fragmento de gramática que no tiene equivalente de ferrocarril en la notación original. Para distinguir esto de los cuadros literales, se establece en cursiva. Este es un ejemplo de la recomendación XML:

XML comment railroad diagram

La producción EBNF fue:

Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->' 

Editar:

Tras la propuesta de Jakob de una forma diferente, expresiones EBNF no resueltos son ahora se muestra en un hexágono:

enter image description here

+1

Interesante. Usaría cajas de diferentes formas para puntos de código y rangos. Las expresiones regulares simples también pueden colocarse en dicho cuadro. Entonces habría tres tipos de cajas: símbolos de terminal, símbolos no terminales y símbolos de patrón. Poner símbolos no terminales en estos cuadros de patrones como su "Char - '-'" es un compromiso que podría mejorarse. ¿Qué le parece dibujar un cuadro que contiene un patrón en forma de otros cuadros? – Jakob

+0

Tiene razón, una caja de bornes no es muy apropiada, así que cambié mi generador como corresponde. – Gunther

+0

Buena solución. Extendí esto a una caja de "diferencia". Con las diferencias puede escribir la gramática más legible, pero puede ser más difícil de analizar: http: // imgur.com/inAKK – Jakob

Cuestiones relacionadas