Estoy escribiendo un tokenizer de JavaScript simple que detecta tipos básicos: Word, Number, String, RegExp, Operator, Comment y Newline. Todo va bien, pero no puedo entender cómo detectar si el carácter actual es el delimitador RegExp o el operador de división. No estoy usando expresiones regulares porque son demasiado lentas. ¿Alguien sabe el mecanismo para detectarlo? Gracias.División/conflicto de RegExp al tokenizar Javascript
Respuesta
Puede decir por qué el token anterior se encuentra en la transmisión. Revise cada ficha que emite su lexer y pregunte si puede seguirse razonablemente con un signo de división o una expresión regular; encontrará que los dos conjuntos de tokens resultantes son disjuntos. Por ejemplo, (
, [
, {
, ;
, y todos los operadores binarios solo pueden ser seguidos por una expresión regular. Del mismo modo, )
, ]
, }
, identificadores y literales de cadena/número solo pueden seguir un signo de división.
Consulte la Sección 7 de ECMAScript spec para obtener más información.
tiene que verificar el contexto cuando encuentre la barra inclinada. si la barra está después de una expresión, entonces debe ser división, o es un inicio de expresión regular.
Para reconocer el contexto, tal vez tenga que hacer un analizador de sintaxis.
por ejemplo
function f() {}
/1/g
//this case ,the slash is after a function definition, so it's a refexp start
var a = {}
/1/g;
//this case, the slash is after an object expression,so it's a division
- 1. Regexp de JavaScript.
- 2. javascript multilínea regexp reemplazar
- 3. Diferencias JavaScript RegExp
- 4. Prueba interesante de Javascript RegExp
- 5. Bug con RegExp en JavaScript al hacer la búsqueda global
- 6. JavaScript RegExp: prueba y ejecutivo
- 7. Regexp de búsqueda hacia atrás javascript
- 8. Diferencias entre Javascript regexp literal y constructor
- 9. ¿Cómo puedo poner [] (corchetes) en RegExp javascript?
- 10. Javascript Regexp no devuelve resultados globales
- 11. Javascript Regexp - Caracteres del partido después de cierta frase
- 12. Regexp para Tokenizing English Text
- 13. Javascript RegExp: Coincidir cualquier cosa menos saltos de línea
- 14. Compruebe si string es un prefijo de un Javascript RegExp
- 15. Javascript Regexp generación dinámica a partir de variables?
- 16. Transact-SQL: ¿Cómo puedo tokenizar una cadena?
- 17. ¿Cómo puedo tokenizar esta cadena en Ruby?
- 18. En XSLT, ¿puedo tokenizar con nada?
- 19. Coincidir solo al principio de la línea en Ruby regexp
- 20. Combinar Regexp
- 21. Inserta una cadena en un RegExp existente en Javascript?
- 22. Javascript RegExp texto partido entre <a> etiquetas
- 23. JavaScript y expresiones regulares: sintaxis literal vs. RegExp objeto
- 24. ¿Por qué no se define JavaScript RegExp/^ \ w + $/match?
- 25. Coincidencia de espacios en blanco en Javascript regexp por objeto, creado a través del constructor de RegExp
- 26. Cambiar las banderas RegExp
- 27. Regexp compilable en Python
- 28. Sintaxis de emacs replace-regexp
- 29. regexp con lang ruso
- 30. Python RegExp bandera global
me escribió una tokenizer una vez, y éstas son las EMT que detectan un "disparador de expresiones regulares": '/ [{(\ [;,] /' '/ \ + \ + | - | ~ | && | \? |: | \ | \ || \\ $ | (<<|> >>? | ==? |! =? | [- <> + *% & \ | \^/]) =?/''/^ (? = \ s | \/| user123444555621
Técnicamente, hay un par de ambigüedades que son inevitables en el nivel léxico. Por ejemplo, '(a + b)/c' contra' if (x) /foo/.exec ('bar') '(close-paren puede preceder a cualquiera). Además,' ++/foo/.abc' y 'a ++/b' (plus-plus pueden preceder a cualquiera). Junto con' --' estos son los únicos que conozco. – dgreensp
@dgreensp ¡Gracias por las observaciones muy útiles! – Zo72