El lenguaje de programación JKL

Documentos relacionados
Gramaticas Independientes del Contexto, ejemplos y ejercicios

Conceptos básicos sobre gramáticas

Principios de Computadoras II

Analizador Léxico. Programación II Margarita Álvarez. Analizador Léxico - Funciones

Componentes Básicos. InCo. InCo Componentes Básicos 1 / 28

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

Análisis léxico. Formalización y desarrollo. Procesadores de Lenguajes. Ingeniería Técnica superior de Ingeniería Informática

Diseño de Compiladores I. Estructura General de un Compilador

Procesamiento de Lenguajes (PL) Curso 2015/2016. Práctica 5: traductor a código m2r

El lenguaje C. 1. Identificadores, constantes y variables

Objetivos Que el estudiante logre conocer, comprender y manejar conceptos y técnicas vinculados con el Analizador Léxico, para lo cual debe:

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Comprender las diferencias entre tipos de datos primitivos similares, y aprender a elegir el tipo más conveniente en cada caso.

Curso de Programación Avanzada en C

Resolución de Problemas y Algoritmos

Introducción a los compiladores

Compiladores: Análisis Léxico. Pontificia Universidad Javeriana Cali Ingeniería de Sistemas y Computación Prof. Gloria Inés Alvarez V.

Lección 2 Introducción al lenguaje C

Sintaxis de C Ing. Jose Maria Sola Dr. Oscar Ricardo Bruno

Tema 1 INTRODUCCIÓN A LOS LENGUAJES DE PROGRAMACIÓN

Asumiremos que se dispone de procedimientos para leer y escribir caracteres. Se desarrollan algunas funciones primitivas que nos serán útiles.

Elementos de un programa en C

ANÁLISIS LÉXICO Ing. Ronald Rentería Ayquipa

Elementos léxicos del lenguaje de programación C

Informática. JavaScript: Lenguaje de programación. Fco J. Martín Mateos Carmen Graciani

Tema 2.- Expresiones y funciones

3. Conceptos elementales de programación 1. léxico. cadenas literales: cualquier cosa dentro de una línea

Apunte Laboratorio ALPI - El lenguaje de programación Pascal

Informática General 2016 Cátedra: Valeria Drelichman, Pedro Paleo, Leonardo Nadel, Norma Morales

PHP: Lenguaje de programación

Introducción a la Programación

YACC (Yet Another Compiler Compiler) LALR(1) Parser Generator

Módulo. = Asignación = = Comp. de igualdad!= Com. de desigualdad <= Comp. menor o igual >= Comp. mayor o igual AND lógico OR lógica.

Estructuras de Control. Secuencia y Selección

Unidad III Análisis Léxico. M.C. Juan Carlos Olivares Rojas

JavaScript Básico. Elementos Básicos: Comentarios: Literales: Valores que puede tomar una variable o una constante.

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

GRAMÁTICAS LIBRES DE CONTEXTO

Generación de Código Intermedio

Tema 2: Análisis léxico

Lenguajes y Compiladores Aspectos Formales (Parte 2) Compiladores

Algunos ejercicios sobre modelado sintáctico en exámenes de Compiladores e intérpretes

UNIVERSIDAD NACIONAL DE EDUCACIÓN A DISTANCIA Escuela Técnica Superior de Ingeniería Informática Procesadores de Lenguajes. Tema 2.

Compiladores e Intérpretes Análisis Léxico

FUNDAMENTOS DE OBJECT PASCAL

Tema 2. Concepto de Algoritmo

COMPILADORES E INTERPRETES

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

GLOSARIO 1. Qué es bit y byte? Bit: Es la unidad mínima de información. Puede ser 0 o 1. Byte: Es el conjunto de 8 bits. Ejemplo:

Compiladores e intérpretes Análisis Léxico I. Análisis Léxico I

16 Análisis sintáctico I

Primer Parcial. Programación 1 Instituto de Computación Año 2017

JavaScript: Lenguaje de programación

Analizador De léxico. V A R i : I N T E G E R ; \n...

