คุณแยกวิเคราะห์ได้อย่างไร
if (a > b && foo(param)) {
doSomething();
} else {
doSomethingElse();
}
ต้นไม้แยกอาจดูเหมือนอะไร
if:
condition:
and:
lt:
left: a
right: b
function:
name: foo
param: param
true-block:
function:
name: doSomething
false-block:
function:
name: doSomethingElse
อืม ... มาเรียงลำดับต้นไม้นี้เป็นรายการ
if(and(<(a, b), function(foo, param)), function(doSomething), function(doSomethingElse))
รูปแบบการแยกวิเคราะห์ต้นไม้นี้จัดการได้ง่าย แต่ฉันมีปัญหาหนึ่ง ฉันเกลียดคั่น ฉันชอบเทอร์มินัล ในเวลาเดียวกันฉันชอบโรยในช่องว่าง
if( and (<(a b) function(foo param)) function (doSomething) function ( doSomethingElse))
อืม ... ช่องว่างเพิ่มเติมทำให้บางสิ่งยากขึ้นในการแยกวิเคราะห์ ... บางทีฉันอาจสร้างกฎที่ต้นไม้แทน (ใบลีบใบ)
(if (and (< a b) (function foo param)) (function doSomething) (function doSomethineElse)
ทีนี้การทำให้เป็นอันดับของต้นไม้แยกเป็น lisp (เปลี่ยนชื่อฟังก์ชั่นที่จะใช้และสิ่งนี้อาจทำงาน) ถ้าฉันต้องการโปรแกรมที่เขียนโปรแกรมมันเป็นเรื่องดีที่จะจัดการต้นไม้แยก
นี่ไม่ใช่การแสดงออกของ s ทั้งหมด แต่ได้รับการระบุล่วงหน้าและเป็นคุณลักษณะหนึ่งที่โปรแกรมเมอร์ใช้เสียงกระเพื่อม โปรแกรมของเราได้รับการวิเคราะห์ล่วงหน้าในบางแง่มุมและการเขียนโปรแกรมเพื่อจัดการโปรแกรมนั้นค่อนข้างง่ายเนื่องจากรูปแบบ นั่นเป็นสาเหตุที่บางครั้งการขาดไวยากรณ์ก็ถือว่าเป็นจุดแข็ง
แต่อย่างที่เดวิดพูดให้ใช้เครื่องมือแก้ไขการแสดงออกแบบนิพจน์ คุณมีแนวโน้มที่จะสูญเสียการติดตามการปิดวงเล็บในนิพจน์ s มากกว่าการปิดวงเล็บใน xml ( </foo>
ปิดเท่านั้น<foo>
แต่การปิดวงเล็บขวาปิดการแสดงออกใด ๆ ) ในแร็กเก็ตการใช้วงเล็บเหลี่ยมสำหรับการแสดงออกบางอย่างควบคู่ไปกับสไตล์การเยื้องที่ดีแก้ไขปัญหาส่วนใหญ่
รุ่นเสียงกระเพื่อม:
(if (and (< a b) (foo param))
(doSomething)
(doSomethingElse))
ก็ไม่เลวนะ.