2009-06-27 14 views
5

Basit ifadeleri işleyebilen ve değerlendirebilen bir javascript ayrıştırıcısı bulmak istiyorum. Ayrıştırıcı, normal matematiksel ifadeleri değerlendirebilmeli ve parametrelerle özel işlevleri destekleyebilmelidir. Ayrıca dizeleri işlemeyi desteklemelidir. Dize birleştirme || Operatör desteği tercih edilir, ancak hile yapması normaldir. çözümleyici tarafından ele alınması gereken bir ifadeBasit ifade için Javascript ayrıştırıcısı

Örnekler:

3 * (2 + 1) 1 -

2 * fonk (2, 2)

fonk ('Merhaba ', 0, 5) || 'siz'

Böyle bir şeyi yapan var mı, benzer bir şeyi nerede bulabilirim?

+0

Eğer bir javascript ayrıştırıcı arıyoruz farklı bir dilde koşmak için? javascript ayrıştırıcısının C++ uygulaması gibi mi? Ya da javascript için javascript'te bir şey? –

+0

Bu konuda net olmasaydım özür dilerim. Hayır, javascript ile yazılmış, yukarıda açıklandığı gibi basit ifadeyi ayrıştıran ve değerlendiren bir ayrıştırıcıyı kastediyorum. –

+0

, "özel" işlevler kümesi bilinmektedir? –

cevap

8

ActionScript parser (AS'de değil AS ile yazılmış), özel işlevleri destekleyen, ancak dizeleri olmayan değiştirilmiş bir sürümüm var. Yine de string desteği eklemek çok kolay olurdu. Bir yere yükleyeceğim, böylece http://silentmatt.com/parser2.jshttp://silentmatt.com/parser3.js'dan edinebilirsiniz.

Düzenleme: Dizeler için temel desteği oldukça kolay ekledim. Kaçış sıralarını desteklemiyor ve JSFunction çalışmıyor, ancak çalışmasını sağlamak sadece birkaç dakika sürdü. Birleştirme işlecini "||" olarak değiştirmek çok kolay olmalı. İşte

size örnek ifadeleri değerlendirmek gibi olacaktır: Ben argüman Ayraç olarak virgül kullanılır neden hatırlamıyorum

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 

; Fonksiyonlar ve yerleşik "operatör" fonksiyonları arasında ayrım yapmakla ilgili bir şey olduğunu düşünüyorum.

başka düzenleme:

bu biraz ile oynuyorum ve şimdi http://silentmatt.com/parser3.js daha iyi dize desteği olan bir versiyon (toJSFunction çalışır ve standart JavaScript dizileri kaçış kullanabilirsiniz) var. Ayrıca, tüm işlevler için bağımsız değişkenleri ve ||'u yalnızca ekleme eki olan + yerine dize birleştirme işleci olarak ayırmak için virgülleri kullanır.

+0

Teşekkür ederim adamım. Yardımın için sağol. Bu tarif ettiğim ile eşleşiyor ve aynı zamanda değiştirilmesi ve genişletilmesi de kolaydır. Aradığım şey bu. Bunun için gerçekten minnettarım. –

+0

Başka bir yorum ... Matthew, senin harika olduğunu söylemeyi unuttum! Üçüncü versiyondaki modifikasyonu gerçekten takdir ediyorum. iyi işlere devam et. Herşey gönlünce olsun. –

+0

Sorun değil. Bir süredir bununla oynamak istedim (birkaç aydır dokunmadım). Bir çok kredi, orijinal versiyonu yazan Raphael Graf'e gidiyor. –

3

Eğer javascript javascript ayrıştırıcı demek varsayarsak, muhtemelen istediğiniz eval()

bkz:

https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Functions/Eval Sadece o eval dikkat yanlış kullanılırsa, bir güvenlik riski temsil edebilir.

+0

Hayır, eval benim için bir seçenek değil. Dediğiniz gibi, güvenlik riskleri getirecek ve benim durumumda risk gerçekten çok yüksek. Yukarıda açıklanan şeyi yapmak için özel ve sınırlı bir ayrıştırıcı istiyorum. Ama teşekkürler –

3

kullanmadım, ama hızlı google http://jsfromhell.com/classes/math-parser

düzenlemeyi ortaya koymaktadır:

Ne ilk bağlantının ulaşamayacağı olabilir yapmak istiyorum, ayrıca bir göz olabilir Douglas Crockford'un "parser for Simplified JavaScript"

Sadece bir çözümleyici, bu yüzden tüm değerlendirmeyi kendiniz yapmak zorundasınız. Bununla birlikte, bunu biraz daha kolaylaştırabilir ve değerlendirmeyi kullanmaz.

+0

Teşekkür ederim. Bu umut verici ve benim isteğime en yakın eşleşme gibi görünüyor, ancak, dizeleri destek yok. Dizeleri desteklemek için de modifiye etmek zordur, çünkü ayrıştırma işleminin optimize edilmiş (ama güzel) bir yolundan ziyade, özyinelemeli bir yaklaşımla aktarılmaz. Herkes dizeleri desteklemek için değiştirmeye yardımcı olabilir mi? –

0

Rasgele ayrıştırıcıların/derleyicilerin nasıl oluşturulacağını öğrenmek için bu eğiticiyi inceleyin. (Temel olarak, ifade dilimlerinizi kolayca değiştirebileceğiniz, dilbilgilerden özyineli soy ayrıştırıcılarının oluşturulmasını otomatikleştirir). Tüm eğitim, JavaScript’te yapılır, bu yüzden doğrudan size uygulanır.

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

2

deneyin math.js:

http://mathjs.org

da örnek ifadede gibi atama ve değişkenlerin ve işlevlerin kullanımını destekleyen ayrıştırıcı, kullanımı kapsamlı ve kolay gelir. "Yerel" JavaScript ile sorunsuz bir şekilde bütünleşir: Değişkenleri ve işlevleri Parsers kapsamından alabilir ve ayarlayabilirsiniz.

Kod örneği olarak değerlendirilebilir olur

:

Fonksiyonlar da ayrıştırıcı kendisi (şu anda sadece tek hat fonksiyonları) tanımlanabilir

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"'); 
:

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