Conflito Division / RegExp enquanto tokenizava Javascript [duplicado]

8

Estou escrevendo um tokenizer javascript simples que detecta tipos básicos: Word, Number, String, RegExp, Operador, Comment e Newline. Tudo está indo bem, mas não consigo entender como detectar se o caractere atual é o delimitador Regexp ou o operador de divisão. Eu não estou usando expressões regulares porque elas são muito lentas. Alguém sabe o mecanismo de detectá-lo? Obrigado.

    
por Orme 18.01.2011 в 17:14

2 respostas

6

Você pode dizer que o token precedente está no fluxo. Percorra cada ficha que o seu léxico emite e pergunte se pode razoavelmente ser seguido por um sinal de divisão ou por um regexp; você verá que os dois conjuntos de tokens resultantes são disjuntos. Por exemplo, ( , [ , { , ; e todos os operadores binários só podem ser seguidos por um regexp. Da mesma forma, ) , ] , } , identificadores e literais de sequência / número só podem ser seguidos por um sinal de divisão.

Veja a Seção 7 da especificação ECMAScript para mais detalhes.

    
por pmdboi 18.01.2011 / 17:27
1

você tem que verificar o contexto quando encontrar a barra. se a barra estiver depois de uma expressão, então ela deve ser divisão ou é um início de expressão regular.

para reconhecer o contexto, talvez você precise criar um analisador de sintaxe.

por exemplo

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
    
por define.cc 08.02.2014 / 10:38