Está en la página 1de 17

UNIVERSIDAD NACIONAL DE SAN ANTONIO ABAD

DE CUSCO
Facultad de Ingeniería Electrónica, Eléctrica Mecánica e Informática

Escuela Profesional de Ingeniería Informática y de Sistemas

TEMA: COMPILADOR PARA EL LENGUAJE JAVASCRIPT EN


ESPAÑOL

Asignatura : Construcción de Compiladores

Docente : Ing. José Luis Soncco Álvarez

Integrante :

➔ Quispe Condori, Margot 150405


➔ Llamacponcca Chuquihuayta, Sintia 141006

SEMESTRE 2020- I

CUSCO - PERÚ

1
INTRODUCCIÓN

Un compilador es un programa que lee un programa escrito en un lenguaje fuente, y


lo traduce a un programa equivalente en otro lenguaje, el lenguaje objetivo. Como
parte importante de este proceso de traducción, el compilador informa al usuario de
la presencia de errores en el programa fuente.

La implementación de un compilador de JavaScript en español, constituye tres fases


de análisis: Análisis léxico, análisis sintáctico y finalmente el análisis semántico.
En esta etapa del proyecto nos centramos en la construcción de un analizador
léxico. Para el desarrollo utilizaremos dos herramientas de trabajo, el generador de
analizadores léxicos (Flex), que recibirá una especificación de patrones y acciones
para generar código en C que pueda ser compilado y obtener un ejecutable y Bison
genera nuestro analizador sintáctico o parser que también genera código en c.

Además se realizará 5 programas que pasarán por el analizador léxico para su


revisión, después de haber pasado exitosamente la prueba de análisis léxico, se
procederá a traducirlo a su correspondiente versión en inglés.

2
CONTENIDO

INTRODUCCIÓN 2
1. Léxico del lenguaje de programación JavaScript 4
a. Tipos de datos: 4
b. Variables Válidas 4
c. Delimitadores 4
d. Palabras reservadas 4
e. Operadores 4
f. Primitivas 4
g. Comentarios 5
2. Ejemplo de la construcciones del lenguaje con una sintaxis válida 6
Tabla 3. Segunda Sintaxis Válida 7
Tabla 4. Tercera Sintaxis Válida 7
3. Errores de tipo semántico en JavaScript 8
4. Analizador léxico (en FLEX) de JavaScript 10
5. Crear un programa que permita traducir un programa escrito en español en JavaScript
a su versión en Inglés. Para realizar las pruebas realizar 5 programas en JavaScript 11
6. Recomendaciones 17

3
COMPILADOR PARA JAVASCRIPT EN ESPAÑOL

1. Léxico del lenguaje de programación JavaScript


a. Tipos de datos:

En Javascript se pueden manejar varios tipos de datos: números,


textos, booleanos, etc. Estos pueden ser escritos directamente, o
almacenados en variables.

Las variables se declaran por medio de la palabra clave var, pero a


diferencia de otros lenguajes de programación en JavaScript no es
necesario declarar su tipo. Unas líneas como éstas:

var a = 15; esto es un tipo de dato numérico


var b = "gato"; este es un tipo de dato cadena

b. Variables Válidas

Una variable válida, acepta letras [a-zA-Z0-9] letras combinados con


números(siempre y cuando el nombre de la variable empiece en una o varias
letras).

c. Delimitadores

Está conformado por los siguientes lexemas: . ; { } ( ) :

d. Palabras reservadas

Está conformado por los siguiente lexemas(caso_contrario, para, si,


en, nuevo, regreso, variable, mientras, con ,tratar, esto, cambiar,
descanso, captura, caso, eliminar, hacer, funcion,importar)

e. Operadores

Está conformado por + - === < >, etc

f. Primitivas

Esta formado por los siguientes lexemas (alerta, documento, escribir,


escribir_lineal, aredondeo,aexponente, ingresar).

