FIRST & FOLLOW Parsing Table Chainate, W.
E TA A +TA | ɛ T FB B *FB | ɛ F ( E ) | id หา FIRST (1) หาค่า ɛ ว่าเป็นสมาชิกใน FIRST ของสัญลักษณ์ไม่สิ้นสุดตัวใดได้บ้าง ɛ FIRST(A) ɛ FIRST(B) E TA A +TA | ɛ T FB B *FB | ɛ F ( E ) | id
E TA A +TA | ɛ T FB B *FB | ɛ F ( E ) | id หา FIRST (2) E TA A +TA | ɛ T FB B *FB | ɛ F ( E ) | id + * ( ) id E A T B F
E TA A +TA | ɛ T FB B *FB | ɛ F ( E ) | id หา FIRST E TA A +TA | ɛ T FB B *FB | ɛ F ( E ) | id + * ( ) id E A T B F
E TA A +TA | ɛ T FB B *FB | ɛ F ( E ) | id หา FOLLOW E TA A +TA | ɛ T FB B *FB | ɛ F ( E ) | id FOLLOW E A T B F
Parsing table E TA A +TA | ɛ T FB B *FB | ɛ F ( E ) | id เป็นตาราง 2 มิติ ขนาด m คูณ n m is non-terminal symbols n is terminal symbols + 1 ($) สำหรับแต่ละกฏ X ให้ใส่กฏนี้ในช่อง [X, a] เมื่อ a ɛ FIRST() และ ถ้า ɛ FIRST() ใส่กฏนี้ในตารางตรงช่อง [X, b] เมื่อ b FOLLOW(X) Parsing table E TA A +TA | ɛ T FB B *FB | ɛ F ( E ) | id
ไวยากรณ์ไม่พึ่งบริบท (context free grammar) ที่นำมาสร้างตารางวิเคราะห์การกระจาย (parsing table) ของตัววิเคราะห์กระจายทำนายไม่เรียกซ้ำ (nonrecursive predictive parser) แล้วในช่องมีมากกว่า 1 กฏ แสดงว่าตารางนั้นเกิดความขัดแย้ง และไวยากรณ์ดังกล่าวจะไม่เป็นไวยากรณ์ LL(1) รวมถึงไวยากรณ์กำกวมด้วย ลองทำ FIRST & FOLLOW และ parsing table จากไวยากรณ์นี้ดูซิ... S iEtAB B eA | ɛ E b A S | a ความขัดแย้ง !!
ไวยากรณ์ LL(1) CFG จะเป็นไวยากรณ์ LL(1) ก็ต่อเมื่อ X 1 | 2 | … | n แล้วจะได้ว่า FIRST( i) FIRST( j) = สำหรับ ij i * แล้ว FIRST( j) FOLLOW(X) = สำหรับ j I ไวยากรณ์ต่อไปนี้เป็นไวยากรณ์ LL(1) หรือไม่ S iEtSA | a A eS | E b ไวยากรณ์ LL(1)
การเกิดซ้ำซ้าย (Left recursion) Non-terminal symbols ใดๆ มีการเกิดซ้ำซ้าย ถ้า X + X ซึ่งเราสามารถตรวจสอบได้โดยใช้เมทริกซ์ที่ใช้หา FIRST CFG ที่มี NT อย่างน้อยหนึ่งตัวมีการเกิดซ้ำซ้าย จะไม่เป็นไวยากรณ์ LL(1) ในกรณีที่มีกฏ X X เราจะกล่าวได้ว่ามีการเกิดซ้ำซ้ายทันที และสามารถขจัดการเกิดซ้ำซ้ายด้วยการเขียนกฏที่อยู่ในรูป X X1|X2|…|Xm|1|2|…|n ให้กลายเป็น X 1Y|2Y|…|nY Y 1Y|2Y|…|mY เมื่อ Y เป็น NT ตัวใหม่ การเกิดซ้ำซ้าย (Left recursion)
การเกิดซ้ำซ้าย (Left recursion) จงเปลี่ยนไวยากรณ์ต่อไปนี้ ให้ไม่มีการเกิดซ้ำซ้าย E E+T | E-T | T T T*F | T/F | F F -F | +F | P P (E) | id การเกิดซ้ำซ้าย (Left recursion)
ตัวประกอบซ้าย (left factoring) CFG: X1 | 2 เมื่อ จะไม่เป็นไวยากรณ์ LL(1) เพราะ FIRST( 1) FIRST( 2) เราเรียก ว่า ตัวประกอบซ้าย (left-factoring) เราสามารถเขียนกฏซึ่งอยู่ในรูป X1| 2 |…| n เมื่อ เป็น prefix ที่ยาวที่สุดและ ดังนี้ XY Y1| 2 |…| n เมื่อ Y เป็น NT ตัวใหม่ ตัวประกอบซ้าย (left factoring)