abril de 2017 Desarrollo de aplicaciones en Java Tipos de datos primitivos Tipos de datos Elementos de aplicaciones simples

LENGUAJE. Tema 2 Elementos de un programa

1. ESTRUCTURA DE UN PROGRAMA PASCAL Todo programa escrito en lenguaje Pascal, del más simple al más complejo, tiene la siguiente estructura:

Elementos léxicos del lenguaje de programación Java

ANÁLISIS SINTÁCTICO I GRAMÁTICAS

Estructuras de Control. Secuencia y Selección

Constantes. Las constantes no cambian durante la ejecucion de un programa en C++, en C++ existen 4 tipos de constantes:

Unidad II: Análisis semántico

Esquemas repetitivos en Fortran 90. Esquemas repetitivos en Fortran 90. Esquemas repetitivos en Fortran 90. Tipos de Esquema

Controla el flujo de tokens reconocidos por parte del analizador léxico. 4.2 Introduccion a las gramaticas libres de contexto y arboles de derivacion

CONCEPTOS BASICOS DEL LENGUAJE JAVA

Introducción a Python. Cecilia Manzino

Características de JavaScript

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

Tema 05: Elementos de un programa en C

PRÁCTICA DE PROCESADORES DE LENGUAJE EVALUACIÓN ORDINARIA CURSO 2009/2010 OBJETIVO DE LA PRÁCTICA

Es un lenguaje estructurado, tiene una abundante cantidad de operadores y tipos de datos.

EXPRESIONES Y OPERADORES

Definición de la sintaxis (1) Definición de la sintaxis (2) Definición de la sintaxis (3)

Esquemas repetitivos en Fortran 90

Un calculadora avanzada... y algo más!

UNIVERSIDAD DE SEVILLA PRÁCTICAS DE LABORATORIO ANÁLISIS LÉXICO (1) LENGUAJES FORMALES Y AUTÓMATAS CURSO 2006/2007

Introducción a PL/SQL

Tema 2. Tipos predefinidos

Sintaxis básica, variables y 7pos

Manual de referencia del lenguaje Micro-C

Tema 2: Análisis léxico

Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C

Tema II: Introducción al Lenguaje Funcional

Dra. Jessica Andrea Carballido

Trabajo Práctico Nº 4 Iteración

Funcionamiento del A.L.

Tipos de datos y Operadores Básicos

Estatutos de Control C# Estatutos de Decisión (Selección)

Manual de turbo pascal

TEMA 2. LENGUAJE C. CONCEPTOS BÁSICOS Y PROGRAMACIÓN ELEMENTAL.

GUIA EXAMEN FINAL/EXTRAORDINARIO

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS

Lenguaje de programación C. Introducción

Bison. Introducción. Índice. Introducción Uso de Bison con Flex. Formato del fichero de especificación de Bison

Lenguajes y Gramáticas

Sintaxis básica, variables y 7pos

Programación en Lenguaje C

Exterior del algoritmo. Entorno. Usuario. Procesador. Escribir. v1 v2 v3. Leer. <acción> {; <acción>}

Licenciatura de Matemáticas Informática I Notación algorítmica - Descripción BNF

Transcripción:

