อะไรทำให้ Java แยกวิเคราะห์ได้ง่ายกว่า C
ฉันคุ้นเคยกับข้อเท็จจริงที่ว่าไวยากรณ์ของ C และ C ++ มีความละเอียดอ่อนตามบริบทและโดยเฉพาะอย่างยิ่งคุณต้องมี "lexer hack" ใน C ในทางกลับกันฉันรู้สึกว่าคุณสามารถแยกวิเคราะห์ Java ได้เพียง 2 โทเค็นแห่งการมองไปข้างหน้าแม้จะมีความคล้ายคลึงกันมากระหว่างสองภาษา คุณต้องเปลี่ยนแปลงอะไรเกี่ยวกับ C เพื่อให้สามารถแยกวิเคราะห์ได้ง่ายขึ้น ฉันถามเพราะตัวอย่างทั้งหมดที่ฉันเคยเห็นเกี่ยวกับความไวต่อบริบทของ C นั้นสามารถทำได้ในทางเทคนิค แต่ก็แปลกมาก ตัวอย่างเช่น, foo (a); อาจจะมีการเรียกฟังก์ชันโมฆะกับข้อโต้แย้งfoo aหรืออาจเป็นการประกาศว่าaเป็นวัตถุประเภทหนึ่งfooแต่คุณสามารถกำจัด parantheses ได้อย่างง่ายดาย ส่วนหนึ่งความแปลกนี้เกิดขึ้นเนื่องจากกฎการผลิต "ผู้ประกาศโดยตรง" สำหรับไวยากรณ์ Cตอบสนองวัตถุประสงค์สองประการในการประกาศทั้งฟังก์ชันและตัวแปร ในทางกลับกันไวยากรณ์ Javaมีกฎการผลิตแยกต่างหากสำหรับการประกาศตัวแปรและการประกาศฟังก์ชัน ถ้าคุณเขียน foo a; คุณจะรู้ว่ามันเป็นการประกาศตัวแปรและfooสามารถแยกวิเคราะห์เป็นชื่อประเภทได้อย่างชัดเจน นี่อาจไม่ใช่รหัสที่ถูกต้องหากfooไม่ได้กำหนดคลาสไว้ที่ใดที่หนึ่งในขอบเขตปัจจุบัน แต่นั่นเป็นงานสำหรับการวิเคราะห์เชิงความหมายที่สามารถดำเนินการได้ในคอมไพเลอร์พาสในภายหลัง ฉันเคยเห็นมันบอกว่า C นั้นยากที่จะแยกวิเคราะห์เนื่องจาก typedef แต่คุณสามารถประกาศประเภทของคุณเองใน Java ได้เช่นกัน กฎไวยากรณ์ภาษา C …