Archivo para 22 noviembre 2009
Star size comparison
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ónAditiva – expresió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? ;
Comentarios recientes