La notación de sintaxis de Wirth ( WSN ) es una metasintaxis , es decir, una forma formal de describir lenguajes formales . Originalmente propuesta por Niklaus Wirth en 1977 como una alternativa a la forma Backus–Naur (BNF). Tiene varias ventajas sobre la BNF, ya que contiene una construcción de iteración explícita y evita el uso de un símbolo explícito para la cadena vacía (como <empty> o ε). [1]
WSN se ha utilizado en varias normas internacionales , comenzando por ISO 10303-21 . [2] También se utilizó para definir la sintaxis de EXPRESS , el lenguaje de modelado de datos de STEP .
SINTAXIS = { PRODUCCIÓN } . PRODUCCIÓN = IDENTIFICADOR "=" EXPRESIÓN "." . EXPRESIÓN = TÉRMINO { "|" TÉRMINO } . TÉRMINO = FACTOR { FACTOR } . FACTOR = IDENTIFICADOR | LITERAL | "[" EXPRESIÓN "]" | "(" EXPRESIÓN ")" | "{" EXPRESIÓN "}" . IDENTIFICADOR = letra { letra } . LITERAL = """" carácter { carácter } """" .
El signo igual indica una producción. El elemento de la izquierda se define como la combinación de elementos de la derecha. Una producción termina con un punto.
Hoy damos por sentados estos conceptos, pero en 1977 eran novedosos e incluso controvertidos. Posteriormente, Wirth incorporó algunos de ellos (con una sintaxis y una notación diferentes) en la forma extendida de Backus-Naur .
Tenga en cuenta que letter
y character
no se definen. Esto se debe a que los caracteres numéricos (dígitos 0 a 9) pueden incluirse en ambas definiciones o excluirse de una, según el idioma que se esté definiendo, por ejemplo :
dígito = "0" | "1" | "2" | "3" | "4" | " 5" | "6" | "7" | "8" | "9" . mayúscula = "A" | "B" | … | "Y" | "Z" . minúscula = "a" | "b" | … | "y" | "z" . letra = mayúscula | minúscula .
Si character
continúa incluyendo digit
y otros caracteres ASCII imprimibles , entonces se aleja aún más de letter
, que se puede asumir que no incluye los caracteres numéricos ni ninguno de los caracteres especiales (no alfanuméricos ).
La sintaxis de BNF se puede representar con WSN de la siguiente manera, basándose en la traducción del propio ejemplo de BNF :
sintaxis = regla [ sintaxis ] . regla = opt-whitespace "<" nombre-regla ">" opt-whitespace "::=" opt-whitespace expresión fin-línea . opt-whitespace = { " " } . expresión = lista [ "|" expresión ] . fin-línea = opt-whitespace EOL | fin-línea fin-línea . lista = término [ opt-whitespace lista ] . término = literal | "<" nombre-regla ">" . literal = """" texto """" | "'" texto "'" .
Esta definición parece demasiado complicada porque el concepto de " espacio en blanco opcional " debe definirse explícitamente en BNF, pero está implícito en WSN. Incluso en este ejemplo, text
se deja sin definir, pero se supone que significa " ASCII-character { ASCII-character }
". ( EOL
también se deja sin definir). Observe cómo se ha utilizado el truco dos veces porque no se definió explícitamente."<" rule-name ">"
text
Uno de los problemas con BNF que ilustra este ejemplo es que al permitir el uso de caracteres de comillas simples y dobles para un literal
, existe un potencial adicional de error humano al intentar crear una sintaxis legible por máquina. Uno de los conceptos que migraron a las meta sintaxis posteriores fue la idea de que dar al usuario múltiples opciones hacía más difícil escribir analizadores para gramáticas definidas por la sintaxis, por lo que los lenguajes de programación en general se han vuelto más restrictivos en cuanto a cómo se define un literal entre comillas .
{{cite journal}}
: Requiere citar revista |journal=
( ayuda ) [ enlace roto ]