คำถามติดแท็ก parsers

คำถามเกี่ยวกับอัลกอริทึมที่ตัดสินว่าสตริงที่กำหนดเป็นของภาษาทางการแบบตายตัวหรือไม่

1
การเปรียบเทียบทางทฤษฎีภาษาของ LL และไวยากรณ์กรัม
ผู้คนมักบอกว่าตัวแยกวิเคราะห์LR (k)นั้นมีพลังมากกว่าตัวแยกวิเคราะห์LL (k) ข้อความเหล่านี้ส่วนใหญ่คลุมเครือ โดยเฉพาะอย่างยิ่งเราควรเปรียบเทียบคลาสสำหรับคงที่หรือสหภาพกับkทั้งหมดหรือไม่ ดังนั้นสถานการณ์เป็นอย่างไร โดยเฉพาะอย่างยิ่งฉันสนใจที่ LL (*) จะเข้ากันได้อย่างไรkkkkkk เท่าที่ฉันรู้ชุดของตัวแยกไวยากรณ์ LL และ LR ที่เกี่ยวข้องนั้นเป็น orthogonal ดังนั้นให้เราพูดถึงภาษาที่สร้างขึ้นโดยชุดของไวยากรณ์ที่เกี่ยวข้อง ให้แสดงถึงระดับของภาษาที่สร้างขึ้นโดยไวยากรณ์ที่สามารถแยกวิเคราะห์โดยตัวแยกวิเคราะห์L R ( k )และคล้ายกับคลาสอื่น ๆL R ( k )LR(k)LR(k)L R ( k )LR(k)LR(k) ฉันสนใจในความสัมพันธ์ต่อไปนี้: L L ( k ) ⊆?L R ( k )LL(k)⊆?LR(k)LL(k) \overset{?}{\subseteq} LR(k) ⋃∞i=1LL(k)⊆?⋃∞i=1LR(k)⋃i=1∞LL(k)⊆?⋃i=1∞LR(k)\bigcup_{i=1}^{\infty} LL(k) \overset{?}{\subseteq} \bigcup_{i=1}^{\infty} LR(k) ⋃∞i=1LL(k)=?LL(∗)⋃i=1∞LL(k)=?LL(∗)\bigcup_{i=1}^{\infty} …

1
มีขั้นตอนวิธีการแยก CFG nongeneral ที่รับรู้ EPAL หรือไม่
EPAL ภาษาของ palindromes คู่ถูกกำหนดเป็นภาษาที่สร้างขึ้นโดยไวยากรณ์บริบทที่ไม่มีความชัดเจนต่อไปนี้: S→aaS→aaS \rightarrow a a S→bbS→bbS \rightarrow b b S→aSaS→aSaS \rightarrow a S a S→bSbS→bSbS \rightarrow b S b EPAL เป็น 'bane' ของอัลกอริทึมการแยกวิเคราะห์หลายอย่าง: ฉันยังไม่เคยพบอัลกอริทึมการแยกวิเคราะห์สำหรับ CFG ที่ไม่คลุมเครือซึ่งสามารถแยกไวยากรณ์ใด ๆ ที่อธิบายภาษา มักใช้เพื่อแสดงว่ามี CFG ที่ไม่คลุมเครือซึ่งไม่สามารถแยกวิเคราะห์โดยตัวแยกวิเคราะห์เฉพาะได้ นี่เป็นแรงบันดาลใจให้กับคำถามของฉัน: มีอัลกอริธึมการแยกวิเคราะห์ที่ยอมรับเฉพาะ CFG ที่ชัดเจนซึ่งใช้งานได้กับ EPAL หรือไม่ แน่นอนหนึ่งสามารถออกแบบ ad-hoc parser สอง pass- สำหรับไวยากรณ์ที่แยกวิเคราะห์ภาษาในเวลาเชิงเส้น ฉันสนใจวิธีการวิเคราะห์คำที่ไม่ได้ออกแบบมาเป็นพิเศษโดยคำนึงถึง EPAL

