You are on page 1of 3

Reglas BNF

Maracaibo, Noviembre 2011

Reglas BNF Cualquier lenguaje de programacin debe contemplar unas mnimas reglas gramaticales para su construccin. Partiremos de una serie de elementos del lenguaje en forma de smbolos que a su vez pueden llamar a otros smbolos. A estos les llamaremos metasmbolos y sern los siguientes: ::= Metasimbolo de definicin: Lo que est a la izquierda es igual que lo que est a la derecha. | Metasmbolo de alternativa: Indica que una variable puede tomar un valor u otro. [] Metasmbolo de Opcin: Indica que lo que est dentro se puede repetir 0 1 vez. {} Metasmbolo de repeticin: Indica que los elementos que estn dentro se pueden repetir 0 ms veces. () Metasmbolo de agrupacin: Sirve para agrupar los elementos con el mismo significado que en lgebra tradicional. Elemento no terminal: Cualquier elemento que necesita ser definido mediante la combinacin de los metasmbolos, junto con elementos terminales o incluso otros no terminales. Siempre se encuentran a la izquierda del metasimbolo de asignacin. Elemento terminal: Constituyen los elementos propios del lenguaje y siempre deben estar definidos en la parte derecha del metasimbolo de asignacin. Las reglas en notacin BNF que se muestran a continuacin formalizan los convenios sintcticos que hemos descrito hasta ahora informalmente. Debe entenderse que no es una gramtica completa de Prolog, ya que carece de muchas construcciones, algunas de las cuales veremos en los Apartados siguientes. Dado que el alfabeto del lenguaje incluye algunos smbolos terminales que coinciden con smbolos del metalenguaje BNF (como [ y ] ), seguimos aqu el convenio de entrecomillar a todos los smbolos terminales.

<programa> ::= <clausula>{<clausula>} <clausula> ::= <hecho>|<regla>|<consulta> <hecho> ::= <cabeza>"." <regla> ::= <cabeza> ":-"<cuerpo>"." <consulta> ::= <cuerpo>"." <cabeza> ::= <predicado> <cuerpo> ::= <literal>{","<literal>} <predicado> ::= <nombre>"("<termino>{","<termino>}")" <literal> ::= <predicado>| "not" <predicado> <funcion> ::= <nombre>"("<termino>{","<termino>}")" <termino> ::= <atomo>|<estructura> <atomo> ::= <cte_num>|<cte_simb>|<variable> <estructura> ::= <funcion>|<lista> <lista> ::= "[""]"|"["<atomo>{","<atomo>}"]"| ".""("<atomo>","<lista>")"| "["<atomo>{","<atomo>}"|"<lista>"]" <cte_num> ::= ["+"|"-"]<num> <num> ::= <entero>|<real> <entero> ::= <digito>{<digito>} <real> ::= <entero>"."<entero> <digito> ::= "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9" <cte_simb> ::= <nombre>|""<caracteres>"" <nombre> ::= <min>|{<alfanum>} <variable> ::= <may>{<alfanum>}|"_"{<alfanum>} <alfanum> ::= "_"|<min>|<may>|<digito> <caracteres> ::= <alfanum>|","|";"|"$"|... <min> ::= "a"|"b"|"c"|....|"z" <may> ::= "A"|"B"|"C"|....|"Z" Hemos definido separadamente <predicado> y <funcin> porque, como ya sabemos, semnticamente son diferentes, pero como aqu estamos definiendo la sintaxis hubiera sido ms correcto definirlas con una sola regla (y un nombre nico), ya que sintcticamente son la misma categora.

You might also like