Sintaxis y Semántica del Lenguaje. Gramáticas



Documentos relacionados
Conceptos básicos de programación. Arquitectura de Computadoras. Conceptos básicos de programación

Proposiciones Condicionales

APUNTES PARA LENGUAJES Y COMPILADORES

Repaso. Lenguajes formales

Lenguajes y Compiladores Aspectos Formales (Parte 1) Compiladores

Diagramas de Flujo Programación Estructurada. Diagramas de Flujo y Pseudocódigo

TEORÍA DE CONJUNTOS A ={ 1, 2, 3, 4, 5, 6 }

Algoritmos y Diagramas de flujo

Tema 3: Análisis sintáctico descendente. Cómo funciona el analizador sintáctico?

Teoría de Conjuntos y Conjuntos Numéricos

descripción del argumento identificador tipo longitud condición restricción

Conceptos fundamentales de Algoritmos

UNIDAD I. ALGORITMOS

Operando1 operador de relación Operando2

Compiladores: Parsing ascendente

Tema 3: Fundamentos de la Teoría de Gramáticas Formales

Tema 1.1. Un lenguaje mínimo y su procesador: Introducción

Etapas para la solución de un problema por medio del computador

f n = 0 si n = 0 (ER)

Introducción. Las gramáticas definen las reglas que definen a los lenguajes Las reglas pueden tener una diversa variedad de esquemas

PROGRAMACIÓN ALGORITMOS y DIAGRAMAS

INSTITUTO SUPERIOR DE FORMACIÓN TÉCNICA Nº 177

Tema 3.- Gramáticas formales

Procesadores de Lenguajes. Análisis sintáctico. Gramáticas libres de contexto

Clase adicional 2. Estructuras básicas de control. Temas

Lenguajes y Compiladores Aspectos Formales (Parte 2) Compiladores

Compiladores: Análisis Sintáctico. Pontificia Universidad Javeriana Cali Ingenieria de Sistemas y Computación Prof. Gloria Inés Alvarez V.

ÁRBOLES DE SINTAXIS. Los nodos no terminales (nodos interiores) están rotulados por los símbolos no terminales.

José A. Jiménez Nieto

Sistema electrónico digital (binario) que procesa datos siguiendo unas instrucciones almacenadas en su memoria.

TEMA 2: TEORÍA DE CONJUNTOS Y CONJUNTOS NUMÉRICOS.

Universidad Central Del Este U C E Facultad de Ciencias y Humanidades Escuela de Pedagogía Mención Informática

Capítulo 1. Algoritmos, diagramas de flujo y programas.

Expresión, Operador, Operando, Asignación, Prioridad

La Jerarquía de Chomsky

1. El sistema de los números reales

VALOR ABSOLUTO. Definición.- El valor absoluto de un número real, x, se define como:

Programación y matemática

A continuación estudiaremos a qué se refiere el término «programación», qué es un lenguaje de programación y veremos alguna terminología propia de

FUNCIONES. Definición de función. Ejemplos.

LENGUAJES Y GRAMÁTICAS

CONJUNTOS NUMÉRICOS Y APLICACIONES

Profesor: Rafa González Jiménez. Instituto Santa Eulalia ÍNDICE

Teoría de Autómatas y Lenguajes Formales. Capítulo 1: Introducción. Teoría de Autómatas y Lenguajes formales es un repaso a la informática teórica.

Compiladores. Análisis Sintáctico Ascendente. Adrian Ulises Mercado Martínez. Facultad de Ingeniería, UNAM. 5 de septiembre de 2013

Se utilizarán las letras mayúsculas, tales como A, B y C para nombrar conjuntos. Por ejemplo: a i. o e

Teoría de conjuntos. Tema 1: Teoría de Conjuntos.

TEORÍA DE AUTÓMATAS Y LENGUAJES FORMALES

INSTITUTO TECNOLÓGICO DE APIZACO TEORÍA DE CONJUNTOS CONJUNTOS Y TÉCNICAS DE CONTEO

Los Procesos Evolucionan con el Tiempo

Definición formal de autómatas finitos deterministas AFD

