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.htmlparsesparse.jsand displays its AST. - The page depends on on
parse.jsandtokens.js. - The file
parse.jscontains 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.mdescriba 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
tokensretorna 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