ขณะนี้ฉันกำลังใช้ตัวประเมินผลนิพจน์ (นิพจน์บรรทัดเดียว, เช่นสูตร) ตามสิ่งต่อไปนี้:
- การแสดงออกที่ป้อนถูกโทเค็นเพื่อแยก booleans ตัวอักษรจำนวนเต็มทศนิยมสตริงฟังก์ชั่นตัวระบุ (ตัวแปร)
- ฉันใช้อัลกอริทึม Shunting-yard (แก้ไขเบา ๆ เพื่อจัดการฟังก์ชันที่มีจำนวนตัวแปรที่มีข้อโต้แย้ง) เพื่อกำจัดวงเล็บและสั่งให้ผู้ประกอบการที่มีความสำคัญมาก่อนในลำดับ postfixed
- shunting-yard ของฉันสร้างคิวโทเค็น (จำลอง) (โดยใช้อาร์เรย์อาร์เรย์ภาษา Powerbuilder Classic ของฉันสามารถกำหนดวัตถุ แต่มีอาร์เรย์แบบไดนามิกเป็นหน่วยเก็บข้อมูลดั้งเดิมไม่ใช่รายการจริงไม่มีพจนานุกรม) ที่ฉันประเมินตามลำดับด้วย เครื่องกองง่าย
ผู้ประเมินของฉันทำงานได้ดี แต่ฉันก็ยังขาดif()
และฉันก็สงสัยว่าจะดำเนินการต่อไปอย่างไร
ถ้าฉันเพิ่มif()
ฟังก์ชันอื่นที่มีส่วนที่เป็นจริงและเท็จอยู่คนเดียวif(true, msgbox("ok"), msgbox("not ok"))
จะแสดงข้อความทั้งสองในขณะที่ฉันต้องการจะแสดงเพียงข้อความเดียว นี่เป็นเพราะเมื่อฉันต้องการประเมินฟังก์ชั่นข้อโต้แย้งทั้งหมดได้รับการประเมินและวางลงบนสแต็ก
คุณช่วยให้ฉันใช้if()
วิธีขี้เกียจบางอย่าง?
ฉันคิดว่าการประมวลผลเหล่านี้เป็นมาโครชนิดหนึ่ง แต่ในตอนแรกฉันยังไม่ได้ประเมินสภาพ บางทีฉันอาจต้องใช้โครงสร้างชนิดอื่นที่ไม่ใช่คิวเพื่อแยกเงื่อนไขและนิพจน์จริง / เท็จออกจากกัน? สำหรับตอนนี้นิพจน์จะถูกวิเคราะห์ก่อนการประเมินผล แต่ฉันยังวางแผนที่จะเก็บการแทนค่ากลางไว้เป็นชนิดของนิพจน์ที่คอมไพล์แล้วสำหรับการประเมินในอนาคต
แก้ไข : หลังจากที่แม้ว่าบางอย่างเกี่ยวกับปัญหาที่เกิดขึ้นผมคิดว่าผมสามารถสร้างตัวแทนต้นไม้ในการแสดงออกของฉัน (เป็น AST แทนกระแสโทเค็นเชิงเส้น) if()
จากที่ผมได้อย่างง่ายดายสามารถละเว้นหนึ่งหรือสาขาอื่นของฉัน