El lenguaje de programación JKL Copyright 2006 JosuKa Díaz Labrador Facultad de Ingeniería, Universidad de Deusto, Bilbao, España Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved. [versión 1.0, 2006-02-20, JosuKa] 1. Referencia del lenguaje JKL 1a. Léxico Los identificadores (id) siguen el criterio habitual (solo letras y dígitos, empezando por letra); mayúsculas y minúsculas son distintas. Las palabras reservadas son: program, var if, then, else, while, do, for, to, downto, begin, read, write, writec, writeln and, or, not y también mayúsculas y minúsculas son distintas. Las constantes literales enteras (num) son una secuencia de dígitos (al menos uno). Existen constantes literales de tipo cadena (cad), que se escriben usando comillas dobles (por ejemplo, "abc" o ""; dentro de las comillas no se admiten ni tabuladores ni cambios de línea ni comillas). Diversas cadenas de signos especiales representan operadores o símbolos de puntuación: + - * / % < > <= >= = <> := ( ) ;. Finalmente, los blancos separan distintos tokens, al igual que cambios de línea y tabuladores. Los comentarios comienzan con la secuencia // y se extien hasta el final de la línea. 1b. Gramática La notación que utilizaremos para describir la gramática es la reflejada en la siguiente tabla: Variable indica que es una variable o no terminal reservada se trata de un terminal (unidad léxica) x lexema entre comillas simples; se trata de un terminal [ x ] significa que x es opcional x* cero o más ocurrencias de x x+ una o más ocurrencias de x separa las alternativas Un programa está compuesto por una lista (quizá vacía) de declaraciones de variables y por una sentencia compuesta como cuerpo: prog program id ; decl * sentc. decl var id ; sentc begin sent * Las sentencias que se admiten en el lenguaje JKL son similares a las de PASCAL: El lenguaje de programación JKL 1 [versión 1.0, 2006-02-20, JosuKa]

sent ; id := expr ; sentc read id ; write expr ; writec cad ; writeln ; if expr then sent [ else sent ] while expr do sent do sent while expr ; for id := expr to expr do sent for id := expr downto expr do sent Sin embargo, se sigue la norma de C de que cada sentencia esté terminada en ; y se admite la sentencia vacía (primera regla de sent ). Una expresión es una constante literal (num), una variable (id), otra expresión entre paréntesis o la aplicación de operadores binarios o unarios a otras expresiones. Sólo existe un tipo de datos: enteros. La precedencia de los operadores (de mayor a menor) viene dada por la siguiente tabla: Nombre token Operador Semántica op_not op_adit not + - (unarios) negación lógica, signo, cambio de signo op_mult * / % producto, división, resto de la divisón op_adit + - (binarios) suma, resta op_rel < <= ==!= >= > comparaciones op_and and and lógico op_or or or lógico sio la asociatividad de izquierda a derecha para los operadores binarios. La parte de gramática que refleja lo anterior con recursividad por la izquierda es: expr eand expr op_or eand eand erel eand op_and erel erel arit erel op_rel arit arit term arit op_adit term term fact term op_mult fact fact rando op_not fact op_adit fact rando num id ( expr ) El lenguaje de programación JKL 2 [versión 1.0, 2006-02-20, JosuKa]

En un programa en el lenguaje JKL todas las variables son globales. Aparte de eso, todo identificador debe ser declarado antes de ser usado, y es obvio que no se admite dos veces el mismo nombre en distintas declaraciones. Las sentencias if-then, if-then-else, while, do y for tienen la semántica usual de lenguajes como PASCAL o C. Por otro lado, las operaciones de entrada/salida en el lenguaje JKL se realizan mediante sentencias especiales: read id : lee un entero de la entrada estándar y lo asigna a la variable id; write expr : escribe el entero resultado de evaluar expr en la salida estándar; writec cad : escribe la cadena literal cad en la salida estándar; writeln 1c. Ejemplo: prog1.jkl : escribe un salto de línea en la salida estándar. // Comentario: programa de prueba // (solo para comprobar la sintaxis) program prueba; var i; begin i := 128; writec "Valor de i: "; writec "Valor de i: "; if -12 <= +15 and not -13 <> +27 then i := -27; ;;;; begin ;;; if i <= 2 then i := 27; else i := 28; while i < 5 do ; while i < 5 do i := 7; while i < 5 do begin i := 5; do ; while i < 6; do while i < 8; do begin i := i + 7; while i < 10; for i := i + 5 to i - 7 do ; for i := (i + 5) * 22 to i - 7 do for i := (i + 5) * 22 to i - 7 do begin for i := i + 5 downto i - 7 do ; for i := (i + 5) * 22 downto i - 7 do for i := (i + 5) * 22 downto i - 7 do begin El lenguaje de programación JKL 3 [versión 1.0, 2006-02-20, JosuKa]

