parser: แยกวิเคราะห์สูตรในไฟล์เทมเพลต

ก่อนอื่นฉันจะอธิบายปัญหาก่อนแล้วจึงพูดถึงสิ่งที่ฉันกำลังดูอยู่ในปัจจุบันในแง่ของห้องสมุด

ในแอปพลิเคชันของฉัน เรามีชุดตัวแปรที่พร้อมใช้งานอยู่เสมอ ตัวอย่างเช่น: TOTAL_ITEMS, ราคา, สัญญา, ฯลฯ (เรามีประมาณ 15 รายการ) ไคลเอนต์ของแอปพลิเคชันต้องการให้การคำนวณบางอย่างดำเนินการและแสดงโดยใช้ตัวแปรเหล่านั้น จนถึงตอนนี้ ฉันได้เพิ่มการคำนวณเหล่านั้นลงในแอปอย่างต่อเนื่อง เป็นเรื่องที่น่าปวดหัว และฉันต้องการทำให้เป็นแบบทั่วไปมากขึ้นโดยการสร้างเทมเพลต ซึ่งผู้ใช้สามารถระบุชุดสูตรที่แอปพลิเคชันจะแยกวิเคราะห์และคำนวณได้

นี่เป็นกรณีหนึ่ง:

total_cost = CONTRACTS*PRICE*TOTAL_ITEMS

ดังนั้นต้องการทำบางอย่างเพื่อให้ผู้ใช้กำหนดในไฟล์เทมเพลต:

total_cost = CONTRACTS*PRICE*TOTAL_ITEMS และ meta-date บางส่วน เช่น หน้าจอที่จะแสดง ดังนั้นพวกเขาจะระบุสูตรด้วยหน้าจอ และไฟล์จะมีสูตรลักษณะนี้มากมาย

ตอนนี้ ฉันกำลังดูสองไลบรารี: Spirit และ matheval

จะมีใครให้คำแนะนำว่าอะไรดีกว่าสำหรับงานนี้ รวมถึงข้อมูลอ้างอิง ตัวอย่าง ลิงก์

โปรดแจ้งให้เราทราบหากคำถามไม่ชัดเจน และเราจะพยายามชี้แจงเพิ่มเติม

ขอบคุณ,

ซาช่า


person Community    schedule 27.02.2009    source แหล่งที่มา
comment
ดูเหมือนว่า Matheval เขียนด้วยภาษา Euphoria... นั่นเป็นปัญหาสำหรับกรณีการใช้งานของคุณหรือไม่?   -  person joshperry    schedule 27.02.2009
comment
มีปัญหาอะไรกับสิ่งนั้น?   -  person    schedule 27.02.2009
comment
ฉันเดาว่าปัญหาหลักคือคุณต้องมี Euphoria ! :-)   -  person Benoît    schedule 27.02.2009
comment
ไม่ใช่แค่ไบนารี cpp ใช่ไหม มันใช้งานได้สำหรับเรา สำหรับแอปอื่นๆ บน AS3   -  person    schedule 27.02.2009
comment
ฉันเดาว่า Euphoria สามารถคอมไพล์เป็น C และส่งออกเป็นฟังก์ชัน C ใน DLL ได้ดังนั้นนั่นอาจเป็นสิ่งที่คุณกำลังใช้อยู่   -  person joshperry    schedule 28.02.2009


คำตอบ (3)


หากคุณมีตัวแปรจำนวนคงที่ อาจต้องใช้โปรแกรมแยกวิเคราะห์มากเกินไปเล็กน้อย แม้ว่า Spirit จะเจ๋งและฉันก็อยากใช้มันในโปรเจ็กต์

ฉันอาจจะแค่โทเค็นสตริงสร้างแผนที่ของตัวแปรของคุณโดยใส่ชื่อ (สมมติว่าตัวแปรทั้งหมดของคุณเป็น ints):

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

จากนั้นใช้ฟังก์ชันเครื่องคิดเลข postfix อย่างง่ายเพื่อคำนวณตามจริง

แก้ไข:

เมื่อดูที่ MathEval ดูเหมือนว่าจะทำสิ่งที่คุณต้องการอย่างแน่นอน ตั้งค่าตัวแปรและประเมินฟังก์ชันทางคณิตศาสตร์โดยใช้ตัวแปรเหล่านั้น ฉันไม่แน่ใจว่าทำไมคุณถึงต้องการสร้างโซลูชันในระดับตัวแยกวิเคราะห์ไวยากรณ์ คุณมีข้อกำหนดใดๆ ที่ MathEval ไม่ปฏิบัติตามหรือไม่

person joshperry    schedule 27.02.2009
comment
มันอาจจะยุ่งยากสักหน่อยเพราะฉันต้องใช้โอเปอเรเตอร์หลายตัว (- + * /)- สูตรสามารถใช้ค่าคงที่ได้ 30 ค่า บางตัวอาจซ้ำกัน - person ; 27.02.2009
comment
ไลบรารีทั้งสองตอบสนองความต้องการของฉันได้ เท่าที่ฉันสามารถบอกได้ ...คำถามคือความสามารถในการขยายและความซับซ้อนโดยการใช้อันหนึ่งทับอีกอันหนึ่ง... - person ; 27.02.2009

ดูเหมือนว่าไม่น่าจะยากเกินไปที่จะสร้าง parser แบบง่ายๆ โดยใช้ yacc และ bison และรวมเข้ากับโค้ดของคุณ

person chakrit    schedule 27.02.2009
comment
แล้วทำไมไม่ไปหาสปิริตล่ะ? ส่งผลให้มีการพึ่งพาเครื่องมือภายนอกน้อยลง (ฉันถือว่า Spirit ภายนอกน้อยกว่า yacc และเพื่อน) - person Anonymous; 27.02.2009
comment
ในบริบทของสปิริตกับ yacc ฉันจะส่งเสริมอย่างแน่นอน อย่างไรก็ตาม ฉันยังเห็นว่าคณิตศาสตร์นั้นมีน้ำหนักเบาและใช้งานง่ายกว่าสำหรับไวยากรณ์ที่ซับซ้อนน้อยกว่า ขอบคุณ - person ; 27.02.2009

ฉันไม่รู้เกี่ยวกับคณิตศาสตร์ แต่ boost::spirit สามารถทำสิ่งนั้นให้คุณได้ค่อนข้างมีประสิทธิภาพ : ดู ที่นั่น

หากคุณสนใจการเขียนโปรแกรมเมตาเทมเพลต คุณอาจต้องการดูที่ Boost::Proto แต่จะต้องใช้เวลาพอสมควรในการเริ่มต้นใช้งาน

person Benoît    schedule 27.02.2009