Práctica: Analizador Léxico para Un Subconjunto de JavaScript (Variante de antigua p4-t2-lexer)
Práctica: Analizador Léxico para Un Subconjunto de JavaScript (Variante de antigua p4-t2-lexer)
Vamos a trabajar a partir de este repo de Douglas Crockford:
- https://github.com/douglascrockford/TDOP
- Autor: Douglas Crockford, douglas@crockford.com en la Wikipedia
- Fecha que figura en el repo: 2010-11-12
- Vea una versión modificada en funcionamiento en http://crguezl.github.io/ull-etsii-grado-pl-minijavascript/. En esta versión el analizador léxico usa expresiones regulares.
Descripción:
- tdop.html contains a description of Vaughn Pratt’s Top Down Operator Precedence, and describes the parser whose lexer we are going to write in this lab. Is a simplified version of JavaScript.
- The file
index.html
parsesparse.js
and displays its AST. - The page depends on on
parse.js
andtokens.js
. - The file
parse.js
contains the Simplified JavaScript parser. - tokens.js produces an array of token objects from a string.
Requisitos
- Douglas Crockford escribió este analizador léxico sin usar expresiones regulares. Reescriba el analizador léxico en tokens.js usando expresiones regulares.
- 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 dada por el profesor en - Modifique la solución de Crockford usado regexps en tokens.js
- Añada un server (vea aquí un ejemplo) para el HTML y haga el despliegue de su aplicación en la máquina virtual del iaas o en Heroku
- Opcional: Use sessions para controlar quien accede a la aplicación. Puede ver un ejemplo de como hacerlo en los ficheros:
- ULL-ESIT-PL-1617/evaluar-manejo-de-cookies-y-sessions-en-expressjs
- En el módulo npm @ull-esit-pl/auth encontrará la solución al problema explicada en clase
- En el
README.md
escriba un tutorial con lo que ha aprendido en esta práctica - Cuando haga la entrega indique los enlaces a los repos (analizador) así como a los despliegues. Ponga también el enlace al despliegue en el README de su repo.
Recursos
- Lexical Analysis
- Una solución incompleta de esta práctica se encuentra en:
- https://github.com/crguezl/ull-etsii-grado-pl-minijavascript/tree/gh-pages en github.
- Veala en funcionamiento en http://crguezl.github.io/ull-etsii-grado-pl-minijavascript/
- El método
tokens
retorna el array de tokens https://github.com/crguezl/ull-etsii-grado-pl-minijavascript/blob/gh-pages/tokens.js
- Una solución incompleta de esta práctica se encuentra en:
- Programación Web
- ejs
- Cookies, Sessions, Authentication
- Ejemplo de server con cookies y sessions: ULL-ESIT-PL-1617/evaluar-manejo-de-cookies-y-sessions-en-expressjs.
- Cookies (apuntes 16/17)
- Sessions y Authentication (apuntes 16/17)
- Express
- Despliegues
- Webpack
- Expresiones Regulares
- XRegexp
- XRegexp
- JavaScript y Unicode (Repo en GitHub unicode-js)
- Repositorio con ejemplos de uso de XRegExp
- Ejemplos de extensiones de XRegExp para Unicode
-
> 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'
- Diseño
- Creación de Módulos
- Véase la sección
- Ejemplo de módulo npm: ULL-ESIT-DSI-1617/scapegoat
- prueba-scapegoat. Ejemplo de programa cliente
- Repo combinado librería + cliente de prueba
- Solución: repo ULL-ESIT-GRADOII-PL/modulos
- Como funciona require Video del profesor
- Best practice: Specify global dependencies in your gulpfile
- Node.js — How to test your new NPM module without publishing it every 5 minutes
- Best practice: Better local require() paths for Node.js:
- When the directory structure of your Node.js application (not library!) has some depth, you end up with a lot of annoying relative paths in your require calls like:
var Article = require('../../../models/article');
Those suck for maintenance and they’re ugly.
- When the directory structure of your Node.js application (not library!) has some depth, you end up with a lot of annoying relative paths in your require calls like:
Notas 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
- sol-david dibad
- sol-cas
- sol-ai
- sol-carlos
- sol-daute
- sol-cristian