. for i := (i + 5) * 22 downto i - 7 do begin ;;; if i <= 2 then i := 27; else begin while i < 5 do ; while i < 5 do i := 7; while i < 5 do begin i := 5; do ; while i < 6; do while i < 8; do begin i := i + 7; while i < 10; for i := i + 5 to i - 7 do ; for i := (i + 5) * 22 to i - 7 do for i := (i + 5) * 22 to i - 7 do begin for i := i + 5 downto i - 7 do ; for i := (i + 5) * 22 downto i - 7 do for i := (i + 5) * 22 downto i - 7 do begin // El programa tiene que acabar con un punto 1d. Ejemplo: fact.jkl // Programa de prueba: factorial iterativo program factorial; var i; var res; begin writec "Escriba un número: "; writec "Valor de i: "; writec "Se va a calcular el factorial"; res := 1; while i >= 1 do begin res := res * i; i := i - 1; writec "Resultado: "; write res;. El lenguaje de programación JKL 4 [versión 1.0, 2006-02-20, JosuKa]

2. Análisis sintáctico descente 2a. Gramática: 1 prog -> PPROG ID P_COMA decl sentc PUNTO 2 decl -> lambda 3 PVAR ID P_COMA decl 4 sentc -> PBEGIN lsent PEND 5 lsent -> lambda 6 sent lsent 7 sent -> P_COMA 8 ID ASIGN expr P_COMA 9 sentc 10 PREAD ID P_COMA 11 PWRITE expr P_COMA 12 PWRITC CAD P_COMA 13 PWRITL P_COMA 14 PIF expr PTHEN sent pelse 15 PWHILE expr PDO sent 16 PDO sent PWHILE expr P_COMA 17 PFORP ID ASIGN expr PTODO expr PDO sent 18 pelse -> lambda 19 PELSE sent 20 expr -> eand exprp 21 exprp -> lambda 22 OP_OR eand exprp 23 eand -> erel eandp 24 eandp -> lambda 25 OP_AND erel eandp 26 erel -> arit erelp 27 erelp -> lambda 28 OP_REL arit erelp 29 arit -> term aritp 30 aritp -> lambda 31 OP_ADIT term aritp 32 term -> fact termp 33 termp -> lambda 34 OP_MULT fact termp 35 fact -> OP_NOT fact 36 OP_ADIT fact 37 rando 38 rando -> NUM 39 ID 40 PAR_ABR expr PAR_CER 2b. PRIMERO prog -> PPROG decl -> lambda, PVAR sentc -> PBEGIN lsent -> lambda, P_COMA, ID, PBEGIN, PREAD, PWRITE, PWRITC, PWRITL, PIF, PWHILE, PDO, PFORP sent -> P_COMA, ID, PBEGIN, PREAD, PWRITE, PWRITC, PWRITL, PIF, PWHILE, PDO, PFORP pelse -> lambda, PELSE expr -> OP_NOT, OP_ADIT, NUM, ID, PAR_ABR exprp -> lambda, OP_OR eand -> OP_NOT, OP_ADIT, NUM, ID, PAR_ABR eandp -> lambda, OP_AND erel -> OP_NOT, OP_ADIT, NUM, ID, PAR_ABR erelp -> lambda, OP_REL arit -> OP_NOT, OP_ADIT, NUM, ID, PAR_ABR aritp -> lambda, OP_ADIT El lenguaje de programación JKL 5 [versión 1.0, 2006-02-20, JosuKa]

