ฉันจะใช้แอปพลิเคชันประมวลผลคำสั่งได้อย่างไร


9

ฉันต้องการสร้างแอปพลิเคชันที่เรียบง่ายและพิสูจน์ความคิดรวบยอด (REPL) ที่ใช้ตัวเลขแล้วประมวลผลคำสั่งกับหมายเลขนั้น

ตัวอย่าง: ฉันเริ่มต้นด้วย 1 จากนั้นฉันเขียน " add 2" มันให้ฉัน 3. จากนั้นฉันเขียน " multiply 7" มันให้ 21 ฉันแล้วฉันต้องการทราบว่ามันเป็นนายกฉันเขียน " is prime" (ในจำนวนปัจจุบัน - 21) มันทำให้ฉันเป็นเท็จ " is odd" จะให้ฉันจริง และอื่น ๆ

ตอนนี้สำหรับแอ็พพลิเคชันแบบง่ายที่มีคำสั่งไม่กี่อย่างแม้แต่แบบธรรมดาswitchก็สามารถทำได้เพื่อประมวลผลคำสั่ง แต่ถ้าฉันต้องการความสามารถในการขยายฉันจะต้องใช้ฟังก์ชันนี้อย่างไร ฉันใช้รูปแบบคำสั่งหรือไม่ ฉันจะสร้าง parser / interpreter ง่าย ๆ สำหรับภาษาได้หรือไม่? ถ้าฉันต้องการคำสั่งที่ซับซ้อนมากขึ้นเช่น " multiply 5 until >200" สิ่งที่จะเป็นวิธีที่ง่ายในการขยาย (เพิ่มคำสั่งใหม่) โดยไม่ต้องคอมไพล์ใหม่?

แก้ไข: เพื่อชี้แจงบางสิ่งบางอย่างเป้าหมายสุดท้ายของฉันจะไม่ทำให้สิ่งที่คล้ายกับ WolframAlpha แต่เป็นตัวประมวลผลรายการ (ของตัวเลข) แต่ฉันต้องการที่จะเริ่มช้าในตอนแรก (ในตัวเลขเดียว)

ฉันกำลังนึกอะไรบางอย่างที่คล้ายกับวิธีที่จะใช้ Haskell ในการประมวลผลรายการ แต่เป็นรุ่นที่ง่ายมาก ฉันสงสัยว่าบางอย่างเช่นรูปแบบคำสั่ง (หรือเทียบเท่า) จะพอเพียงหรือถ้าฉันต้องสร้างมินิภาษาใหม่และใช้ parser เพื่อให้บรรลุเป้าหมาย

แก้ไข 2: ขอบคุณสำหรับคำตอบทั้งหมดที่เป็นประโยชน์กับฉัน แต่ Emmad Kareem ช่วยฉันมากที่สุดดังนั้นฉันจะเลือกเป็นคำตอบ ขอบคุณอีกครั้ง!


2
ฉันไม่ได้รับคะแนนโหวต โปรดระบุเหตุผลของคุณเพื่อให้ฉันสามารถกำหนดคำถามของฉันได้ดีขึ้นในครั้งต่อไป
Nini Michaels

2
ฉันชอบคำถามนี้จริงๆ รอคอยที่จะเห็นสิ่งที่ผู้คนแนะนำการออกแบบ คุณกำลังมองหาการออกแบบเชิงวัตถุโดยเฉพาะ (คุณพูดถึงรูปแบบคำสั่งซึ่งเป็นรูปแบบ OO) หรือไม่?
Bjarke Freund-Hansen

ขอบคุณ :) ใช่ฉันจะชอบ OOP แต่ฉันจะไม่รังเกียจถ้ามีวิธีอื่นแนะนำ!
Nini Michaels

2
ดูเหมือนว่าจะมีการใช้งานReverse Polish Notationซึ่งเป็นหัวข้อการเขียนโปรแกรมที่ยอดเยี่ยมมาก!
Alberto De Caro

2
คุณอาจตกเหม็นของหนังสือข้อจากสิ่งที่ชนิดของคำถามที่ฉันควรจะไม่ได้ขอให้ที่นี่? ในคำถามที่พบบ่อยคือหากคุณสามารถจินตนาการหนังสือทั้งเล่มที่ตอบคำถามของคุณคุณจะขอมากเกินไป
Mark Booth

