Pergunta

Eu gostaria de encontrar um analisador javascript que pode manipular e avaliar expressões simples. O analisador deve ser capaz de avaliar as expressões matemáticas regulares, e apoiar funções personalizadas com parâmetros. Ele também tem de cordas de apoio manipulação. concatenação com || suporte do operador é o preferido, mas é bom se + irá fazer o truque.

Exemplos de uma expressão que devem ser tratadas pelo analisador:

3 * (2 + 1) - 1

2 * func (2, 2)

func ( 'Olá mundo', 0, 5) || 'Você'

Alguém já implementou um tal coisa ou onde posso encontrar algo semelhante?

Foi útil?

Solução

Eu tenho uma versão modificada de um ActionScript analisador (escrito em AS, não parses AS) que funciona apoios personalizados, mas não cordas. Provavelmente seria fácil adicionar suporte à cadeia embora. Vou enviá-lo em algum lugar para que você possa obtê-lo em http://silentmatt.com/parser2.js http://silentmatt.com/parser3.js .

Editar: I adicionado suporte básico para cordas muito facilmente. Ele não suporta sequências de escape e toJSFunction não funciona, mas levou apenas alguns minutos para fazê-lo funcionar. Mudando o operador de concatenação de "||" deve ser muito fácil também.

Veja como você avalia seu exemplo de expressões:

js> var parser = new Parser();
js> parser.parse("3 * (2 + 1) - 1").evaluate();
8
js> parser.parse("2 * func(2; 2)").evaluate({ func:Math.pow });
8
js> function substr(s, start, end) { return s.substring(start, end); }
js> parser.parse("func('hello world'; 0; 5) + ' you'").evaluate({ func:substr });
hello you

Não me lembro por que eu usei ponto e vírgula como separadores de argumentos; Eu acho que tem algo a ver com a diferenciação entre funções e funções "Operador" built-in.

Outro edit:

Eu tenho jogado com isso um pouco, e agora há uma versão com melhor suporte corda em http: // silentmatt.com/parser3.js (toJSFunction funciona, e você pode usar sequências de escape JavaScript padrão). Ele também usa vírgulas para argumentos separados para todas as funções e || como o operador de concatenação em vez de +, o que só faz disso.

Outras dicas

Assumindo que você quer dizer um analisador javascript em javascript, você provavelmente vai querer eval ()

ver: https://developer.mozilla.org/En/Core_JavaScript_1 .5_Reference / Global_Functions / Eval

Basta notar que eval, se usados ??de forma inadequada, pode representar um risco de segurança.

não tê-lo usado, mas uma rápida no google revela http://jsfromhell.com/classes/ math-parser

Editar :

O que você quer fazer pode estar fora do alcance do primeiro link, você pode também ter um olhar de Douglas Crockford "analisador para Simplificado JavaScript"

É apenas um parser, então você teria que fazer tudo a avaliação sozinho. Seria, no entanto, torná-lo um pouco mais fácil e ele não usa eval.

Tente math.js:

http://mathjs.org

Vem com uma extensa e fácil de analisador de uso, que também suporta a atribuição e uso de variáveis ??e funções como no seu exemplo expressão. Integra-se perfeitamente com JavaScript "nativo":. Pode receber e variáveis ??definidas e funções do âmbito Analisadores

O código de exemplo seria avaliada como:

var parser = math.parser();
parser.set('func', function () {
    // ... do something ...
});
parser.eval('3 * (2 + 1) - 1');
parser.eval('2 * func(2, 2)');
parser.eval('func("hello world", 0, 5) + " you"');

As funções podem também ser definidos no próprio (atualmente apenas funções de linha única) parser:

parser.eval('function f(x, y) = x ^ y');
parser.eval('f(2, 3)'); // 8

Veja este tutorial para saber como construir arbitrárias analisadores / compiladores. (Basicamente, ele automatiza a construção de analisador sintático descendente recursivo de gramáticas, o que significa que você pode mudar a sua expressão de sintaxe facilmente). Todo o tutorial é feito em JavaScript, por isso se aplica diretamente a você.

http://www.bayfronttechnologies.com/mc_tutorial.html

Narcissus implementa um analisador JS adequada em JS: http://mxr.mozilla.org/mozilla/source/js/narcissus/jsparse. js . Escrito por Brendan Eich (o criador JS) também!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top