2009-02-27 16 views
3

İlk önce sorunu ve sonra baktığım şeyi kütüphaneler açısından anlatacağım.ayrıştırıcı: şablon dosyalarında ayrıştırma formülleri

Uygulamamda, her zaman kullanılabilen bir dizi değişkenimiz var. Örneğin: TOTAL_ITEMS, PRICE, CONTRACTS, ETC (yaklaşık 15 tanesi var). Uygulamanın müşterileri, bu değişkenleri kullanarak belirli hesaplamaları yapmak ve görüntülemek isterler. Şimdiye kadar, bu hesaplamaları uygulamaya sürekli ekliyorum. Bu popodaki acıdır ve bir şablon oluşturarak, kullanıcının uygulamanın ayrıştırdığı ve hesaplayacağı bir dizi formül belirleyebileceği daha genel olmasını isterim. ekran görüntülemek için olduğu gibi,

total_cost = CONTRACTS*PRICE*TOTAL_ITEMS ve bazı meta tarihi:

total_cost = CONTRACTS*PRICE*TOTAL_ITEMS 

Yani, şablon dosyasında tanımlamak için kullanıcı için böyle bir şey yapmak istiyorum: Burada

bir durumdur üzerinde. Bu yüzden formülü bir ekranla belirtecekler. Ve dosya bu doğanın birçok formülleri içerecektir.

Şu anda, iki libraies bakıyorum: Spirit ve matheval

kimse referanslar, örnekler, bağlantıların yanı sıra, bu görev için daha iyi ne tavsiyelerde misiniz?

Sorunun belirsiz olup olmadığını bana bildirin ve daha fazla açıklığa kavuşturmaya çalışacağım. o yacc ve bison kullanarak basit bir ayrıştırıcı üretmek ve koduna entegre etmek çok zor olmamalı gibi

sayesinde

Sasha

+0

Matheval'ın Euphoria'da yazdığı anlaşılıyor. Bu sizin kullanım durumunuz için bir problem mi? – joshperry

+0

Bununla ilgili sorun nedir? –

+0

Sanırım asıl sorun, Euphoria'ya ihtiyacınız var! :-) –

cevap

0

Sabit sayıda değişkeniniz varsa, ayrıştırıcıyı çağırmak biraz aşırı olabilir. Ruh güzel olsa ve bir projede kullanmak istedim.

map<const char*,int*> vars; 
vars["CONTRACTS"] = &contracts; 
... 

Sonra gerçek matematik yapmak için basit bir sonek hesap makinesi işlevini kullanın:

ben muhtemelen sadece (tüm değişkenler int varsayılarak) adıyla anahtarlı değişkenlerinizin bir harita yapmak, dize simgeleştirir.

Düzenleme

: MathEval baktığımızda

, ne istediğinizi tam olarak cevap veriyor; değişkenleri belirler ve bu değişkenleri kullanarak matematiksel fonksiyonları değerlendirir. Neden bir sözdizimi ayrıştırıcı düzeyinde bir çözüm oluşturmak istediğinizden emin değilim. MathEval'in yerine getirmediği herhangi bir gereksininiz var mı?

+0

iyi, çok farklı operatörleri kullanmak zorunda olduğum için biraz zor olabilir (- + * /) - formül 30 sabit kullanabilir, bazıları tekrarlanabilir. –

+0

Her iki kütüphane de benim ihtiyacım olanı yerine getirebiliyor, söyleyebildiğim kadarıyla ... soru uzayabilirlik ve karmaşıklığı bir diğeriyle kullanmaktır. –

0

görünüyor.

+0

O zaman neden Ruh için gitmiyorsun? Dış araçlarda daha az bağımlılıkla sonuçlanan sonuçlar (Ruh'u, yacc ve arkadaşlardan daha az dışsal olarak kabul ediyorum) – Anonymous

+0

Ruh vs yacc bağlamında, kesinlikle destek için giderdim. Bununla birlikte, matheval'in daha az karmaşık bir dilbilgisi için daha kolay kullanılmasının yanı sıra hafif olduğunu da görüyorum. Teşekkürler –

0

Matheval hakkında bilmiyorum, ancak boost :: spirit bunu oldukça verimli bir şekilde yapabilir: bkz. there.

Şablon meta programlamasındaysanız, Boost::Proto'a bakmak isteyebilirsiniz, ancak kullanmaya başlamak için biraz zaman alır.