Procesadores de Lenguajes

3º. 2º cuatrimestre. Itinerario de Computación. Grado en Ingeniería Informática. ULL


Organization ULL-ESIT-PL-1920   Github Classroom ULL-ESIT-PL-1920   Campus Virtual PL   Chat Chat   Profesor Casiano

Table of Contents

Práctica: Analizador Léxico para Un Subconjunto de JavaScript (p9-t2-lexer)

Introducción

Vamos a trabajar a partir de este repo de Douglas Crockford que contiene un analizador sintáctico de una versión antigua de JavaScript:

The goal of this lab is to rewrite the lexical analyzer using regular expressions.

The file tdop.html contains a description of Vaughn Pratt’s Top Down Operator Precedence, and describes the parser.

As soon as it loads, the file index.html parses the javascript code inside parse.js and displays the corresponding AST. Then you can play with other examples introducing them inside the text area.

The page depends on parse.js and tokens.js.

Reescriba el Analizador Léxico Usando Expresiones Regulares

Douglas Crockford escribió este analizador léxico sin usar expresiones regulares. Reescriba el analizador léxico en tokens.js usando expresiones regulares.

Use Sticky Flags

Evite que se hagan copias de la cadena siendo procesada. Muévase dentro de la misma cadena usando lastIndex. Quizá usar la opción sticky le ayude. Tiene una solución que puede consultar en:

Admita Identificadores y Números Unicode

Usando XRegExp y Módulo @ull-esit-pl/uninums añada a su analizador léxico la capacidad de procesar identificadores y números en unicode. Por ejemplo, la entrada:

var αβ /* griego */ = ६६७ /* 667 en Devanagari */ * ६७ /* 67 en Devanagari */;

debería producir una salida parecida a esta:

{
    "value": "=",
    "arity": "binary",
    "first": {
        "value": "αβ",
        "arity": "name"
    },
    "second": {
        "value": "*",
        "arity": "binary",
        "first": {
            "value": 667,
            "arity": "literal"
        },
        "second": {
            "value": 67,
            "arity": "literal"
        }
    }

Letras y Números con XRegexp

Recuerde como procesar letras y números Unicode usando XRegexp:

  > [analizador-lexico(master)]$ node
  > XRegExp = require("xregexp")
  > id = XRegExp('[_\\pL][_\\pL\\pN]+'); // L: Letter, N: number
  > id.exec("Русский६")
  [ 'Русский६', index: 0, input: 'Русский६' ]
  > number = XRegExp('\\pN+', "g"); // N: number
  > "६६७+६७*2".match(number)
  [ '६६७', '६७', '2' ]
  > 

Aunque hoy en día podemos hacer algo parecido con las expresiones convencionales:

> id = /\p{Alphabetic}[\p{Alphabetic}\p{Number}]*/ug
/\p{Alphabetic}[\p{Alphabetic}\p{Number}]*/gu
> 'Русский६ 45 ; ab2 ... αβ६६७ --'.match(id)
[ 'Русский६', 'ab2', 'αβ६६७' ]

El Módulo @ull-esit-pl/uninums

Para esta práctica escribí el módulo @ull-esit-pl/uninums, que les ayudará a obtener la representación interna de una cadena unicode que contenga un número:

> uninums = require("@ull-esit-pl/uninums")
{ normalSpaces: [Function: normalSpaces],
  normalDigits: [Function: normalDigits],
  parseUniInt: [Function: parseUniInt],
  parseUniFloat: [Function: parseUniFloat],
  sortNumeric: [Function: sortNumeric] }
> uninums.parseUniInt('६.६')
6
> uninums.parseUniFloat('६.६')
6.6
> uninums.parseUniFloat('६.६e६')
6600000
> uninums.sortNumeric(['٣ dogs','١٠ cats','٢ mice']) 
[ '٢ mice', '٣ dogs', '١٠ cats' ]
> uninums.normalDigits('٢ mice')
'2 mice'
> uninums.normalDigits('٣ dog')
'3 dog'
> uninums.normalDigits('١٠ cats')
'10 cats'
> uninums.normalDigits('٠۴६')
'046'

El Módulo @ull-esit-pl/uninums en el Cliente

Dado que Módulo @ull-esit-pl/uninums se va a usar en el cliente necesitamos una versión para el mismo. Una vez instalado, use el fichero node_modules/\@ull-esit-pl/uninums/uninums-web.js:

[~/.../analizador-lexico-para-js-carlos-dominguez(reto)]$ ls -l node_modules/\@ull-esit-pl/uninums/
total 56
-rw-r--r--  1 casiano  staff  4101  4 mar 09:50 README.md
-rw-r--r--  1 casiano  staff  1648  4 mar 09:50 package.json
-rw-r--r--  1 casiano  staff  1571  4 mar 09:50 test.html
-rw-r--r--  1 casiano  staff  3696  4 mar 09:50 uninums-web.js
-rw-r--r--  1 casiano  staff  3641  4 mar 09:50 uninums.js
-rw-r--r--  1 casiano  staff  2903  4 mar 09:50 uninums.min.js

Despliegue la Aplicación en Github

Despliegue la aplicación y el informe en GitHub. Use la rama master para simplificar el despliegue.

Recursos

XRegexp

Módulo @ull-esit-pl/uninums

Recursos para el Profesor

[~/srcPLgrado/lexical_analysis_top_down_operator_precedence(gh-pages)]$ pwd -P
/Users/casiano/local/src/javascript/PLgrado/lexical_analysis_top_down_operator_precedence
[~/campus-virtual/1819/pl1819/introduccion/tema2-expresiones-regulares-y-analisis-lexico/practicas/p4-t2-lexer/pl1718-solutions(master)]$ pwd -P
/Users/casiano/local/academica/centros/ETSII/GRADO/PL/campus-virtual/tema2-regexp-y-lexico/practica-analisis-lexico-tdop/solutions

Your Comments

Comment with Disqus