คำตอบ:


5

ฟังดูเหมือนล่าม ดูเหมือนว่าคุณกังวลเกี่ยวกับการใช้งานมากกว่าฟังก์ชั่นโดยละเอียด (ฉันเดาได้เฉพาะที่นี่) โครงการนี้หากขยายออกไปไม่ใช่งานที่ไม่สำคัญ ตรวจสอบให้แน่ใจว่าคุณศึกษาขอบเขตอย่างชัดเจนเนื่องจากต้องใช้วิธีการทางวิศวกรรมและไม่ใช่วิธีการพัฒนาแบบเฉพาะกิจเพื่อรับผลิตภัณฑ์ที่น่าเชื่อถือมากกว่าผลิตภัณฑ์ที่มีแพตช์ 1,000 รายการที่ใช้งานได้ในบางครั้งเท่านั้น

ตัดสินใจเกี่ยวกับไวยากรณ์และพร้อมที่จะแยกวิเคราะห์และดำเนินการตรวจสอบไวยากรณ์ที่จำเป็น การเชื่อมโยงนี้อาจช่วยให้คุณมีนี้: สร้างแยกวิเคราะห์ของคุณเอง

ลองดูที่: หัวข้อนี้มันสัมผัสในแง่มุมที่แตกต่างกันของการทำงานนอกจากนี้ยังมีการเชื่อมโยงที่ดีที่อาจช่วยให้คุณ (พิเศษคำตอบโดย RMK) .: สร้างล่ามภาษา คุณอาจต้องการที่จะเห็นตัวอย่างของการมองหาโครงการที่ดีที่จะค่อนข้างคล้ายที่: สุดยอดโปรแกรมได้เครื่องคิดเลขวิทยาศาสตร์ คุณสามารถค้นหารหัสแหล่งที่มาและโปรแกรมที่ทำงานให้กับบรรทัดคำสั่ง C # ล่ามที่นี่Command-Line-การดำเนินงานของ C # สำเร็จรูปสำหรับการเรียนการสอน การใช้คอมไพเลอร์เพื่อทำงานที่ซับซ้อนสำหรับคุณเช่นการแยกวิเคราะห์และการพิมพ์ตัวแปร ฯลฯ อาจเป็นวิธีที่ชาญฉลาดในการหลีกเลี่ยงความซับซ้อนในการเขียนทั้งหมดนี้ด้วยตัวคุณเอง นอกจากนี้ยังมีตัวเลือกโมโนซึ่งมีคุณลักษณะ charp เปลือกที่คุณอาจต้องการที่จะดูที่: CsharpRepl


ขอบคุณลิงค์ของคุณมีประโยชน์จริงๆ! ดังนั้นฉันเดาว่าล่ามน่าจะเป็นตัวเลือกที่ดีที่สุดถ้าฉันต้องการที่จะขยายออกไปอย่างง่ายดาย
Nini Michaels

ขอบคุณสำหรับความคิดเห็นฉันเดาว่าการเริ่มต้นด้วยลิงก์ไปยัง CodeProject อาจเป็นความคิดที่ดี
NoChance

2

ถ้าคุณไม่สนใจเขียนตัวแยกวิเคราะห์จริงๆสำหรับตัวคุณเองโดยเฉพาะฉันขอแนะนำให้ดูที่กรอบตัวสร้างตัวแยกวิเคราะห์ตัวใดตัวหนึ่ง สำหรับ C คุณมีYACCหรือBisonแต่ควรมีทางเลือกอื่นสำหรับภาษาอื่นถ้าคุณต้องการ

สิ่งเหล่านี้จะนำความซับซ้อนของการแยกไวยากรณ์ที่ซับซ้อนออกไปและช่วยให้คุณมีสมาธิกับงานที่คุณต้องการทำ แน่นอนว่านี่อาจเกินความจำเป็นสำหรับไวยากรณ์ที่คุณแนะนำในคำถาม แต่เนื่องจากคุณพูดถึงว่ามีตัวเลือกในการขยายไปสู่ไวยากรณ์ที่ซับซ้อนมากขึ้นในภายหลังอย่างน้อยก็คุ้มค่าที่จะได้รับแรงบันดาลใจจากกรอบเหล่านี้


