Los diagramas de sintaxis (o diagramas de ferrocarril ) son una forma de representar una gramática libre de contexto . Representan una alternativa gráfica a la forma Backus–Naur , EBNF , la forma Backus–Naur aumentada y otras gramáticas basadas en texto como metalenguajes . Los primeros libros que utilizan diagramas de sintaxis incluyen el "Manual de usuario de Pascal" escrito por Niklaus Wirth [1] (los diagramas comienzan en la página 47) y el Manual CANDE de Burroughs. [2] En el campo de la compilación, las representaciones textuales como BNF o sus variantes suelen ser las preferidas. BNF está basado en texto y lo utilizan los escritores de compiladores y los generadores de analizadores sintácticos. Los diagramas de ferrocarril son visuales y pueden ser más fáciles de entender para los legos, a veces incorporados al diseño gráfico. La fuente canónica que define el formato de intercambio de datos JSON proporciona otro ejemplo de un uso moderno popular de estos diagramas.
La representación de una gramática es un conjunto de diagramas sintácticos. Cada diagrama define una etapa "no terminal" de un proceso. Existe un diagrama principal que define el lenguaje de la siguiente manera: para pertenecer al lenguaje, una palabra debe describir un camino en el diagrama principal.
Cada diagrama tiene un punto de entrada y un punto final. El diagrama describe posibles caminos entre estos dos puntos pasando por otros no terminales y terminales. Históricamente, los terminales se han representado con cajas redondas y los no terminales con cajas rectangulares, pero no existe un estándar oficial.
Utilizamos expresiones aritméticas como ejemplo, en varios formatos gramaticales.
BNF:
< expresión > ::= < término > | < término > "+" < expresión > < término > ::= < factor > | < factor > "*" < término > < factor > ::= < constante > | < variable > | "(" < expresión > ")" < variable > ::= "x" | "y" | "z" < constante > ::= < dígito > | < dígito > < constante > < dígito > ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
Número de serie EBNF:
expresión = término , [ "+" , expresión ]; término = factor , [ "*" , término ]; factor = constante | variable | "(" , expresión , ")" ; variable = "x" | "y" | "z" ; constante = dígito , { dígito }; dígito = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
ANF:
expresión = término [ "+" expresión ] término = factor [ "*" término ] factor = constante / variable / "(" expresión ")" variable = "x" / "y" / "z" constante = 1* dígito DÍGITO = "0" / "1" / "2 " / "3" / "4 " / "5 " / "6" / "7" / "8" / "9"
ABNF también admite rangos, por ejemplo , pero no se utiliza aquí por coherencia con los demás ejemplos.DIGIT = %x30-39
Rojo (lenguaje de programación) Analizar dialecto:
Rojo [ Título: "Analizar dialecto" ] expresión: [ término opt [ expresión "+" ]] término: [ factor opt [ término "*" ]] factor: [ constante | variable | "(" expresión ")" ] variable: [ "x" | "y" | "z" ] constante: [ algún dígito ] dígito: [ "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ]
Este formato también admite rangos, por ejemplo , pero no se utiliza aquí por coherencia con los demás ejemplos.digit: charset [#"0" - #"9"]
A continuación se muestra un posible diagrama de sintaxis para las gramáticas de ejemplo. Si bien la sintaxis de las gramáticas basadas en texto difiere, el diagrama de sintaxis para todas ellas puede ser el mismo porque se trata de un metalenguaje .
Nota: el primer enlace a veces está bloqueado por el servidor fuera de su dominio, pero está disponible en archive.org. El archivo también se reflejó en standardpascal.org.