Fundamentos de Ciencias de la Computación Trabajo Práctico N 2 Lenguajes Libres del Contexto y Sensibles al Contexto Segundo Cuatrimestre de 2002

Construcción de una calculadora con Flex y Bison. Construcción de una calculadora con Flex y Bison. Índice (I)

µ-c: Manual de referencia del lenguaje Micro-C

Introducción a las sentencias de control

Capítulo 5 IDENTIFICADORES, VARIABLES Y CONSTANTES. Presentación resumen del libro: "EMPEZAR DE CERO A PROGRAMAR EN lenguaje C"

Programación Digital I

2. ENTIDADES PRIMITIVAS PARA EL DESARROLLO DE ALGORITMOS

Lógica Proposicional, Teoremas y Demostraciones

Tema 1 Introducción. 1.1 Qué es un lenguaje de programación. 1.2 Abstracciones en los lenguajes de programación Abstraccions de datos.

Sistemas de Ecuaciones Lineales

DEFINICIÓN DE LOS PROBLEMAS; IDENTIFICACIÓN DE LOS FACTORES Y LOS OBJETIVOS. UNIVERSIDAD EL BOSQUE. HÉCTOR IVÁN HURTATIS ESPINOSA.

MATEMÁTICAS BÁSICAS UNIVERSIDAD NACIONAL DE COLOMBIA - SEDE MEDELLÍN CLASE # 5

Ciencias de la Computación I

Un conjunto se considera como una colección de objetos, llamados miembros o elementos del conjunto. Existen dos formas de expresar un conjunto:

POTENCIAS. MÚLTIPLOS Y DIVISORES. MÁXIMO COMÚN DIVISOR Y MÍNIMO COMÚN MÚLTIPLO.

Colegio Beato Carlos Manuel Rodríguez Departamento de Matemáticas. Mapa curricular Algebra I 8 vo grado

CONJUNTOS. Consideremos, por ejemplo, los siguientes conjuntos:

3.3 Funciones crecientes y decrecientes y el criterio de la primera derivada

Tema 2: Introducción a los algoritmos

2.Teoría de Autómatas

Definición(2) La base (r) de un sistema de numeración especifica el número de dígitos o cardinal* de dicho conjunto ordenado. Las bases más utilizadas

Sus socios en ISO Manual de Calidad

UNIVERSIDAD INTERAMERICANA DE PUERTO RICO RECINTO METROPOLITANO

2. SISTEMAS DE ECUACIONES LINEALES. Introducción

TEMA 5. GRAMÁTICAS REGULARES.

Introducción a la Teoría de Automátas

Capítulo II Límites y Continuidad

Lógica y compuertas (Parte 2): Circuitos Combinacionales y Secuenciales

Introducción. Reglas para dibujar un diagramas de flujo.

16 Análisis sintáctico I

Una sucesión infinita es una función cuyo dominio es el conjunto de los enteros positivos. Podemos denotar una sucesión como una lista

Lógica de Predicados

Autómatas Finitos y Lenguajes Regulares

Proyecto Unico - Parte 1 - Solución

INTRODUCCIÓN A COMPILADORES Y LENGUAJES FORMALES LENGUAJES FORMALES

UNIDAD #1: CONJUNTOS NUMERICOS

Aspectos de los LP. Diseño de compiladores. Estático vs. Dinámico. Estático vs. Dinámico. Scope. Scope 24/03/2015

Capítulo E l ope r ad or r e s id uo E x pr e s ion e s b oole an as

Tema: Compilador Micro C

Módulo 5: Lenguaje Pascal

Jorge Bernal Prassanna Ravishankar Gemma Sánchez

Análisis de problemas

1. Algoritmo, Pseudocódigo, Diagramas de flujo.

CENTRO DE EDUCACIÓN MEDIA CURSO CERO. Departamento: Matemáticas y Física. Área Académica: Matemáticas. Nombre de la materia: Curso Cero

Los números enteros. > significa "mayor que". Ejemplo: 58 > 12 < significa "menor que". Ejemplo: 3 < 12 Cualquier número positivo siempre es mayor

Clase 25/09/2013 Tomado y editado de los apuntes de Pedro Sánchez Terraf

Ejemplo 1. Ejemplo introductorio

Programación Matemática. Profesor: Juan Pérez Retamales

