2011-01-18 16 views
8

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

6

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.

+2

me escribió una tokenizer una vez, y éstas son las EMT que detectan un "disparador de expresiones regulares": '/ [{(\ [;,] /' '/ \ + \ + | - | ~ | && | \? |: | \ | \ || \\ $ | (<<|> >>? | ==? |! =? | [- <> + *% & \ | \^/]) =?/''/^ (? = \ s | \/| user123444555621

+4

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

+0

@dgreensp ¡Gracias por las observaciones muy útiles! – Zo72

1

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 
Cuestiones relacionadas