นี่คือคำสั่ง cpphs-hugs ที่สามารถเรียกใช้ในผู้ให้บริการโฮสต์ฟรีของ OnWorks โดยใช้หนึ่งในเวิร์กสเตชันออนไลน์ฟรีของเรา เช่น Ubuntu Online, Fedora Online, โปรแกรมจำลองออนไลน์ของ Windows หรือโปรแกรมจำลองออนไลน์ของ MAC OS
โครงการ:
ชื่อ
cpphs - ตัวประมวลผลล่วงหน้าที่คล้ายกับ cpp-a-like สำหรับ Haskell
เรื่องย่อ
cpph [ชื่อไฟล์|ทางเลือกที่] ...
DESCRIPTION
cpph เป็นการนำกลับมาใช้ใหม่อย่างเสรีของ ซีพี (1) ตัวประมวลผลล่วงหน้า C ในและสำหรับ
ฮาสเคลล์.
ทำไมต้องใช้ cpp อีกครั้ง ถูกหรือผิด C พรีโปรเซสเซอร์ใช้กันอย่างแพร่หลายใน Haskell
รหัสแหล่งที่มา. เปิดใช้งานการคอมไพล์แบบมีเงื่อนไขสำหรับคอมไพเลอร์ที่แตกต่างกัน, different
คอมไพเลอร์รุ่นเดียวกันและแพลตฟอร์มระบบปฏิบัติการที่แตกต่างกัน นอกจากนี้ยังใช้เป็นครั้งคราว
สำหรับภาษามาโคร ซึ่งสามารถเปิดใช้งานรายละเอียดเฉพาะแพลตฟอร์มบางรูปแบบได้
การเติมเต็ม เช่น การสร้างคำจำกัดความของอินสแตนซ์และ FFI . ต้นแบบที่น่าเบื่อ
ประกาศ อย่างไรก็ตาม มีปัญหาสองประการกับ cpp นอกเหนือจากความสวยงามที่เห็นได้ชัด
คน:
สำหรับระบบ Haskell บางระบบ โดยเฉพาะ Hugs บน Windows ไม่มี cpp จริงโดย
ค่าเริ่มต้น.
แม้แต่สำหรับระบบ Haskell อื่น cpp ทั่วไปที่มีให้โดย gcc 3.x series
กำลังเปลี่ยนแปลงอย่างละเอียดในลักษณะที่ไม่เข้ากันกับไวยากรณ์ของ Haskell มี
มักมีปัญหากับช่องว่างสตริงและอักขระเฉพาะใน
ตัวระบุ ปัญหาเหล่านี้จะยิ่งแย่ลงเท่านั้น
ดังนั้นจึงดูเหมือนถูกต้องที่จะพยายามจัดหาทางเลือกอื่นให้กับ cpp ซึ่งทั้งคู่เข้ากันได้มากกว่า
Haskell และตัวมันเองเขียนด้วย Haskell เพื่อให้สามารถแจกจ่ายด้วยคอมไพเลอร์ได้
cpph ค่อนข้างมีคุณสมบัติครบถ้วนและเข้ากันได้กับ สไตล์ทรง สไตล์ซีพี
มันมีสองโหมด:
การรวบรวมตามเงื่อนไขเท่านั้น (--โนมาโคร),
และการขยายมาโครแบบเต็ม (ค่าเริ่มต้น)
In --โนมาโคร โหมด, cpph ดำเนินการคอมไพล์ตามเงื่อนไขเท่านั้น เช่น #includeของ,
#ถ้า'ทราย #ifdefถูกประมวลผลตามคำจำกัดความการแทนที่ข้อความ (ทั้งคำสั่ง-
บรรทัดและภายใน) แต่ไม่มีการขยายมาโครแบบกำหนดพารามิเตอร์ เต็ม
โหมดความเข้ากันได้ (ค่าเริ่มต้น) การแทนที่ข้อความและการขยายมาโครก็เช่นกัน
ประมวลผลในส่วนที่เหลือของข้อความที่ไม่ใช่ cpp
คุณสมบัติการทำงาน:
#ifdef การรวบรวมเงื่อนไขอย่างง่าย
#ถ้า ภาษาบูลีนเต็มรูปแบบของคำนิยาม (), &&, ||, == เป็นต้น
#เอลิฟ เงื่อนไขที่ถูกล่ามโซ่
#กำหนด
คำจำกัดความในบรรทัด (การแทนที่ข้อความและมาโคร)
#อันเดฟ การเพิกถอนคำจำกัดความในบรรทัด
#include
รวมไฟล์
#ไลน์ คำสั่งหมายเลขบรรทัด
\n ความต่อเนื่องของบรรทัดภายใน # directives ทั้งหมด
/ ** / token catenation ภายในคำจำกัดความของมาโคร
## Catenation โทเค็นสไตล์ ANSI
# การแปลงสตริงโทเค็นสไตล์ ANSI
__ไฟล์__
การแทนที่ข้อความพิเศษสำหรับข้อความแสดงข้อผิดพลาด DIY
__ไลน์__
การแทนที่ข้อความพิเศษสำหรับข้อความแสดงข้อผิดพลาด DIY
__วันที่__
การแทนที่ข้อความพิเศษ
__เวลา__
การแทนที่ข้อความพิเศษ
การขยายมาโครเป็นแบบเรียกซ้ำ การกำหนดชื่อแมโครใหม่จะไม่สร้างคำเตือน
สามารถกำหนดมาโครบนบรรทัดคำสั่งด้วย -D เช่นเดียวกับการเปลี่ยนข้อความ มาโคร
ชื่อได้รับอนุญาตให้เป็นตัวระบุ Haskell เช่น เฉพาะ ` และ backtick ´
อักขระซึ่งหลวมกว่าภาษา C เล็กน้อย แต่ยังไม่รวมตัวดำเนินการ
สัญลักษณ์
จำนวนบรรทัดในเอาต์พุตถูกรักษาไว้เพื่อให้ตัวประมวลผลในภายหลังสามารถให้
ข้อความแสดงข้อผิดพลาดที่มีความหมาย เมื่อไฟล์เป็น #include'NS, cpph แทรก #ไลน์ คำสั่งสำหรับ
เหตุผลเดียวกัน การกำหนดหมายเลขควรถูกต้องแม้ในกรณีที่มีการต่อบรรทัด
ถ้าคุณไม่ต้องการ #ไลน์ คำสั่งในผลลัพธ์สุดท้าย ใช้ --โนลีน ตัวเลือก
ข้อผิดพลาดทางไวยากรณ์ในคำสั่ง cpp จะส่งข้อความถึง stderr และหยุดโปรแกรม
ความล้มเหลวในการค้นหาไฟล์ #include'd ทำให้เกิดคำเตือนถึง stderr แต่การประมวลผลจะดำเนินต่อไป
คุณสามารถระบุชื่อไฟล์จำนวนเท่าใดก็ได้บนบรรทัดคำสั่ง ผลลัพธ์ขึ้นอยู่กับ
เอาต์พุตมาตรฐาน
-Dซิม กำหนดข้อความแทนที่ (ค่าเริ่มต้นคือ 1)
-ดีซิม=คลื่น
กำหนดข้อความแทนที่ด้วยค่าเฉพาะ
-Iเส้นทาง เพิ่มไดเร็กทอรีในเส้นทางการค้นหาสำหรับ #include's
-Oไฟล์ ระบุไฟล์สำหรับเอาต์พุต (ค่าเริ่มต้นคือ stdout)
--โนมาโคร
ประมวลผลเฉพาะ #ifdef's และ #include's
อย่าขยายมาโคร
--โนลีน
ลบ #line drops ออกจากเอาต์พุต
--สตริป
แปลงความคิดเห็นสไตล์ C เป็นช่องว่างแม้อยู่ภายนอก
คำสั่ง cpp
--แฮช
รู้จักตัวดำเนินการ stringise ของ ANSI # และ ## สำหรับ
token catenation ภายในมาโคร
--ข้อความ ถือว่าอินพุตเป็นข้อความธรรมดา ไม่ใช่รหัส Haskell
--เค้าโครง
รักษาบรรทัดใหม่ภายในการขยายมาโคร
--ไม่สว่าง
ลบความคิดเห็นแบบผู้รู้หนังสือ
--รุ่น
รายงานหมายเลขเวอร์ชันของ cpphs และหยุด
ไม่มีการแทนที่ข้อความที่กำหนดไว้โดยค่าเริ่มต้น (cpp ปกติมักจะมีคำจำกัดความ
สำหรับเครื่อง ระบบปฏิบัติการ ฯลฯ คุณสามารถเพิ่มสิ่งเหล่านี้ลงในซอร์สโค้ด cpph ได้อย่างง่ายดาย หากคุณต้องการ)
ค้นหาเส้นทางการค้นหาตามลำดับของ -I ยกเว้นว่าไดเร็กทอรีของ
ไฟล์การเรียก จากนั้นไดเร็กทอรีปัจจุบันจะถูกค้นหาก่อนเสมอ อีกครั้งไม่มี
เส้นทางการค้นหาเริ่มต้น (และอีกครั้ง นี้สามารถเปลี่ยนแปลงได้อย่างง่ายดาย)
ความแตกต่าง จาก CPP
โดยทั่วไป cpphs ขึ้นอยู่กับ สไตล์ทรง พฤติกรรม ไม่ใช่ ANSI C และมี
ตามความแตกต่างหลักจาก cpp มาตรฐาน
ทั่วไป
เทศกาล # ที่แนะนำคำสั่ง cpp ใด ๆ จะต้องอยู่ในคอลัมน์แรกของบรรทัด (ในขณะที่
ANSI อนุญาตช่องว่างก่อน # ).
สร้าง #ไลน์ n "ชื่อไฟล์" ไวยากรณ์ ไม่ใช่ # n "ชื่อไฟล์" ตัวแปร
ความคิดเห็น C จะถูกลบออกจากภายในคำสั่ง cpp เท่านั้น ไม่พรากจากผู้อื่น
ข้อความ. พิจารณาตัวอย่างเช่นใน Haskell สิ่งต่อไปนี้ทั้งหมดเป็นตัวดำเนินการที่ถูกต้อง
สัญลักษณ์: /* */ * / * อย่างไรก็ตาม คุณสามารถเปิดการลบความคิดเห็น C ด้วยปุ่ม --สตริป ตัวเลือก
แมโคร language
ยอมรับ / ** / สำหรับการวางโทเค็นในคำจำกัดความของมาโคร อย่างไรก็ตาม, /* */ (มีข้อความใด ๆ
ระหว่างความคิดเห็นเปิด/ปิด) แทรกช่องว่าง
ANSI ## ตัวดำเนินการวางโทเค็นสามารถใช้ได้กับ --แฮช ธง. นี่คือการหลีกเลี่ยง
ตีความโอเปอเรเตอร์ Haskell ที่ถูกต้องที่มีชื่อเดียวกันผิด
แทนที่พารามิเตอร์ที่เป็นทางการของมาโครด้วยค่าจริง แม้จะอยู่ภายในสตริง (double หรือ single
ยกมา) นี่เป็นพฤติกรรมดั้งเดิม ไม่รองรับใน ANSI
ตระหนักถึง # ตัวดำเนินการ stringisation ในคำจำกัดความของมาโครก็ต่อเมื่อคุณใช้ --แฮช
ตัวเลือก. (เป็นส่วนเพิ่มเติมของ ANSI เท่านั้น เนื่องจากสตริงที่ยกมา (ด้านบน) is
ห้ามโดย ANSI)
รักษาช่องว่างภายในคำจำกัดความการแทนที่ข้อความ (การขึ้นบรรทัดใหม่แบบโมดูล)
แต่พื้นที่นำหน้าและต่อท้ายถูกตัดออก
รักษาช่องว่างภายในคำจำกัดความของมาโคร (และต่อท้าย) ทุกประการ (modulo
ขึ้นบรรทัดใหม่) แต่พื้นที่นำหน้าจะถูกตัดออก
รักษาช่องว่างภายในอาร์กิวเมนต์การเรียกแมโครทุกประการ (รวมถึงการขึ้นบรรทัดใหม่) แต่นำหน้า
และช่องว่างต่อท้ายจะถูกตัดออก
กับ --เค้าโครง ตัวเลือก ความต่อเนื่องของบรรทัดในการแทนที่ข้อความหรือคำจำกัดความของมาโคร
จะถูกเก็บไว้เป็นการขึ้นบรรทัดใหม่ในการเรียกมาโคร (มีประโยชน์สำหรับโค้ดที่ไวต่อเลย์เอาต์ใน
ฮาสเคลล์)
ใช้ cpphs-hugs ออนไลน์โดยใช้บริการ onworks.net