term -> OP_NOT, OP_ADIT, NUM, ID, PAR_ABR termp -> lambda, OP_MULT fact -> OP_NOT, OP_ADIT, NUM, ID, PAR_ABR rando -> NUM, ID, PAR_ABR 2c. SIGUIENTE prog -> DOLAR decl -> PBEGIN sentc -> PUNTO, P_COMA, ID, PBEGIN, PREAD, PWRITE, PWRITC, PWRITL, PIF, PWHILE, PDO, PFORP, PEND, PELSE lsent -> PEND sent -> P_COMA, ID, PBEGIN, PREAD, PWRITE, PWRITC, PWRITL, PIF, PWHILE, PDO, PFORP, PEND, PELSE pelse -> P_COMA, ID, PBEGIN, PREAD, PWRITE, PWRITC, PWRITL, PIF, PWHILE, PDO, PFORP, PEND, PELSE expr -> P_COMA, PTHEN, PDO, PTODO, PAR_CER exprp -> P_COMA, PTHEN, PDO, PTODO, PAR_CER eand -> OP_OR, P_COMA, PTHEN, PDO, PTODO, PAR_CER eandp -> OP_OR, P_COMA, PTHEN, PDO, PTODO, PAR_CER erel -> OP_AND, OP_OR, P_COMA, PTHEN, PDO, PTODO, PAR_CER erelp -> OP_AND, OP_OR, P_COMA, PTHEN, PDO, PTODO, PAR_CER arit -> OP_REL, OP_AND, OP_OR, P_COMA, PTHEN, PDO, PTODO, PAR_CER aritp -> OP_REL, OP_AND, OP_OR, P_COMA, PTHEN, PDO, PTODO, PAR_CER term -> OP_ADIT, OP_REL, OP_AND, OP_OR, P_COMA, PTHEN, PDO, PTODO, PAR_CER termp -> OP_ADIT, OP_REL, OP_AND, OP_OR, P_COMA, PTHEN, PDO, PTODO, PAR_CER fact -> OP_MULT, OP_ADIT, OP_REL, OP_AND, OP_OR, P_COMA, PTHEN, PDO, PTODO, PAR_CER rando -> OP_MULT, OP_ADIT, OP_REL, OP_AND, OP_OR, P_COMA, PTHEN, PDO, PTODO, PAR_CER 2d. Tabla LL(1) prog -> [PPROG]1 decl -> [PBEGIN]2, [PVAR]3 sentc -> [PBEGIN]4 lsent -> [PEND]5, [P_COMA, ID, PBEGIN, PREAD, PWRITE, PWRITC, PWRITL, PIF, PWHILE, PDO, PFORP]6 sent -> [P_COMA]7, [ID]8, [PBEGIN]9, [PREAD]10, [PWRITE]11, [PWRITC]12, [PWRITL]13, [PIF]14, [PWHILE]15, [PDO]16, [PFORP]17 pelse -> [P_COMA, ID, PBEGIN, PREAD, PWRITE, PWRITC, PWRITL, PIF, PWHILE, PDO, PFORP, PEND, PELSE*]18, [PELSE]19 expr -> [OP_NOT, OP_ADIT, NUM, ID, PAR_ABR]20 exprp -> [P_COMA, PTHEN, PDO, PTODO, PAR_CER]21, [OP_OR]22 eand -> [OP_NOT, OP_ADIT, NUM, ID, PAR_ABR]23 eandp -> [OP_OR, P_COMA, PTHEN, PDO, PTODO, PAR_CER]24, [OP_AND]25 erel -> [OP_NOT, OP_ADIT, NUM, ID, PAR_ABR]26 erelp -> [OP_AND, OP_OR, P_COMA, PTHEN, PDO, PTODO, PAR_CER]27, [OP_REL]28 arit -> [OP_NOT, OP_ADIT, NUM, ID, PAR_ABR]29 aritp -> [OP_REL, OP_AND, OP_OR, P_COMA, PTHEN, PDO, PTODO, PAR_CER]30, [OP_ADIT]31 term -> [OP_NOT, OP_ADIT, NUM, ID, PAR_ABR]32 termp -> [OP_ADIT, OP_REL, OP_AND, OP_OR, P_COMA, PTHEN, PDO, PTODO, PAR_CER]33, [OP_MULT]34 fact -> [OP_NOT]35, [OP_ADIT]36, [NUM, ID, PAR_ABR]37 rando -> [NUM]38, [ID]39, [PAR_ABR]40 * El conflicto por la ambigüedad del ELSE se resuelve quitando la regla 18 de la casilla ELSE. El lenguaje de programación JKL 6 [versión 1.0, 2006-02-20, JosuKa]