3
แยกวิเคราะห์ไวยากรณ์ที่ไม่มีบริบทโดยพลการซึ่งเป็นตัวอย่างสั้น ๆ
ฉันต้องการแยกภาษาเฉพาะโดเมนที่ผู้ใช้กำหนด ภาษาเหล่านี้มักจะใกล้กับสัญลักษณ์ทางคณิตศาสตร์ (ฉันไม่ได้แยกภาษาธรรมชาติ) ผู้ใช้กำหนด DSL ในสัญลักษณ์ BNF เช่นนี้ expr ::= LiteralInteger | ( expr ) | expr + expr | expr * expr การป้อนข้อมูลเช่น1 + ( 2 * 3 )ต้องได้รับการยอมรับในขณะที่การป้อนข้อมูลเช่น1 +ต้องได้รับการปฏิเสธเป็นไม่ถูกต้องและการป้อนข้อมูลเช่น1 + 2 * 3ต้องได้รับการปฏิเสธเป็นที่คลุมเครือ ความยากลำบากส่วนกลางที่นี่คือการรับมือกับไวยากรณ์ที่กำกวมในวิธีที่ใช้งานง่าย การ จำกัด ไวยากรณ์ให้ไม่คลุมเครือนั้นไม่ใช่ตัวเลือกนั่นคือวิธีการใช้ภาษา - แนวคิดคือผู้เขียนต้องการละเว้นวงเล็บเมื่อไม่จำเป็นต้องหลีกเลี่ยงความคลุมเครือ ตราบใดที่การแสดงออกไม่ชัดเจนฉันต้องแยกมันและถ้าไม่ฉันต้องปฏิเสธมัน โปรแกรมแยกวิเคราะห์ของฉันต้องทำงานกับไวยากรณ์ที่ไม่มีบริบทใด ๆ แม้แต่ที่คลุมเครือและต้องยอมรับอินพุตที่ไม่คลุมเครือทั้งหมด ฉันต้องการแผนผังการแยกวิเคราะห์สำหรับอินพุตที่ยอมรับทั้งหมด สำหรับการป้อนข้อมูลที่ไม่ถูกต้องหรือไม่ชัดเจนฉันต้องการข้อความแสดงข้อผิดพลาดที่ดี แต่เริ่มต้นด้วยสิ่งที่ฉันจะได้รับ โดยทั่วไปฉันจะเรียกใช้ parser …

2
สำหรับทุก regex 'ความชั่วร้าย' มีทางเลือกอื่นที่ไม่ใช่ความชั่วหรือปีศาจในไวยากรณ์หรือไม่?
เห็นได้ชัดว่าการโจมตีReDosใช้ประโยชน์จากคุณลักษณะของการแสดงออกปกติบางอย่าง (มีประโยชน์) บางอย่าง ... เป็นหลักทำให้เกิดการระเบิดของเส้นทางที่เป็นไปได้ผ่านกราฟที่กำหนดโดย NFA เป็นไปได้หรือไม่ที่จะหลีกเลี่ยงปัญหาดังกล่าวโดยการเขียน regex ที่ 'ไม่เลว'? ถ้าไม่ใช่ (ดังนั้นไวยากรณ์จะไม่สามารถจัดการในพื้นที่ / เวลาที่ใช้งานได้จริงโดย NFA) วิธีการแยกวิเคราะห์แบบใดจะดีกว่า ทำไม?

2
นิพจน์ทั่วไป
ถ้าฉันมีไวยากรณ์ประเภทที่ 3 มันสามารถถูกแสดงในออโตเมติกแบบกดลง (โดยไม่ต้องดำเนินการใด ๆ กับสแต็ก) ดังนั้นฉันจึงสามารถแสดงนิพจน์ทั่วไปโดยใช้ภาษาที่ไม่มีบริบท แต่ฉันจะรู้ได้อย่างไรว่าไวยากรณ์ 3 ประเภทคือ , L L ( 1 ) , S L R ( 1 )และอื่น ๆ โดยไม่ต้องสร้างตารางแยกวิเคราะห์?LR(1)LR(1)LR(1)LL(1)LL(1)LL(1)SLR(1)SLR(1)SLR(1)

1
ทำไมต้องแยก lexing และแยก?
เป็นไปได้ที่จะแยกวิเคราะห์เอกสารโดยใช้ผ่านเดียวจากเครื่องรัฐ ประโยชน์ของการมีสองรอบคืออะไร มี lexer เพื่อแปลงข้อความเป็นโทเค็นและมีเครื่องมือแยกวิเคราะห์เพื่อทดสอบกฎการผลิตของโทเค็นเหล่านั้นหรือไม่ ทำไมไม่มีบัตรผ่านเดียวที่ใช้กฎการผลิตโดยตรงกับข้อความ

