06
Nov
09

BNF extendido y el ANSI C

¿Qué es BNF?

BNF o “Backus-Naur Form” es una notación formal para describir un lenguaje, que fue desarrollada por John Backus –y adoptada y ligeramente modificada por Peter Naur– para describir la sintaxis del Lenguaje de Programación Algol 60.

BNF es usada para definir formalmente la gramática de un lenguaje (formal), de tal forma que no haya ambigüedad en cuanto a qué está permitido y qué no.

Es tal la precisión y no-ambigüedad de BNF que, dada una gramática BNF para un LP, se puede construir mecánicamente un Analizador Sintáctico para ese LP.

¿CÓMO FUNCIONA BNF?

Los Principios

BNF es una especie de juego matemático: se comienza con un símbolo llamado símbolo inicial o axioma y ciertas reglas dadas indican cómo se lo puede reemplazar. El lenguaje definido por la gramática BNF es, justamente, el conjunto de todas las cadenas que se pueden producir siguiendo estas reglas.

Estas reglas se denominan reglas de producción y tienen el siguiente formato:

símbolo := alternativa-1 | alternative-2 …

AHORA SI: BNF Y EL ANSI C

token: uno de palabraReservada identificador constante literalCadena operador carácterPuntuación

palabraReservada: una de auto break case char const default do double else enum float for if int long return short signed sizeof static struct switch typedef unsigned void while

identificador: noDígito | identificador noDígito | identificador dígito

constante: una de constanteEntera constanteReal constanteCarácter constanteEnumeración

constanteEntera: constanteDecimal sufijoEntero? |

constanteOctal sufijoEntero? | constanteHexadecimal sufijoEntero?

constanteDecimal: dígitoNoCero | constanteDecimal dígito

constanteOctal: 0 | constanteOctal dígitoOctal

constanteHexadecimal: 0x dígitoHexa | 0X dígitoHexa |

constanteHexadecimal dígitoHexa

dígitoNoCero: uno de 1 2 3 4 5 6 7 8 9

dígito: uno de 0 1 2 3 4 5 6 7 8 9

dígitoOctal: uno de 0 1 2 3 4 5 6 7

dígitoHexa: uno de 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

sufijoEntero: sufijoUnsigned sufijoLong? | sufijoLong sufijoUnsigned?

sufijoUnsigned: uno de u U

sufijoLong: uno de l L

constanteReal: constanteFraccionaria parteExponente? sufijoReal? | secuenciaDígitos parteExponente sufijoReal?

constanteFraccionaria: secuenciaDígitos? . secuenciaDígitos | secuenciaDígitos .

parteExponente: e signo? secuenciaDígitos | E signo? secuenciaDígitos

signo: uno de + –

secuenciaDígitos: dígito | secuenciaDígitos dígito

sufijoReal: uno de f F l L

constanteCarácter: carácter-c | secuenciaEscape

[ carácter-c: cualquiera excepto ‘ \ ]

secuenciaEscape: secuenciaEscapeSimple | secuenciaEscapeHexa

secuenciaEscapeSimple: uno de \’ \” \? \\ \a \n \t

secuenciaEscapeHexa: \x dígitoHexa | \x dígitoHexa dígitoHexa

constanteEnumeración: identificador

literalCadena: secuenciaCaracteres-s

secuenciaCaracteres-s: carácter-s | secuenciaCaracteres-s carácter-s

[ carácter-s: cualquiera excepto ” \ secuenciaEscape ]

operador: uno de [ ] ( ) . ++ * + – & ! sizeof / % < > <= >= == != && || ?:

= += *= ,

carácterPuntuación: uno de [ ] ( ) { } * , : = ;

Expresiones

expresión: expresiónAsignación | expresión , expresiónAsignación

expresiónAsignación: expresiónCondicional |

expresiónUnaria operadorAsignación expresiónAsignación

operadorAsignación: uno de = += *=

expresiónCondicional: expresiónOrLógico |

expresiónOrLógico ? expresión : expresiónCondicional

expresiónOrLógico: expresiónAndLógico |

expresiónOrLógico || expresiónAndLógico

expresiónAndLógico: expresiónIgualdad |

expresiónAndLógico && expresiónIgualdad

expresiónIgualdad: expresiónRelacional |

expresiónIgualdad == expresiónRelacional |

expresiónIgualdad != expresiónRelacional

expresiónRelacional: expresiónAditiva |

expresiónRelacional < expresiónAditiva |

expresiónRelacional > expresiónAditiva |

expresiónRelacional <= expresiónAditiva |

expresiónRelacional >= expresiónAditiva

expresiónAditiva: expresiónMultiplicativa |

expresiónAditiva + expresiónMultiplicativa |

expresiónAditivaexpresiónMultiplicativa

expresiónMultiplicativa: expresiónConversión |

expresiónMultiplicativa * expresiónConversión |

expresiónMultiplicativa / expresiónConversión |

expresiónMultiplicativa % expresiónConversión

expresiónConversión: expresiónUnaria | ( nombreTipo ) expresiónConversión

expresiónUnaria: expresiónSufijo | ++ expresiónUnaria |

operadorUnario expresiónConversión |

sizeof expresiónUnaria | sizeof ( nombreTipo )

operadorUnario: uno de & * + – !

expresiónSufijo: expresiónPrimaria | expresiónSufijo [ expresión ] |

expresiónSufijo ( listaArgumentos? ) |

expresiónSufijo . identificador | expresiónSufijo ++

listaArgumentos: expresiónAsignación |

listaArgumentos , expresiónAsignación

expresiónPrimaria: identificador | constante | literalCadena | ( expresión )

Expresiones Constantes

expresiónConstante: expresiónCondicional

Sentencias

sentencia: sentenciaEtiquetada | sentenciaCompuesta | sentenciaExpresión |

sentenciaSelección | sentenciaIteración | sentenciaSalto

sentenciaEtiquetada: case expresiónConstante : sentencia |

default : sentencia

sentenciaCompuesta: { listaDeclaraciones? listaSentencias? }

listaDeclaraciones: declaración | listaDeclaraciones declaración

listaSentencias: sentencia | listaSentencias sentencia

sentenciaExpresión: expresión? ;

sentenciaSelección: if ( expresión ) sentencia |

if ( expresión ) sentencia else sentencia |

switch ( expresión ) sentencia

sentenciaIteración: while ( expresión ) sentencia |

do sentencia while ( expresión ) ; |

for ( expresión? ; expresión? ; expresión? ) sentencia

sentenciaSalto: break ; | return expresión? ;

Anuncios

3 Responses to “BNF extendido y el ANSI C”


  1. abril 26, 2013 en 11:57 am

    Very nice post. I just stumbled upon your weblog and wanted
    to say that I have really enjoyed surfing around your blog posts.
    In any case I’ll be subscribing to your feed and I hope you write again very soon!

  2. abril 26, 2013 en 12:42 pm

    Hello There. I found your blog using msn. This is a very well written article.
    I will be sure to bookmark it and come back to read more of your useful info.
    Thanks for the post. I’ll certainly return.

  3. mayo 31, 2013 en 9:32 am

    Everything is very open with a precise explanation of the challenges.
    It was truly informative. Your site is useful.

    Thanks for sharing!


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


noviembre 2009
L M X J V S D
« Oct   Ene »
 1
2345678
9101112131415
16171819202122
23242526272829
30  

Blog Stats

  • 191,225 hits

A %d blogueros les gusta esto: