Você está na página 1de 63

Captulo 2.

Sintaxis de los Lenguajes de Programacin

Ral Jos Palma Mendoza

Captulo 2. Sintaxis de los Lenguajes de Programacin

A diferencia de los lenguajes naturales como el Espaol o el Ingls, los lenguajes de programacin de en ser precisos, su sinta!is " sem#ntica de en ser definidos sin am ig$edad% Para lograr esto los diseadores de lenguajes usan notaciones formales sint#cticas " sem#nticas%

Captulo 2. Sintaxis de los Lenguajes de Programacin


Por ejemplo, podr&amos definir la sinta!is de los nmeros naturales con la siguiente notacin'
digit ( )*) + ),) + )-) + ).) + )/) + )0) + )1) + )2) + )3) + )4) non5zero5digit ( ),) + )-) + ).) + )/) + )0) + )1) + )2) + )3) + )4) natural5num er ( non5zero5digit digit 6

7os d&gitos no son m#s 8ue s&m olos " les damos significado cuando decimos 8ue representan los nmeros naturales de cero a nue9e, o si decimos 8ue representan colores o la nota de una e9aluacin%

Captulo 2. Sintaxis de los Lenguajes de Programacin

En este cap&tulo nos concetraremos en la sinta!is de los lenguajes, especificamente en'

:mo especificar las reglas estructurales de un lenguaje de programacin% :mo el compilador identifica la estructura de un programa dado%

Para la primera tarea se usan e!presiones regulares " gram#ticas li res de conte!to, para la segunda est#n los esc#ners " los parsers%

2.1 Especificando La Sintaxis: Expresiones Regulares !ram"ticas Li#res de Contexto

;n conjunto de cadenas 8ue pueden se definido usando las siguientes tres reglas es llamado un conjunto regular o un lenguaje regular'

:oncatenacin Alternacin Repeticin

7os conjuntos regulares son generados por e!presiones regulares " son reconocidos por los esc#ners%

2.1 Especificando La Sintaxis: Expresiones Regulares !ram"ticas Li#res de Contexto

;n conjunto de cadenas 8ue pueden se definido usando las anteriores tres reglas m#s la recursin es llamado un 7enguaje 7i re de :onte!to <:=7>% 7os 7enguajes 7i res de :onte!to son generados por ?ram#ticas 7i res de :onte!to " reconocidos por los parsers%

2.1.1 $o%ens Regulares

Expresiones

7os to@ens 9ienen en 9arios tipos como' pala ras cla9e, identificadores, constantes de 9arios tipos, etc% Algunos tipos est#n formados por una sola cadena de caracteres <ej%' operador de incremento> " otros como el identificador 8ue est#n formados por un grupo de cadenas de caracteres 8ue tienen una forma comn <ej%' miAaria le>% El trmino to@en se usa para referirse tanto de forma genrica <ej%' identificador> como a un caso espec&fico <ej%' miAaria le>%

2.1.1 $o%ens Regulares

Expresiones

Ejemplo' El lenguaje : tiene m#s de ,** tipos de to@ens, entre ellos'


.2 pala ras cla9e <dou le, if, return, etc%>, identificadores <mi59aria le, sizeof, printf, etc%>, enteros <210, *!fd-.>, nmeros de comaBflotante <1%--.e/>, constantes de caracteres <)!), )C)), )C*,2*)>, literales de cadena <Dsner@D, EFola so" "oD>, 0/ puntuadores <G, H, BI, 6J, ', ++, etc%>%

2.1.1 $o%ens Regulares

Expresiones

Para especificar los to@ens usamos la notacin de las e!presiones regulares% ;na e!presin regular es cual8uiera de las siguientes'

;n caracter% 7a cadena 9ac&a, % Kos e!presiones regulares una despus de la otra <concatenacin>% Kos e!presiones regulares separadas por una arra 9ertical <alternacin>% ;na e!presin regular seguida de una estrella de Lleene <repeticin>%

2.1.1 $o%ens Regulares

Expresiones

Ejemplo' Minta!is de las constantes numricas aceptadas por una calculadora simple' num er ( integer + real integer ( digit digit 6 real ( integer e!ponent + decimal < e!ponent +) ) > decimal ( digit 6 < )%) digit + digit )%) > digit 6 e!ponent ( < )e) + )E) > < )G) + )B) +) ) > integer digit ( )*) + ),) + )-) + ).) + )/) + )0) + )1) + )2) + )3) + )4)

2.1.1 $o%ens Regulares

Expresiones

7os s&m olos a la iz8uierda de ( representan los nom res de las e!presiones regulares, el primero 8ue es Enum erD lo escojimos como nom re de to@en, el resto sir9e como a"uda para construir e!presiones m#s grandes% 7os parentesis se usan para e9itar am ig$edad con respecto al lugar donde termina un su e!presin e inicia otra% N ser9e 8ue la recursin no se utiliza, ni si8uiera de forma indirecta%

2.1.1 $o%ens Regulares

Expresiones

Asuntos de =ormato

Algunos lenguajes Facen diferencia entre ma"sculas " minsculas <ej%' Modula -O., : " sus descendientes> otros no <ej' Ada, Pascal, :ommon 7isp>% Algunos lenguajes slo permiten letras " d&gitos en sus identificadores <ej' Modula . " Mtandard Pascal>, otros permiten guiones ajos <Pascal> " otros una 9ariedad de s&m olos <:ommon 7isp>%

2.1.1 $o%ens Regulares

Expresiones

Asuntos de =ormato

7os lenguajes modernos est#n inclu"endo soporte para conjuntos de caracteres multi "te, asados generalemente los est#ndares ;nicode e IMNOIE: ,*1/1% MucFos permiten estos tipos de caracteres en cadenas " comentarios " cada 9ez tam in se est#n permitiendo tam in en los identificadores%

2.1.1 $o%ens Regulares

Expresiones

Asuntos de =ormato

MucFos de los lenguajes modernos son tam in de Eformato li reD es decir 8ue los programas son una secuencia simple de to@ens, lo 8ue importa es el orden de los mismos " no su posicin en una p#gina impresa% El Eespacio en lancoD entre to@ens es ignorado " slo se usa para separar un to@en del siguiente% Algunos lenguajes son e!cepcin a esta regla, algunos usan los saltos de l&nea para separar e!presiones <ej%' Aisual Pasic>% Para otros la indentacin es importante por ejemplo para determinar el cuerpo de un ciclo <ej' Qas@ell " PF"ton>%

2.1.2 !ram"ticas Li#res de Contexto

7as e!presiones regulares son uenas para definir to@ens, pero no pueden definir construcciones anidadas 8ue son centrales en los lenguajes de programacin, por ejemplo para definir la estructura de una e!presin aritmtica'
e!pr ( )id) + )num er) + )B) e!pr + )<) e!pr )>) + e!pr op e!pr op ( )G) + )B) + )6) + )O) Rota' Ro se usan los parntesis como metas&m olos%

2.1.2 !ram"ticas Li#res de Contexto

:ada una de las reglas de una gram#tica li re de conte!to se conoce como produccin% 7os s&m olos de la iz8uierda de una produccin se conoce como 9aria les o s&m olos no terminales% Puede Fa er cual8uier nmero de producciones para el mismo s&m olo no terminal% 7os s&m olos 8ue conforman las cadenas deri9adas de la gram#tica se conocen como s&m olos terminales <entre comillas simples ) )>%

2.1.2 !ram"ticas Li#res de Contexto

7os s&m olos terminales no pueden aparecer en el lado iz8uierdo de una produccin " son los to@ens del lenguaje 8ue defina la gram#tica li re de conte!to% ;no de los no terminales es llamado el s&m olo de inicio " nom ra a la construccin definida por toda la gram#tica% 7a notacin usada para e!presar las gram#ticas li res de conte!to es conocida como PR= <Pac@usBRaur =orm>%

2.1.2 !ram"ticas Li#res de Contexto

Nriginalmente la forma PR= no inclu&a la estrella de Lleene ni los parntesis para e9itar am ig$edades, al incluirlos en la notacin PR=, le llamaremos EPR= <E!tended PR=>% Por ejemplo podr&amos definir una lista de identificadores usando EPR= como' id5list () id) <),) )id)>6 8ue ser&a e8ui9alente a <en PR=>' id5list ( )id) id5list ( id5list ),) )id)

2.1.& 'eri(aciones Parseo


e!pr e!pr op e!pr e!pr op id e!pr G id e!pr op e!pr G id e!pr op id G id e!pr 6 id G id id 6 id G id

)r#oles de

Ejemplo' Keri9e la cadena Ependiente 6 ! G intereceptoD

<pediente> 6 <!> G <intercepto>

2.1.& 'eri(aciones Parseo

)r#oles de

;na deri9acin es una serie de reemplazos 8ue nos permiten concluir 8ue una cadena de terminales surge de un s&m olo de inicio siguiendo las producciones de una gram#tica li re de conte!to% :ada cadena de s&m olos en el camino es llamada Eforma sentencialD% 7a ltima forma sentencial 8ue consiste slo de terminales es llamada el producto de la deri9acin% En la deri9acin anterior se reemplaz el no terminal m#s a la derecFa, " por eso decimos 8ue fue una deri9acin m#s a la derecFa% Sam in se pudo Fa er FecFo una deri9acin m#s a la iz8uierda o seguido un efo8ue mezclado%

2.1.& 'eri(aciones Parseo

)r#oles de

2.1.& 'eri(aciones Parseo

)r#oles de

;samos un #r ol de parseo para representar gr#ficamente una deri9acin, la ra&z del #r ol es el s&m olo de inicio, sus Fojas son el producto " los nodos intermedios representan el uso de una produccin% E!isten infinitas gram#ticas li res de conte!to para un determinado lenguaje% Aun8ue algunas son m#s tiles 8ue otras, al disear un lenguaje de programacin se usca una 8ue refleje la estructura interna de los programas de forma 8ue sea til para el resto del compilador%

2.1.& 'eri(aciones Parseo

)r#oles de

;na gr#matica 8ue permite 8ue se genere m#s de un #r ol de parseo para una cadena de terminales se dice 8ue es am ig$a " esto genera pro lemas a la Fora de construir un parser <aun8ue mucFos parser las permiten>% Ejercicio' Kemostrar mediante un #r ol de parseo 8ue la gram#tica 8ue Femos definido para las e!presiones aritmticas es am ig$a%

2.1.& 'eri(aciones Parseo

)r#oles de

Ejemplo' Agregando producciones 8ue capturen la asociati9idad " la precedencia de los operadores podemos modificar la gram#tica anterior " con9ertirla en una gram#tica sin am ig$edades% e!pr ( term + e!pr add5op term term ( factor + term mult5op factor factor ( )id) + )num er) + )B) factor + )<) e!pr )>) add5op ( )G) + )B) mult5op ( )6) + )O)

2.1.& 'eri(aciones Parseo

)r#oles de

Ejemplo' ;n #r ol de parseo para la e!presin E.G/60D

2.1.& 'eri(aciones Parseo

)r#oles de

Ejercicio' :ree un #r ol de parseo para la e!presin E,* B / B .D%

2.2 Escaneo
Kadas las siguientes definiciones de to@ens, para un lenguaje simple de una calculadora'
assign ( )'J) plus ( )G) minus ( )B) times ( )6) di9 ( )O) lparen ( )<) rparen ( )>)

2.2 Escaneo
id ( letter <letter + digit>6 e!cept for read and Trite num er ( digit digit 6 + digit 6 <)%) digit + digit )%)> digit 6 comment ( )O6) <nonB6 + )6) nonBO>6 )6O) + )OO) <nonBneTline>6

N ser9emos 8ue en la definicin de id se Fan escrito dos to@ens 8ue son e!cepciones' EreadD " ETriteD% Adem#s por re9edad se us los to@ens EnonB6D, EnonBOD " EnonBneTlineD para referirse a todos los car#cteres 8ue no son el asterisco, la pleca " una nue9a linea respecti9amente% Aemos la ltima nue9a l&nea 8ue separa un comentario con )OO) de otra cosa, no se inclu"e como parte del to@en%

2.2 Escaneo

UVu mtodo usamos para reconocer los to@ens de nuestro lenguajeW A la primera respuesta a esta pregunta le llamamos opcin Ead FocD, por ser un softTare espec&fico para los to@ens de nuestro lenguaje% A continuacin mostraremos el pseudocdigo de un esc#ner de este tipo, 8ue despus de encontrar un to@en retorna al parser " cuando es in9ocado nue9amente usca un nue9o to@en usando los siguientes caracteres disponi les%

s@ip an" initial TFite space <spaces, ta s, and neTlines> if cur5cFar X)<), )>), )G), )B), )6)Y return tFe corresponding singleBcFaracter to@en if cur5cFar J )') read tFe ne!t cFaracter if it is )J) tFen return assign else announce an error if cur5cFar J )O) pee@ at tFe ne!t cFaracter if it is )6) or )O)
read additional cFars until Z6OZ or neTline is seen, respecti9el"

jump ac@ to top of code else return di9 <continua en la siguiente diapositi9a %%%>

if cur5cFar J % read tFe ne!t cFaracter if it is a digit read an" additional digits return num er else announce an error if cur5cFar is a digit read an" additional digits and at most one decimal point return num er else announce an error

2.2 Escaneo
Ejemplo' 7a capacidad de anidar comentarios puede ser uena para el programador <para comentar temporalmente grandes porciones de cdigo>, pero la ma"or&a de los esc#ners no reconocen estructuras anidadas% Por esto en :GG " en :44, no se permite anidar comentarios del mismo estilo, pero si se permite anidarlos con estilos diferentes <anidar EOOD dentro de EO6 [ 6OD " 9ice9ersa>% Aun8ue se recomienda mejor usar la compilacin condicional <\if>%

2.2 Escaneo

7a regla del to@en m#s largo, implica 8ue es cada in9ocacin del esc#ner se tratar# de leer el to@en de ma"or longitud posi le, por ejemplo en un lenguaje como : se leer# un to@en com E.%,/,1D " nunca como E.D, luego E%D " despus E,/,1D%

2.2 Escaneo

?eneralmente los compiladores de produccin usan esc#ners Ead FocD pues el cdigo es m#s compacto " eficiente% Aun8ue durante el desarrollo es preferi le construir un esc#ner de una forma m#s estructurada como una representacin e!pl&cita de un autmata finito% 7os autmatas finitos puede ser creados autom#ticamente de un conjunto de e!presiones regulares <facilitando los cam ios>%

Ejemplo de un autmata finito para los to@ens del lenguaje de calculadora definidos <continua en la siguiente diapositi9a%%%>

7os estados finales donde se reconoce el to@en tiene un do le c&rculo%

2.2.1 !enerando un *utmata +inito

Aun8ue podemos generar un autmata a mano, es m#s comn Facerlo autom#ticamente a partir de un conjunto de e!presiones regulares usando una Ferramienta de softTare% AFora 9eremos el proceso manual% El autmata de la figura anterior es determinista <A=K>, no Fa" am ig$edad en lo 8ue tiene 8ue Facer, por8ue en un estado dado con un car#cter de entrada dado nunca Fa" m#s de una posi le transicin <un arco o arista con la misma eti8ueta>%

2.2.1 !enerando un *utmata +inito

El proceso de generacin sigue tres pasos, el primero consiste en con9ertir las e!presiones regulares en un autmata no determinista <A=RK> 8ue se diferencia de un A=K en 8ue'

Puede Fa er m#s de una transicin desde un estado a otro eti8uetada con el mismo car#cter% Pueden e!istir transiciones EepsilonD, eti8uetadas con ED%

2.2.1 !enerando un *utmata +inito

Kecimos 8ue el A=RK acepta un to@en si e!iste un camino desde el estado inicial Fasta el final en el cual sus transiciones no epsilon, lle9an como eti8uetas los caracteres del to@en en orden% Para e9itar la necesidad de Facer una s8ueda entre todos los caminos por uno 8ue funcione, el siguiente paso consiste en con9ertir el A=RK en un A=K, " el tercer paso consiste en optimizar el A=K para 8ue tenga el menor nmero de estados posi le%

2.2.1 !enerando un *utmata +inito

;na e!presin regular 8ue consiste en un simple car#cter es e8ui9alente al A=K de ilustrado en la parte <a> de la siguiente figura% Ke la misma forma una e!presin regular compuesta por la cadena 9ac&a se muestra como un A=RK de dos estados unidos por una transicin epsilon% En las partes < >, <c> " <d> se muestran los A=RK 8ue se generan a partir de la concatenacin, la alternacin " la cerradura de Lleene, respecti9amente%

2.2.1 !enerando un *utmata +inito


Ejemplo' :onsideremos la creacin de un A=K para el to@en EdecimalD, 8ue Fa iamos definido como' decimal ( digit 6 <)%) digit + digit )%)> digit 6 En las ilustraciones a continuacin, usamos EdD para referirnos a la e!presin regular EdigitD, por re9edad%

2.2.1 !enerando un *utmata +inito

2.2.1 !enerando un *utmata +inito

2.2.1 !enerando un *utmata +inito

El segundo paso consiste en o tener un A=K% Para transformar el A=RK en un A=K usaremos una contruccin llamada Econjunto de su conjuntosD, la idea cla9e es 8ue un estado del A=K represente un grupo de estados a los 8ue el A=RK 8ue pudo Fa er llegado a partir del mismo car#cter en la entrada% Al inicio antes de consumir cual8uier entrada el A=RK podr&a estar en el estado , o podr&a Facer transiciones epsilon a los estados -, /, 0 o 3% Por esta razn creamos un estado A en el A=K 8ue represente este conjunto%

2.2.1 !enerando un *utmata +inito

En una entrada de EdD nuestro A=RK podr&a mo9erse del estado - al . o del 3 al 4 " del estado . podr&a Facer transiciones epsilon a los estados -, /, 0 u 3, por esta razn sea crea el estado P como lo muestra la ilustracin a continuacin% Kesde el estado A, con un E%D, nuestro A=RK podr&a mo9erse del estado 0 al 1, no Fa" m#s transiciones posi les con este car#cter desde ninguno de los estados de A ni tampoco transiciones epsilon desde el estado 1, por lo 8ue creamos el estado : en el A=K slo con el estado 1%

2.2.1 !enerando un *utmata +inito

Regresando al estado P, con un EdD podr&amos mo9ernos del estado - al . o del estado 3 al 4% Pero al llegar al . podr&amos Facer transiciones epsilon a los estados -,/,0,u 3 " como todos estos estados est#n en P creamos un ciclo desde P Facia P en el A=K% Miempre en P, con un E%D podr&amos mo9ernos del estado 0 al 1 o del 4 al ,* " luego desde ,* al ,,,,- " ,/ a tra9s de transiciones epsilon% Por eso creamos el estado K segn la ilustracin%

2.2.1 !enerando un *utmata +inito

El estado K se marca como final por8ue contiene el estado ,/ 8ue es final el A=RK% :ontinuando de este modo se crean tam in los estados finales E, = " ? mostrados en la ilustracin 8ue contienen todos al estado ,/ del A=RK " por tanto son marcados como finales% RNSA' 7a imagen original en el li ro contiene un error, el estado ? del A=K no de e contener al estado ,, del A=RK% El error "a est# corregido en la imagen a continuacin%

2.2.1 !enerando un *utmata +inito

En el ejemplo anterior el A=K termina siendo m#s pe8ueo 8ue el A=RK, esto es por8ue el lenguaje regular usado es mu" simple% En teor&a, el nmero de estados en el A=K podr&a se e!ponencial al nmero de estados en el A=RK, pero este e!tremo no es comn en la pr#ctica%

2.2.1 !enerando un *utmata +inito

El tercer paso en el proceso es la minizacin del A=K, proceso en el 8ue por cuestiones de tiempo " espacio no profundizaremos%

2.2.1 !enerando un *utmata +inito

En el ejemplo anterior construimos un autmata 8ue es capaz de reconocer un slo to@en' EdecimalD% Para construir un esc#ner para un lenguaje con n diferentes tipos de to@ens, iniciamos con un A=RK como el 8ue se 9e en la ilustracin a continuacin% Kados los A=RK llamados Mi, , ]J i ]J n <uno para cada to@en>, creamos un nue9o estado inicial con transiciones epsilon Facia los n estados iniciales de los A=RK%

2.2.1 !enerando un *utmata +inito

En contraste con la alternacin no creamos un estado final, mantenemos los 8ue "a est#n, cada uno eti8uetado para el to@en del cu#l es final% 7uego con9ertimos el A=RK resultante en un A=K de la misma forma 8ue "a lo Ficimos, tomando en cuenta 8ue si los estados finales de diferentes to@ens se mezclan en el A=K, es por 8ue tenemos definiciones de to@ens am iguas%

2.2.1 !enerando un *utmata +inito

2.2.1 !enerando un *utmata +inito

=inalmente, al Facer la minimizacin iniciamos con n G , clases de e8ui9alencia, una clase para todos los estados no finales " n clases para los n diferentes estados finales 8ue e!isten%

2.2.2 Cdigo del Esc"ner

Podemos implementar un esc#ner a partir del A=K usando dos mtodos principales' El primero consiste en usar enunciados sTitcFs anidados 8ue imiten la estructura del A=K% Este es generalmente el mtodo usado cuando se programa a mano% A continuacin mostramos la estructura de esc#ner programado de esta forma%

state 'J , BB start state loop read cur5cFar case state of , ' case cur5cFar of ) ), )Ct), )Cn) ' %%% )a) %%% )z) ' %%% )*) %%% )4) ' %%% )I) ' %%% %%% - ' case cur5cFar of %%% %%% n' case cur5cFar of %%%

2.2.2 Cdigo del Esc"ner

En el cdigo anterior el enunciado sTitcF e!terior cu re los estados del autmata " los enunciados interiores cu ren las transiciones entre los estados% 7a ma"or&a de stos simplemente esta lecen un nue9o estado " algunos retornan del esc#ner con el to@en actual <si el ltimo car#cter le&do no forma parte del to@en se coloca de nue9o en el flujo de entrada antes de retornar>%

2.2.2 Cdigo del Esc"ner

El segundo mtodo para implementar un esc#ner consiste en crear una ta la " un dri9er para la ta la% ^ste mtodo es preferido por la Ferramientas 8ue generan esc#ners autom#ticamente, pues es m#s f#cil de generar para un programa 8ue generar cdigo% Ej%' ;ni! le!Ofle!% Por cuestiones de tiempo " espacio no aFondaremos en detalles so re este mtodo%

2.2.2 Cdigo del Esc"ner

E!isten dos aspectos del cdigo 8ue usualmente se des9&an de la formalidad de un autmata finito' el primero es el manejo de la pala ras cla9e " el segundo es la necesidad de o ser9ar Facia adelante cuando un to@en puede ser e!tendido por dos o m#s caracteres, no slo por uno <prefijo no tri9ial>% :on respecto al primer aspecto, es posi le crear un autmata finito 8ue diferencia entre pala ras cla9e e identificadores, pero esto implicar agregar mucFos estados%

2.2.2 Cdigo del Esc"ner

7a ma"or&a de los esc#ners tratan a las pala ras cla9e como e!cepciones a la regla de los identificadores, antes de retornar un identificador al parser, el esc#ner re9isa en una ta la si en realidad no se trata de una pala ra cla9e% Para e!plicar el segundo aspecto enunciamos un ejemplo a continuacin%

2.2.2 Cdigo del Esc"ner


Ejemplo' En el lenguaje : se da el pro lema del prefijo no tri9ial, con el manejo de los caracteres punto E%D, pues stos forman en s& mismos un to@en o pueden formar parte de otro como un nmero real % Muponiendo 8ue el esc#ner Fa recientemente le&do un E.D " luego encuentra un E%D necesita o ser9ar los caracteres siguientes para distinguir entre .%,/ <un slo to@en>, .%foo <tres to@ens' ., % " foo, sint#cticamente in9#lidos pero to@ens> o por ejemplo .%%%foo <cinco to@ens sint#cticamente in9#lidos, nue9amente>%

Você também pode gostar