2
IELR (1) -parser คืออะไร
ฉันพยายามสอนตัวเองเกี่ยวกับการใช้วัวกระทิง manpage bison (1) พูดเกี่ยวกับ bison: สร้าง LR deterministic LR หรือตัวแยกวิเคราะห์ LR (GLR) ทั่วไปที่ใช้ LALR (1), IELR (1), หรือ canonical LR (1) ตารางตัวแยกวิเคราะห์ ตัวแยกวิเคราะห์ IELR คืออะไร บทความที่เกี่ยวข้องทั้งหมดที่ฉันค้นพบในเว็บไซต์ทั่วโลกนั้นได้รับการชำระเงินแล้ว

1
เมื่อไหร่
จากบทความของ Wikipediaนั้น L ในหมายถึง "การสแกนจากซ้ายไปขวา" และ "R" หมายถึง "การสืบทอดที่ถูกต้องที่สุด" อย่างไรก็ตามในเอกสารต้นฉบับของ Knuth บนไวยากรณ์เขากำหนด (หน้า 610) เป็นภาษาที่ "สามารถแปลได้จากซ้ายไปขวาด้วยถูกผูกมัด"L R ( k )LR(k)LR(k)L R ( k )LR(k)LR(k)L R ( k)LR(k)LR(k)kkk ฉันคาดเดาว่าคำศัพท์ใหม่นี้ได้รับเลือกให้เติมเต็มแยกวิเคราะห์ "จากซ้ายไปขวาสแกนมาจากซ้ายสุด" ที่กล่าวว่าฉันไม่ทราบเมื่อคำศัพท์เปลี่ยนความหมายL L ( k )LL(k)LL(k) ไม่มีใครรู้ว่าตัวย่อใหม่ของมาจากไหน?L R ( k )LR(k)LR(k)

3
คุณจะได้อะไรถ้าคุณเพิ่มพารามิเตอร์ลงในไวยากรณ์ฟรีตามบริบท
ฉันคิดถึงไวยากรณ์สำหรับภาษาที่มีความอ่อนไหวและดูเหมือนว่าไวยากรณ์กรัมจะทำเคล็ดลับถ้ารวมกับพารามิเตอร์ ลองพิจารณาตัวอย่างนี้สำหรับไวยากรณ์ Python ที่ง่ายขึ้นในรูปแบบ ANTLR: // on top-level the statements have empty indent program : statement('')+ ; // let's consider only one compound statement and one simple statement for now statement(indent) : ifStatement(indent) | passStatement(indent) ; passStatement(indent) : indent 'pass' NEWLINE ; // statements under if must have current indent …

5
การไม่ใช้ความไม่แตกต่างจากระดับคืออะไร?
ฉันพยายามที่จะเข้าใจสิ่งที่มีความหมายโดย "deterministic" ในการแสดงออกเช่น "ไวยากรณ์บริบทที่ปราศจากการกำหนด" (มี "สิ่ง" ที่กำหนดขึ้นได้ในฟิลด์นี้) ฉันขอขอบคุณตัวอย่างมากกว่าคำอธิบายที่ซับซ้อนที่สุด! ถ้าเป็นไปได้. ความสับสนหลักของฉันมาจากการที่ไม่สามารถบอกได้ว่าคุณสมบัติของไวยากรณ์นี้แตกต่างจากความกำกวม (ไม่ใช่ -) อย่างไร ที่ใกล้เคียงที่สุดที่ฉันจะต้องค้นหาสิ่งที่มันหมายถึงเป็นคำพูดจากกระดาษโดย D. Knuth ในการแปลภาษาจากซ้ายไปขวา : Ginsburg และ Greibach (1965) ได้กำหนดแนวความคิดของภาษาที่กำหนดขึ้นมา เราแสดงในหมวดที่ 5 ว่าภาษาเหล่านี้เป็นภาษาที่มีไวยากรณ์ LR (k) อยู่จริง ซึ่งกลายเป็นวงกลมทันทีที่คุณไปถึงที่Section Vนั่นเพราะมันบอกว่าสิ่งที่ตัวแยกวิเคราะห์ LR (k) สามารถแยกวิเคราะห์เป็นภาษาที่กำหนดขึ้น ... ด้านล่างเป็นตัวอย่างที่ฉันสามารถค้นหาเพื่อช่วยให้ฉันเข้าใจความหมาย "คลุมเครือ" โปรดดู: onewartwoearewe ซึ่งสามารถแยกวิเคราะห์เป็นone war two ear eweหรือo new art woe are we- ถ้าไวยากรณ์อนุญาตให้ …