Transcripción:

Gramáticas La tarea de proveer una descripción bien concisa y entendible de un lenguaje de programación es difícil pero esencial para el éxito de un lenguaje. Uno de los problemas en describir un lenguaje es la diversidad de gente que debe comprender esas descripciones. Las personas que implementan obviamente deben ser capaces de determinar cómo se forman las expresiones, sentencias y unidades de programas y también el orden de ejecución de los mismos. La dificultad del trabajo que tiene esta gente (los implementadores) está determinado en parte por la claridad y complejidad de las descripciones del lenguaje. La sintaxis de un lenguaje de programación describe la forma correcta en la cual las sentencias, expresiones y unidades de programa se deben escribir, mientras que la semántica denota el significado de esas sentencias, expresiones y unidades de programa. Por ejemplo la sintaxis de una sentencia Pascal if then es: if <condición> then <sentencia> La semántica de esta sentencia es que si el valor actual de la condición es verdadero, se ejecutará <sentencia>. Describir sintaxis es más fácil que describir semántica, ya que existen notaciones aceptadas universalmente para la descripción de sintaxis y no así de semánticas. En la definición de un lenguaje de programación la sintaxis usualmente se expresa en BNF (Backus- Naur Form) y la semántica está expresada en lenguaje natural (español, inglés, etc). BNF es un ejemplo de un metalenguaje, es decir, un lenguaje usado para definir otros lenguajes. Algol 60 fue el primer lenguaje que utilizó BNF para su descripción sintáctica. Una gramática consiste de un conjunto de no-terminales, terminales y una serie de reglas de producción. Un no-terminal está definido en una regla de producción, mientras que un terminal es un símbolo del lenguaje que se está definiendo. En una regla de producción el no-terminal (que aparece en la parte izquierda) está definido en términos de una secuencia de no-terminales y terminales (que se encuentran en la parte derecha ) Ejemplo: <dígito>::= 0123456789 <letra>::= abc xyz <identificador>::=<letra><identificador><dígito><identificador> <letra> En BNF, un no-terminal se escribe entre < >, el símbolo ::= significa se define como y el símbolo significa o. Estas reglas definen <dígitos> como uno de los símbolos 0, 1 al 9; <letra> como una letra minúscula e <identificador> se define como una única letra, un identificador seguido de una letra o un identificador seguido de un dígito. Así, el identificador ab1 puede ser derivado de <identificador>como sigue: 1

<identificador> <identificador><dígito> <identificador> <letra>><dígito> <letra><letra><dígito> a <letra><dígito> a b <dígito> a b 1 En cada etapa, el no-terminal de más a la izquierda es reemplazado por la parte derecha de una de sus reglas de producción, la secuencia de terminales y no-terminales producidos en cada etapa en una derivación se conoce como formas sentenciales. La forma sentencia final (que ya no contiene símbolos no-terminales) se conoce como una sentencia. La estructura de una derivación se muestra mejor en un árbol de derivación. El árbol de derivación que muestra cómo ab1 de <identificador> es: <identificador> <identificador> <dígito> <identificador> <letra> 1 <letra> b a Un lenguaje de programación completo se define comenzando con un símbolo noterminal tal como <programa>, conocido como start symbol (símbolo inicial) y desde el cual todos los posibles programas pueden ser derivados. En la práctica, los árboles de derivación se crean de dos formas posibles. En un esquema top-down, la sentencia requerida se deriva del símbolo inicial tal cual como hicimos en el ejemplo (ab1). En un esquema bottom-up, el punto de partida es la sentencia requerida, la cual es reducida al símbolo inicial reemplazando las partes derechas por sus correspondientes partes izquierdas de las reglas de producción. Ambos esquemas se utilizan en la fase de análisis sintáctico de muchos compiladores. Una gramática que define un lenguaje de programación tiene un número finito de reglas de producción, pero como las reglas de producción contienen recursión, es posible generar infinitos programas posibles. Ejemplo: <ident>::=<ident><dígito> Cuando se incluye recursión en las reglas de producción hay que tener cuidado. Hay que asegurarse que la recursión termine. Una regla de producción tal como la anterior se dice que es recursiva a izquierda. Existen definiciones similares pero recursivas a derecha. 2

