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?
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
Tiene razón, una caja de bornes no es muy apropiada, así que cambié mi generador como corresponde. – Gunther
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