4
g. Comentarios
Formado por los siguientes lexemas (// /* */)

Token Lista de lexemas Equivalencia de lexemas


en español en Inglés

a. Booleano ➢ verdadero ➢ true


➢ falso ➢ false
➢ 1 ➢ 1
➢ 0 ➢ 0

Numeral ➢ 23.34 ➢ 23.34


➢ 4 ➢ 4
➢ 0 ➢ 0
➢ 245e8 ➢ 245e8

Cadena ➢ “dddd” ➢ “dddd”


➢ ”shh78” ➢ ”shh78”
➢ ”s” ➢ ”s”
b. var_valida ➢ abchd ➢ abchd
➢ variable1 ➢ variable1

c. Delimitador ➢ . ➢ .
➢ ; ➢ ;
➢ : ➢ :
➢ { ➢ {
➢ } ➢ }
➢ ( ➢ (
➢ ) ➢ )

d. Reservadas ➢ caso_contrario ➢ else


➢ para ➢ for
➢ si ➢ if
➢ en ➢ in
➢ nuevo ➢ new
➢ regreso ➢ return
➢ variable ➢ var
➢ mientras ➢ while
➢ con ➢ with
➢ tratar ➢ try
➢ esto ➢ this
➢ cambiar ➢ switch
➢ descanso ➢ break
➢ captura ➢ catch
➢ caso ➢ case
➢ eliminar ➢ delete
➢ hacer ➢ do
➢ funcion ➢ function
➢ importar ➢ import.

e. operadores ➢ + ➢ +

5
➢ * ➢ *
➢ - ➢ -
➢ % ➢ %
➢ / ➢ /
➢ ** ➢ **
➢ < ➢ <
➢ > ➢ >
➢ & ➢ &
➢ | ➢ |
➢ <= ➢ <=
➢ >= ➢ >=
➢ === ➢ ===
➢ < ➢ <
➢ > ➢ >
➢ ++ ➢ ++
➢ -- ➢ --

f. primitivas ➢ alerta ➢ alert


➢ consola ➢ console
➢ iniciar ➢ log
➢ documento ➢ document
➢ escribir ➢ write
➢ escribir_lineal ➢ writeln
➢ aredondeo ➢ toFixed
➢ aexponente ➢ toExponencial
➢ ingresar ➢ prompt
➢ matematicas ➢ maths
➢ absoluto ➢ abs

g. comentario ➢ // ➢ //
➢ /* ➢ /*
➢ */ ➢ */

Tabla 1. Tokens y lista de Lexemas para el léxico de JavaScript

2. Ejemplo de la construcciones del lenguaje con una sintaxis válida

Inglés Español

var y; variable y;
var x; variable x;
var sumas; variable suma;
function suma(){ funcion suma(){
y = 1; //asignamos valor y = 1; //asignamos valor
x = 2; x = 2;
sumas=x+y; suma=x+y;
} }
suma(); x();
console.log(sumas); consola.iniciar(suma);

Tabla 2. Primera Sintaxis válida

6
Inglés Español

var y=8; variable y=8;


if(y%2===0){ si(y%2===0){
//imprimir respuesta //imprimir respuesta
console.log(suma); consola.iniciar(suma);
} }

Tabla 3. Segunda Sintaxis Válida

Inglés Español

function confirmar() funcion confirmar()


{ {
return console.log("Te digo retornar consola.iniciar("Te digo
buenas noches"); buenas noches");
} }
confirmar(); confirmar();

Tabla 4. Tercera Sintaxis Válida

Inglés Español

function ingresar() funcion ingresar()


{ {
var nombre; variable nombre;
nombre= prompt("ingresa tu nombre= ingresar("ingresa tu
nombre"); nombre");
console.log("Te digo buenas consola.iniciar("Te digo buenas
noches "+nombre); noches "+nombre);
document.write("Hola en el documento.escribir("Hola en el
navegador "+nombre) navegador "+nombre)
}ingresar(); }ingresar();

Tabla 5. Cuarta Sintaxis Válida

7
3. Errores de tipo semántico en JavaScript

● Uso de una variable no inicializada o definida.

Imagen 1. Primer Error Semántico

● Utilizar argumentos negativos en un método de exponenciación

Imagen 2. Segundo Error Semántico

8
● Uso de un argumento fuera de rango para un método de redondeo.

Imagen 3. Primer Error Semántico

● Colocar un nombre invalido para una función o variable, no se puede


iniciar un nombre de variable con números, lo que sí es correcto es
que la variable puede contener número.

Imagen 4. Primer Error Semántico

9
4. Analizador léxico (en FLEX) de JavaScript

Tabla 6. Programa analizador léxico en Flex para JavaScript

10
5. Crear un programa que permita traducir un programa escrito en
español en JavaScript a su versión en Inglés. Para realizar las
pruebas realizar 5 programas en JavaScript
El programa en Flex que se ha creado para la traducción es el siguiente:

/* Programa que traduce un un programa en JavaScript a su version en


INGLES */

/* Sección DEFINICIONES */
%{
#include <stdio.h>
int lineas=1;
%}
/* Sección REGLAS */
%%
[ \t]+ { printf(" "); }
"verdadero" { printf("true"); }
"falso" { printf("false"); }
"si" { printf("if"); }
"caso_contrario" { printf("else"); }
"nuevo" { printf("new"); }
"variable" { printf("var"); }
"para" { printf("for"); }
"mientras" { printf("while"); }
"tratar" { printf("try"); }
"esto" { printf("this") ; }
"cambiar" { printf("switch"); }
"captura" { printf("catch"); }
"caso" { printf("case"); }
"eliminar" { printf("delete"); }
"en" { printf("in"); }
"regreso" { printf("back"); }
"hacer" { printf("do"); }
"descanso" { printf("break"); }
"funcion" { printf("function"); }
"importar" { printf("import"); }
"caso" { printf("case"); }
"alerta" { printf("alert"); }
"consola" { printf("console"); }
"iniciar" { printf("log"); }
"documento" { printf("document"); }
"escribir" { printf("write"); }
"escribir_lineal" { printf("writeln"); }
"aredondeo" { printf("toFixed"); }
"aexponente" { printf("toExponencial"); }
"ingresar" { printf("prompt"); }
"matematicas" { printf("maths"); }

11
"absoluto" { printf("abs"); }
"retornar" { printf("return"); }
\n lineas++; { printf("\n"); }
. printf ("%s", yytext);
%%

/* Sección CODIGO USUARIO */


int yywrap() {}
int main(int argc, char **argv)
{

yylex();
return 0;
}

Tabla 7. Programa en Flex que traduce un programa en JavaScript a su versión en


inglés
Como se observa, la forma en como se ha implementado es sencilla debido a
que solo se debía reemplazar aquellos lexemas, cuya traducción en en inglés
ya se había especificado en una tabla en el punto 1.

Los programas que se han utilizado como texto de entrada para la traducción,
fueron los siguientes:

Programa para calcular el mayor de dos números


Español Inglés

funcion Mayor_de_dos() function Mayor_de_dos()


{ {
variable numero1; var numero1;
variable numero2; var numero2;
numero1= ingresar("ingresa el numero1= prompt("ingresa el
primer número"); primer numero");
numero2= ingresar("ingresa el numero2= prompt("ingresa el
segundo numero"); segundo numero");
si(numero1===numero2) if(numero1===numero2)
{ {
consola.iniciar("Los numeros son console.log("Los numeros son
iguales"); iguales");
} }
caso_contrario else
{ {
si (numero1>numero2) if(numero1>numero2)
{ {

12
consola.iniciar("El mayor es "+ console.log("El mayor es "+
numero1); numero1);
} }
caso_contrario else
{ {
consola.iniciar("El mayor es "+ console.log("El mayor es "+
numero2); numero2);
} }
} }
} }
Mayor_de_dos(); Mayor_de_dos();
Tabla 8. Programa Mayor_de_dos

Programa para calcular el área de un triángulo


Español Inglés

funcion Area_triangulo( base, altura) function Area_triangulo( base,


{ altura)
variable area=base*altura; {
//aproximacion a entero var area=base*altura;
area=area.aredondeo(0); //aproximacion a entero
documento.escribir("El area del area=area.toFixed(0);
triangulo es: "+ area); docuement.write("El area del
} triangulo es: "+ area);
Area_triangulo(3.434546,5.69794); }
Area_triangulo(3.434546,5.69794);
Tabla 9. Programa Area_Triangulo

Programa para calcular la cantidad de dígitos de un número


Español Inglés

funcion contar_digitos(n) { function contar_digitos(n) {


variable numDigitos = 0; var numDigitos = 0;
variable integers = Math.abs(n); var integers = Math.abs(n);

mientras (integers > 0) { while (integers > 0) {


integers = (integers - integers % 10) integers = (integers - integers
/ 10; % 10) / 10;
numDigitos++; numDigitos++;
} }
retornar consola.iniciar(numDigitos); return console.log(numDigitos);
} }
contar_digitos(36736) contar_digitos(36736)

Tabla 10. Programa contar_digitos

13
Programa para calcular la factorial de un número

Español Inglés

funcion factorial(n) { function factorial(n) {

variable resultado = 1; var resultado = 1;

para(variable i=1; i<=n; i++) { for(var i=1; i<=n; i++) {


resultado = resultado*i; resultado = resultado*i;
} }
alerta(resultado); alert(resultado);
} }
factorial(3) factorial(3)

Tabla 11. Programa factorial

Programa para determinar si un número es par o impar


Español Inglés

variable resultado = var resultado = parImpar(numero);


parImpar(numero); alert("El número "+numero+" es
alerta("El número "+numero+" es "+resultado);
"+resultado);
function parImpar(numero) {
funcion parImpar(numero) { if(numero % 2 === 0) {
si(numero % 2 === 0) { return "par";
retornar "par"; }
} else {
else { return "impar";
retornar "impar"; }
} }
}

Tabla 12. Programa parImpar

14
Veamos la ejecución del programa:
Primero compilamos y ejecutamos todos los archivos

Imagen 5. Ejecución y Compilación del programa

Luego ejecutamos el scanner , ingresamos el archivo de prueba input.txt y


guardamos los resultados en otro archivo de nombre archivotraducido.txt

Imagen 6. Ejecución del scanner y creación del archivo de salida

15
Veamos el contenido del archivo traducido. Se ha logrado traducir el archivo
de forma exitosa

Imagen 7. Vista del archivo de salida

16
6. Recomendaciones

· Se recomienda como base para el desarrollo del analizador tener


conocimientos básicos en flex y bison.

17

También podría gustarte