3
ทำไมการใช้ lexer / parser กับข้อมูลไบนารีจึงผิด?
ฉันมักจะทำงานร่วมกับlexer / parsersซึ่งต่างจากผู้รวบรวม parser และเห็นคนที่ไม่เคยเรียนในการแยกวิเคราะห์ถามเกี่ยวกับการแยกวิเคราะห์ข้อมูลไบนารี โดยทั่วไปแล้วข้อมูลไม่เพียง แต่เป็นไบนารี แต่ยังคำนึงถึงบริบทด้วย โดยทั่วไปจะนำไปสู่การมีโทเค็นประเภทเดียวเท่านั้นโทเค็นสำหรับไบต์ บางคนสามารถอธิบายได้ว่าทำไมการแยกวิเคราะห์ข้อมูลไบนารีด้วย lexer / parser นั้นมีความชัดเจนเพียงพอสำหรับนักเรียน CS ที่ไม่ได้ทำการแยกวิเคราะห์ แต่มีพื้นฐานทางทฤษฎี

2
การลบการเรียกซ้ำซ้ายในไวยากรณ์ขณะที่ยังคงความสัมพันธ์ด้านซ้ายของโอเปอเรเตอร์
ฉันมีปัญหากับแบบฝึกหัดนี้: ให้ G เป็นไวยากรณ์ที่ไม่ชัดเจนต่อไปนี้สำหรับ calcul-แคลคูลัส: E → v | λv.E | EE | (E) โดยที่ E คือสัญลักษณ์ที่ไม่ใช่ขั้วเดี่ยวλv.Eแสดงถึงนามธรรม abtraction wrt ตัวแปร v ใน E และ EE แทนแอ็พพลิเคชัน กำหนดไวยากรณ์LL (1) G ′เช่น L (G′) = L (G) และความคลุมเครือของ G ได้รับการแก้ไขโดยกำหนดอนุสัญญาตามปกติดังต่อไปนี้: สิ่งที่เป็นนามธรรมคือการเชื่อมโยงที่ถูกต้อง แอปพลิเคชันนั้นเชื่อมโยงกันอยู่ แอปพลิเคชันมีลำดับความสำคัญสูงกว่านามธรรม แสดง LL (1) การแยกโต๊ะ G λv1. λv2. v1v2v1และต้นไม้แยกที่ได้รับเมื่อแยกสตริง ฉันตัดความกำกวมของการตั้งค่าความสำคัญและการเชื่อมโยงเพื่อให้ได้ไวยากรณ์นี้: …

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

2
ภาษาของนิพจน์ทั่วไปต้องการการกดออโต้ลงเพื่อแยกวิเคราะห์หรือไม่
ฉันต้องการแปลงผู้ใช้ที่ป้อนนิพจน์ทั่วไปให้เป็น NFA เพื่อที่ฉันจะสามารถเรียกใช้ NFA กับสตริงสำหรับวัตถุประสงค์ในการจับคู่ เครื่องจักรขั้นต่ำที่สามารถใช้ในการแยกวิเคราะห์นิพจน์ปกติคืออะไร ฉันคิดว่ามันจะต้องเป็นแบบกดลงอัตโนมัติเพราะ presense ของวงเล็บหมายถึงความจำเป็นในการนับและ DFA / NFA ไม่สามารถทำการนับโดยพล สมมติฐานนี้ถูกต้องหรือไม่ ตัวอย่างเช่นนิพจน์ a (bc *) d อาจต้องการ PDA เพื่อให้การจัดการนิพจน์ย่อยในวงเล็บถูกต้อง

3
ไวยากรณ์นี้ LL เป็นอย่างไร (1)
นี่เป็นคำถามจาก Dragon Book นี่คือไวยากรณ์: S→ A a A b | ขขขS→AaAข|BขBaS \to AaAb \mid BbBa A → εA→εA \to \varepsilon B → εB→εB \to \varepsilon คำถามถามว่าจะแสดงได้อย่างไรว่าเป็น LL (1) แต่ไม่ใช่ SLR (1) เพื่อพิสูจน์ว่าเป็น LL (1) ฉันพยายามสร้างตารางการแยกวิเคราะห์ แต่ฉันได้รับการผลิตหลายรายการในเซลล์ซึ่งขัดแย้งกัน โปรดบอกว่า LL (1) นี้เป็นอย่างไรและจะพิสูจน์ได้อย่างไร

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