Ambigüedad Un problema surge cuando se definen gramáticas ambiguas. Esto es, una gramática que permite diferentes interpretaciones para la misma sentencia. Ejemplo: Veamos la siguiente definición para la sentencia condicional if ::= if <condición> then <sent> if <condición> then <sent> else <sent> <sent>::= begin <sent> end La siguiente sentencia condicional tiene dos diferentes árboles de derivación: if <cond> then if <cond> then <sent> else <sent> árbol 1! if <cond> then <sent> if <cond> then <sent> else <sent> árbol 2 if <cond> then <sent> else <sent> if <cond> then <sent> Como hay dos interpretaciones, la gramática es ambigua. Una solución podría ser que la sentencia anterior se escriba: if <cond> then begin if <cond> then <sent> else <sent> end ó if <cond> then begin if <cond> then <sent> end else <sent> Dependiendo de la interpretación que se desee. Otra solución sería agregando un cierre del if (ya sea con un ; o con un endif) 3

Ejemplo: Gramática para una sentencia de asignación <asig>::= <id>:=<exp> <id>::= A B C D (también podría ser la definición de identificador anterior) <exp>::= <exp> + <exp> <exp> * <exp> <id> Qué pasa con esta gramática? Es correcta? Veamos el árbol de derivación de la siguiente sentencia. A:= B + C * D árbol 1 árbol 2 <asig> <id> := <exp> A <exp> + <exp> <id> <exp> * <exp> B <id> <id> C D <asig> <id> := <exp> A <exp> * <exp> <exp> + <exp> <id> <id> <id> D B C En general la ambiguedad sintáctica de las estructuras de un lenguaje es un problema, debido a que los compiladores basan la semántica de esas estructuras en su estructura sintáctica. Si una estructura del lenguaje tiene más de un árbol de derivación, entonces, el significado de la estructura no podría determinarse unívocamente. Cómo desambiguamos la gramática anterior? <asig>::= <id> := <exp> <id>::= A B C D <exp>::= <exp> + <término> <término> <término>::= <término> * <factor> <factor> 4

Ejercicio: Hacer el árbol de derivación para la expresión anterior para ver que es único. Pensar: Cómo se modificaría esta gramática para incluir paréntesis en las expresiones? Otras notaciones: Existen otras formas de describir gramáticas (otras notaciones). Por ejemplo, la siguiente sentencia: <exp>::= <exp> + <término> Se escribiría: exp exp + término Además, existe otra forma más gráfica de representar gramáticas que son diagramas sintácticos. Son utilizados por los lenguajes Pascal y Ada. La simbología es la siguiente: No-terminales Ejemplo: terminales El diagrama sintáctico para una expresión sería: exp término término + - término factor factor * factor identificador / 5

Ejercicio: Escribir una gramática para verificar la declaración de variables de un programa Pascal. Resolución: Básicamente la sentencia es: var a:integer; b,c:real; d:alumno; en gral puede ser una declaración o un conjunto separados por ;. Y una declaración puede ser un identificador o un conjunto separados por, : <declaración>::= var <lista-de-dcls> <lista-de-dcls>::= <unadeclaración> <unadeclaración>; <lista de-dcls> <unadeclaración>::= <lista-de-ident> : <tipo> <lista-de-ident>::= <ident> <ident>, <lista-de-ident> <ident>::= Se definió en la teoría!!! <tipo>::=..no hacerlo, en este caso para acá Las anteriores son sólo reglas de producción de la gramática. La gramática se compone además de reglas de: G={ N, T, P, S} donde: T = {var,,, ;, :, etc } N = { <declaración>, <lista de-dcls>, <unadeclaración>, <lista-de-ident>, <tipo>, <ident>} P = { <declaración>::= var <lista-de-dcls> <lista-de-dcls>::= <unadeclaración> <unadeclaración>; <lista-de-dcls> <unadeclaración>::= <lista-de-ident> : <tipo> <lista-de-ident>::= <ident> <ident>, <lista-de-ident> <ident>::= Se definió en la teoría!!! <tipo>::=..no hacerlo, en este caso para acá } S = {<declaración>} 6