1
ปัญหากับตัวแยกวิเคราะห์ส่วนใหญ่คือสิ่งประดิษฐ์ของพวกเขาเป็นแบบคงที่และไม่ยืมตัวเองเพื่อขยาย ฉันคิดว่า OP น่าจะใช้งานได้ดีขึ้นกับบางสิ่งที่คล้ายกับเอ็นจิ้นกฎซึ่ง "กฎ" (คำหลักและไวยากรณ์) จะถูกเก็บไว้ในโครงสร้างข้อมูลที่ยืดหยุ่นและประเมินหลังจากป้อนข้อมูลแต่ละครั้ง
TMN

2

สิ่งที่คุณกำลังอธิบายอยู่ใกล้กับภาษาสแต็

ตัวอย่างเช่นในFactorสิ่งที่คุณอธิบายจะเป็นเช่นนั้น

1
2 +
7 *
even? not

หรือคุณสามารถกำหนดคำศัพท์ของคุณเองแล้วใช้มันเช่น

: add ( x y -- sum ) + ;
: multiply ( x y -- product ) * ;
: odd? ( n -- ? ) even? not ;

ด้วยคำจำกัดความเหล่านี้ตัวอย่างข้างต้นจะกลายเป็น

1
2 add
7 multiply
odd?

โดยปกติแล้วภาษาสแต็กจะไม่สำคัญในการแยกวิเคราะห์เพราะใช้คำเดียวที่แยกช่องว่าง ฉันขอแนะนำให้คุณดูปัจจัย - อาจเป็นสิ่งที่คุณต้องการ ควรกำหนดคำที่ใช้ในการประมวลผลที่คุณต้องการได้ง่าย

แก้ไข : หากคุณต้องการออกแบบภาษาที่คล้ายกันจริงฉันขอแนะนำให้คุณเล่นกับหนึ่งในนั้น การแยกภาษาสแต็กเป็นเรื่องเล็กน้อย - คุณแบ่งในพื้นที่ว่างและการดำเนินการที่ไร้เดียงสาเป็นเรื่องง่าย: คุณเพียงแค่ต้องดูแลสิ่งที่เกิดขึ้นในสแต็ก


ฟังดูง่ายและเป็นจุดเริ่มต้นที่ดี ขอบคุณ!
Nini Michaels

1

แต่ถ้าฉันต้องการความสามารถในการขยายฉันจะต้องใช้ฟังก์ชันนี้อย่างไร

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

ฉันใช้รูปแบบคำสั่งหรือไม่

คุณทำได้ แต่อาจไม่เหมาะสม

คุณจะไม่รับอินพุตทั้งหมดและส่งออกไปเพื่อการประมวลผล แต่แทนที่จะแยกวิเคราะห์อินพุตส่งไปยังตัวจัดการที่ถูกต้องและปล่อยให้มันทำงานได้ คำสั่งไม่แตกต่างกันในการสื่อสารนั้น ไม่มีรูปแบบคำสั่ง

ฉันจะสร้าง parser / interpreter ง่าย ๆ สำหรับภาษาได้หรือไม่?

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

แต่เป็นการประมวลผลรายการ (ของตัวเลข)

แล้วบางทีคุณควรมีลักษณะเป็นภาษารายการการประมวลผล การวางตำแหน่งของโค้ดและข้อมูลควรสอดคล้องกับสิ่งที่คุณอธิบาย


ขอบคุณสำหรับคำแนะนำ สำหรับ LISP ฉันคุ้นเคยกับมันและคุ้นเคยกับ Haskell มากขึ้นซึ่งเป็นแรงบันดาลใจให้ฉันกับแนวคิดนี้ อย่างไรก็ตามถึงแม้ว่าฉันจะเริ่มต้นใหม่ได้บ้างฉันต้องการทำให้มือสกปรกด้วยคำสั่งในการประมวลผลและตีความมัน ดังนั้นมันจึงมีจุดประสงค์เพื่อการศึกษานอกเหนือจาก "การประมวลผลรายการ" จริง ๆ :)
Nini Michaels

@NiniMichaels แน่นอน แต่เท่าที่การออกแบบสำหรับความสามารถในการขยายไปโดยใช้การจัดระเบียบ / การผูกมัดของโค้ด / ข้อมูลของ lisp ไม่ใช่ตัวเลือกที่ไม่ดี
Telastyn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.