naur form example backus syntax grammar bnf ebnf

syntax - form - grammar c



BNF vs EBNF vs ABNF: ¿cuál elegir? (5)

Quiero proponer una sintaxis de lenguaje. He leído un poco acerca de estos tres, y realmente no puedo ver nada que uno pueda hacer que otro no pueda. ¿Hay alguna razón para usar uno sobre otro? ¿O es solo una cuestión de preferencia?


De acuerdo con Wikipedia, los literales de cadena con doble cita de ABNF no distinguen entre mayúsculas y minúsculas, y las coincidencias entre mayúsculas y minúsculas deben definirse como valores ASCII numéricos. Lo considero una desventaja.

El texto literal se especifica mediante el uso de una cadena entre comillas ( " ). Estas cadenas no distinguen entre mayúsculas y minúsculas y el conjunto de caracteres utilizado es (US-) ASCII. Por lo tanto, la cadena" abc "coincidirá con" abc "," Abc "," ABc "," abC "," ABc "," AbC "," aBC "y" ABC ". Para una coincidencia entre mayúsculas y minúsculas se deben definir los caracteres explícitos: para que coincida con" aBc ", la definición será %d97.66.99 .

https://en.wikipedia.org/wiki/Augmented_Backus%E2%80%93Naur_Form#Terminal_values

Sin embargo, RFC 7405 parece agregar literales de cadena que distinguen entre mayúsculas y minúsculas a ABNF.

https://tools.ietf.org/html/rfc7405


El EBNF es la versión extendida / más reciente de BNF, por lo que el problema se vuelve más simple: EBNF vs ABNF. No soy un experto, pero creo que debería depender de un idioma cuya sintaxis desee definir. También hay algunos visualizadores para EBNF ( http://www.google.co.il/search?sourceid=chrome&ie=UTF-8&q=Ebnf-Visualizer ), pero no vi ninguno para ABNF,


Puede lograr lo que quiera con cualquiera de ellos, pero cada uno es conciso y eficaz para representar su idioma, dependiendo de cuáles son las características en las que se compone su idioma.

He leído BNF , EBNF y ABNF de wikipedia y describí algunas diferencias y por qué EBNF y ABNF aparecieron en la imagen según BNF


Tienes que pensar en EBNF y ABNF como extensiones que te ayudan a ser más conciso y expresivo al desarrollar tus gramáticas.

Por ejemplo, piense en un símbolo no terminal opcional, en una gramática BNF lo definiría utilizando símbolos intermedios como:

A ::= OPTIONAL OTHER OPTIONAL ::= opt_part | epsilon

mientras que con EBNF puedes hacerlo directamente usando la sintaxis opcional:

A ::= [opt_part] OTHER

Entonces, como no hay forma de expresar precedencia en un BNF , debe usar símbolos siempre intermedios también para las opciones anidadas:

BNF A ::= B C B ::= a | b | c EBNF A ::= (a | b | c) C

Esto es cierto para muchos problemas de sintaxis que se permiten en una gramática EBNF o ABNF , gracias al azúcar sintáctico pero no con un BNF normal. ABNF extiende EBNF , permitiéndole hacer cosas más complicadas, como especificar cuánta aparición de un símbolo se puede encontrar al mismo tiempo (es decir, 4*DIGIT )

Por lo tanto, elegir un ABNF o un EBNF como el idioma elegido para su gramática facilitará su trabajo, ya que será más expresivo sin llenar su gramática con símbolos inútiles que su generador de analizadores generará de todos modos, pero no le importará. ¡ellos!