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

การวิเคราะห์ (ยกเลิก) ข้อมูลที่มีโครงสร้างเพื่อแปลงเป็นรูปแบบที่มีโครงสร้างและเป็นมาตรฐาน

12
ฉันควรใช้ตัวสร้างคำแยกวิเคราะห์หรือฉันควรใช้รหัสตัวกำหนดเองและตัวแยกวิเคราะห์แบบกำหนดเองหรือไม่
อะไรคือข้อดีและข้อเสียเฉพาะของแต่ละวิธีในการใช้งานไวยากรณ์ภาษาโปรแกรม ทำไม / เมื่อไหร่ที่ฉันควรจะม้วนตัวเอง? ทำไม / เมื่อไรฉันจึงควรใช้เครื่องกำเนิดไฟฟ้า?

4
เมื่อใดจึงจะใช้ Parser Combinator เมื่อใดจึงจะใช้ตัวแยกวิเคราะห์
ฉันได้ดำน้ำลึกเข้าไปในโลกของ parsers เมื่อเร็ว ๆ นี้ต้องการที่จะสร้างภาษาการเขียนโปรแกรมของตัวเอง อย่างไรก็ตามฉันพบว่ามีวิธีการเขียนตัวแยกวิเคราะห์ที่แตกต่างกันสองวิธี: Parser Generators และ Parser Combinators น่าสนใจฉันไม่สามารถค้นหาทรัพยากรใด ๆ ที่อธิบายในกรณีที่วิธีใดดีกว่า แต่ทรัพยากรจำนวนมาก (และคน) ผมสอบถามเกี่ยวกับเรื่องไม่ทราบว่าของวิธีการอื่น ๆ เพียง แต่อธิบายของพวกเขาวิธีการเป็นวิธีการและไม่ได้กล่าวถึงอื่น ๆ ที่ทั้งหมด: หนังสือมังกรที่มีชื่อเสียงจะเข้าสู่ lexing / สแกนและกล่าวถึง (ฉ) lex แต่ไม่ได้พูดถึงตัวแยกวิเคราะห์ combinators ที่ทั้งหมด รูปแบบการติดตั้งภาษานั้นขึ้นอยู่กับ ANTLR Parser Generator ที่สร้างขึ้นใน Java และไม่ได้กล่าวถึง Parser Combinators เลย บทแนะนำการใช้ Parsecใน Parsec ซึ่งเป็น Parser Combinator ใน Haskell ไม่ได้กล่าวถึง …

4
แผนผังต้นไม้บทคัดย่อสร้างขึ้นได้อย่างไร?
ฉันคิดว่าฉันเข้าใจเป้าหมายของ AST และฉันได้สร้างโครงสร้างต้นไม้สองสามครั้งก่อนหน้านี้ แต่ไม่เคยเป็น AST ฉันสับสนเป็นส่วนใหญ่เพราะโหนดเป็นข้อความและไม่ใช่ตัวเลขดังนั้นฉันจึงไม่สามารถคิดวิธีที่ดีในการป้อนโทเค็น / สตริงได้เนื่องจากฉันกำลังวิเคราะห์รหัส ตัวอย่างเช่นเมื่อฉันดูไดอะแกรมของ AST ตัวแปรและค่าของมันคือโหนดปมถึงเครื่องหมายเท่ากับ มันสมเหตุสมผลดีสำหรับฉัน แต่ฉันจะใช้สิ่งนี้อย่างไร ฉันเดาว่าฉันสามารถทำได้เป็นกรณี ๆ ไปดังนั้นเมื่อฉันสะดุด "=" ฉันใช้มันเป็นโหนดและเพิ่มค่าการแจงก่อน "=" เป็นใบไม้ ดูเหมือนว่าผิดเพราะฉันอาจต้องทำเรื่องเป็นตัน ๆ ขึ้นอยู่กับวากยสัมพันธ์ จากนั้นฉันก็พบปัญหาอีกอย่างต้นไม้จะผ่านไปได้อย่างไร ฉันจะลงไปตามความสูงและกลับไปที่โหนดเมื่อฉันไปถึงจุดต่ำสุดแล้วทำแบบเดียวกันกับเพื่อนบ้านหรือไม่ ฉันเห็นไดอะแกรมมากมายบน AST แต่ฉันไม่สามารถหาตัวอย่างง่ายๆของรหัสได้ซึ่งอาจช่วยได้

2
ภาษาสมัยใหม่ยังใช้เครื่องแยกวิเคราะห์หรือไม่?
ฉันกำลังค้นคว้าเกี่ยวกับชุดคอมไพเลอร์ gcc ในวิกิพีเดียที่นี่เมื่อสิ่งนี้เกิดขึ้น: GCC เริ่มต้นใช้ตัวแยกวิเคราะห์ LALR ที่สร้างด้วย Bison แต่ค่อย ๆ เปลี่ยนเป็นตัวแยกวิเคราะห์แบบสืบเชื้อสายแบบเขียนด้วยมือซ้ำ; สำหรับ C ++ ในปี 2004 และสำหรับ C และ Objective-C ในปี 2549 ปัจจุบันส่วนหน้าทั้งหมดใช้ตัวแยกวิเคราะห์ที่เขียนด้วยมือแบบเรียกซ้ำ ดังนั้นด้วยประโยคสุดท้ายนั้น (และสำหรับที่ฉันไว้ใจ wikipedia) ฉันสามารถพูดได้อย่างแน่นอนว่า "C (gcc), C ++ (g ++), Objective-C, Objective-C ++, Fortran (gfortran), Java (gcj), Ada (GNAT), Go (gccgo), Pascal (gpc), ... Mercury, Modula-2, Modula-3, …

6
เหตุใดการแยกวิเคราะห์ที่เข้มงวดจึงไม่ถูกเลือกสำหรับ HTML
ฉันมักจะสงสัยว่าทำไมการแยกวิเคราะห์ที่เข้มงวดไม่ได้ถูกเลือกเมื่อสร้าง HTML สำหรับประวัติอินเทอร์เน็ตส่วนใหญ่เบราว์เซอร์ยอมรับมาร์กอัปทุกชนิดและพยายามอย่างดีที่สุดในการแยกวิเคราะห์ กระบวนการลดประสิทธิภาพลงทำให้ผู้คนสามารถเขียนซึ่งพูดพล่อยๆและทำให้ยากต่อการยกเลิกคุณสมบัติที่ล้าสมัย มีเหตุผลเฉพาะหรือไม่ที่ทำไมการแยกวิเคราะห์ HTML จึงไม่เข้มงวด?
38 html  history  parsing 

1
C ++ 11 รวม std :: stoi ทำไมไม่ std :: itos?
ฉันสังเกตเห็นถึงความยินดีที่ C ++ 11 มีstd::sto@ตระกูลของฟังก์ชั่นสำหรับการเปิด ints / floats / longs อย่างง่ายดายจากสตริง อย่างไรก็ตามฉันก็แปลกใจว่าสิ่งที่ตรงกันข้ามไม่ได้ดำเนินการ เหตุใดคณะกรรมการมาตรฐานจึงไม่รวมstd::itosตระกูลของหน้าที่ในการย้ายจาก ints / float / อะไรก็ตาม (back) ไปเป็น strings?
37 c++  parsing  strings  c++11 

5
มักจะแยกความคิดเห็นเป็นอย่างไร
ความคิดเห็นได้รับการปฏิบัติโดยทั่วไปในภาษาการเขียนโปรแกรมและมาร์กอัปอย่างไร ฉันกำลังเขียนโปรแกรมแยกวิเคราะห์สำหรับภาษามาร์กอัปที่กำหนดเองบางอย่างและต้องการทำตามหลักการของความประหลาดใจน้อยที่สุดดังนั้นฉันจึงพยายามกำหนดรูปแบบทั่วไป ตัวอย่างเช่นความคิดเห็นที่ฝังอยู่ภายในโทเค็น 'รบกวน' กับโทเค็นหรือไม่? โดยทั่วไปแล้วเป็นสิ่งที่ชอบ: Sys/* comment */tem.out.println() ถูกต้อง? นอกจากนี้หากภาษามีความอ่อนไหวต่อบรรทัดใหม่และความคิดเห็นที่ครอบคลุมบรรทัดใหม่ควรพิจารณาบรรทัดใหม่หรือไม่? stuff stuff /* this is comment this is still comment */more stuff ถือว่าเป็น stuff stuff more stuff หรือ stuff stuff more stuff ? ฉันรู้ว่ามีบางภาษาที่เฉพาะเจาะจงทำหรือฉันกำลังมองหาความคิดเห็น แต่กำลังมองหาหรือไม่: มีฉันทามติทั่วไปสิ่งที่คาดหวังโดยทั่วไปโดยเครื่องหมายขึ้นเกี่ยวกับโทเค็นและบรรทัดใหม่หรือไม่? บริบทเฉพาะของฉันคือมาร์กอัปคล้ายวิกิ
31 parsing  comments 

1
ตัวแยกวิเคราะห์ภาษาอังกฤษ (สำหรับ The Hobbit 1982)
รู้สึกทึ่งที่ได้อ่านเกี่ยวกับเกมผจญภัยข้อความThe Hobbitซึ่งมีตัวแยกวิเคราะห์ที่แข็งแกร่งอย่างเหลือเชื่อที่เรียกว่า "Inglish": ... อิงลิชอนุญาตให้พิมพ์ประโยคขั้นสูงเช่น "ถามแกนดัล์ฟเกี่ยวกับแผนที่แปลกประหลาดจากนั้นหยิบดาบและฆ่าหมุนรอบด้วย" โปรแกรมแยกวิเคราะห์มีความซับซ้อนและใช้งานง่ายแนะนำสรรพนามคำวิเศษณ์ ("โจมตีพวกผีร้าย") เครื่องหมายวรรคตอนและคำบุพบทและอนุญาตให้ผู้เล่นโต้ตอบกับโลกของเกมด้วยวิธีที่ไม่เคยเกิดขึ้นมาก่อน ฉันสงสัยว่าถ้าใครรู้เกี่ยวกับประวัติและ / หรือมรดกของเครื่องมือแยกวิเคราะห์ Inglish และโปรแกรมเมอร์ที่พัฒนามันขึ้นมา

8
เป็นไปได้ที่จะทำนายแบบคงที่เมื่อมีการจัดสรรคืนหน่วยความจำ --- จากซอร์สโค้ดเท่านั้นหรือไม่
หน่วยความจำ (และล็อคทรัพยากร) จะถูกส่งคืนไปยังระบบปฏิบัติการที่จุดที่กำหนดไว้ระหว่างการทำงานของโปรแกรม โฟลว์การควบคุมของโปรแกรมด้วยตัวเองนั้นเพียงพอที่จะรู้ว่าสามารถจัดสรรคืนทรัพยากรที่กำหนดได้อย่างแน่นอน เช่นเดียวกับที่โปรแกรมเมอร์มนุษย์รู้จักที่จะเขียนfclose(file)เมื่อทำโปรแกรมด้วย GCs แก้ปัญหานี้โดยการหาโดยตรงระหว่างรันไทม์เมื่อโฟลว์ควบคุมถูกดำเนินการ แต่แหล่งที่แท้จริงของความจริงเกี่ยวกับการควบคุมการไหลคือแหล่งที่มา ในทางทฤษฎีมันควรจะเป็นไปได้ที่จะกำหนดตำแหน่งที่จะแทรกการfree()เรียกก่อนที่จะรวบรวมโดยการวิเคราะห์แหล่งที่มา (หรือ AST) การนับการอ้างอิงเป็นวิธีที่ชัดเจนในการใช้สิ่งนี้ แต่ก็เป็นเรื่องง่ายที่จะพบกับสถานการณ์ที่ตัวชี้ยังคงอ้างอิง (ยังอยู่ในขอบเขต) แต่ไม่ต้องการอีกต่อไป สิ่งนี้เพียงแปลงความรับผิดชอบของการยกเลิกการจัดสรรพอยน์เตอร์ด้วยตนเองเป็นความรับผิดชอบในการจัดการขอบเขต / การอ้างอิงด้วยตนเองกับพอยน์เตอร์เหล่านั้น ดูเหมือนว่าเป็นไปได้ที่จะเขียนโปรแกรมที่สามารถอ่านซอร์สของโปรแกรมและ: ทำนายการเรียงสับเปลี่ยนทั้งหมดของโฟลว์การควบคุมของโปรแกรม --- ไปยังความแม่นยำที่คล้ายกันในขณะที่ดูการทำงานจริงของโปรแกรม ติดตามการอ้างอิงทั้งหมดไปยังทรัพยากรที่จัดสรร สำหรับการอ้างอิงแต่ละครั้งให้ตรวจสอบการไหลของการควบคุมที่ตามมาทั้งหมดเพื่อหาจุดเริ่มต้นที่การอ้างอิงนั้นรับประกันว่าจะไม่ถูกยกเลิกการลงทะเบียน ณ จุดนั้นให้แทรกคำสั่งจัดสรรคืนที่บรรทัดของซอร์สโค้ด มีอะไรอีกไหมที่ทำสิ่งนี้แล้ว? ฉันไม่คิดว่าตัวชี้สมาร์ท Rust หรือ C ++ / RAII เป็นสิ่งเดียวกัน
27 parsing  memory 

5
ชื่อตัวแยกวิเคราะห์ประเภทนี้หรือสาเหตุที่ไม่มีอยู่
ตัวแยกวิเคราะห์แบบเดิมใช้อินพุตทั้งหมดและสร้างต้นแยกวิเคราะห์เดี่ยว ฉันกำลังมองหาอุปกรณ์ที่ใช้กระแสข้อมูลอย่างต่อเนื่องและสร้างฟอเรสต์แยกวิเคราะห์ [ แก้ไข: ดูการสนทนาในความคิดเห็นเกี่ยวกับสาเหตุที่การใช้คำนี้แบบไม่เป็นทางการ ] ไส้ของฉันบอกว่าฉันไม่สามารถเป็นคนแรกที่ต้องการ (หรือคิดว่าฉันต้องการ) ตัวแยกวิเคราะห์ แต่ฉันได้ค้นหาและใช้เวลาหลายเดือนเพื่อหาประโยชน์ ฉันรู้ว่าฉันอาจติดปัญหา XY จุดประสงค์สูงสุดของฉันคือการแยกวิเคราะห์ข้อความโดยไม่สนใจส่วนใหญ่และสร้างกระแสการแยกวิเคราะห์ต้นไม้จากส่วนที่รับรู้ ดังนั้นคำถามของฉันคือมีเงื่อนไข: ถ้ามีคลาส parsers ที่มีคุณสมบัติเหล่านี้อยู่มันเรียกว่าอะไร? และถ้าไม่ทำไมไม่ ทางเลือกคืออะไร? บางทีฉันหายไปด้วยวิธีที่ฉันสามารถทำให้ parsers ทั่วไปทำในสิ่งที่ฉันต้องการ
27 parsing 

6
อะไรคือข้อโต้แย้งต่อต้านการแยกทางคธูลู?
ฉันได้รับมอบหมายงานให้ใช้ภาษาเฉพาะโดเมนสำหรับเครื่องมือที่อาจมีความสำคัญต่อ บริษัท ภาษาที่เรียบง่าย แต่ไม่น่ารำคาญแล้วมันช่วยให้ลูปซ้อนกันสตริง ฯลฯ และมันเป็นจริงให้แน่ใจว่าโครงสร้างอื่น ๆ จะถูกเพิ่มเป็นความก้าวหน้าโครงการ ฉันรู้โดยประสบการณ์ว่าการเขียน lexer / parser ด้วยมือ - ยกเว้นว่าไวยากรณ์เป็นเรื่องเล็กน้อย - เป็นกระบวนการที่ใช้เวลานานและเกิดข้อผิดพลาดได้ง่าย ดังนั้นฉันจึงเหลือสองตัวเลือก: ตัวแยกวิเคราะห์เครื่องปั่นà la yacc หรือห้องสมุด combinator เช่น Parsec อดีตก็ดีเช่นกัน แต่ฉันเลือกอย่างหลังด้วยเหตุผลต่าง ๆ และนำโซลูชันมาใช้ในภาษาที่ใช้งานได้ ผลลัพธ์ที่ได้นั้นค่อนข้างน่าประทับใจต่อสายตาของฉันรหัสนั้นสั้นกระชับหรูหราและอ่านง่าย / คล่องแคล่ว ฉันยอมรับว่ามันอาจดูแปลก ๆ ถ้าคุณไม่เคยตั้งโปรแกรมในสิ่งอื่นนอกจาก java / c # แต่สิ่งนี้จะเป็นจริงกับสิ่งที่ไม่ได้เขียนใน java / c # ถึงจุดหนึ่งฉันถูกเพื่อนร่วมงานจู่โจมอย่างแท้จริง หลังจากเหลียวดูหน้าจอของฉันอย่างรวดเร็วเขาก็ประกาศว่ารหัสนั้นไม่สามารถเข้าใจได้และฉันไม่ควรบูรณาการแยกวิเคราะห์ แต่ใช้ stack และ String.Split …

3
ข้อผิดพลาดทางไวยากรณ์เกิดขึ้นในกระบวนการใด (โทเค็นหรือแยกวิเคราะห์)
ฉันพยายามที่จะเข้าใจการรวบรวมและการตีความทีละขั้นตอนหาภาพรวม ดังนั้นฉันจึงพบคำถามขณะอ่านhttp://www.cs.man.ac.uk/~pjj/farrell/comp3.htmlบทความนี้ มันบอกว่า : ขั้นตอนต่อไปของคอมไพเลอร์เรียกว่า Parser คอมไพเลอร์ส่วนนี้มีความเข้าใจไวยากรณ์ของภาษา มันมีหน้าที่ในการระบุข้อผิดพลาดทางไวยากรณ์และสำหรับการแปลโปรแกรมที่ปราศจากข้อผิดพลาดเป็นโครงสร้างข้อมูลภายในที่สามารถตีความหรือเขียนออกมาในภาษาอื่น แต่ฉันไม่สามารถหาวิธี tokenizer สามารถโทเค็นสตรีมที่กำหนดอย่างถูกต้องซึ่งมีข้อผิดพลาดทางไวยากรณ์ มันควรจะติดอยู่ที่นั่นหรือให้ข้อมูลที่ไม่ถูกต้องกับตัวแยกวิเคราะห์ ฉันหมายถึงว่าการโทเค็นยังไม่ใช่นักแปลหรือ ดังนั้นวิธีที่จะเอาชนะบรรทัดที่มีความเสียหายของคำศัพท์ในขณะที่โทเค็น มีตัวอย่างของโทเค็นภายในลิงก์ด้านบนที่ส่วนหัวของTokenizer ตามที่ฉันเข้าใจรูปแบบของโทเค็นดูเหมือนว่าหากมีสิ่งผิดปกติในโทเค็นรหัสจะเสียหายเช่นกัน คุณช่วยอธิบายความเข้าใจผิดของฉันได้ไหม?

3
การนำรูปแบบผู้เยี่ยมชมมาใช้สำหรับทรีไวยากรณ์ของบทคัดย่อ
ฉันอยู่ในขั้นตอนการสร้างภาษาโปรแกรมของฉันเองซึ่งฉันใช้เพื่อจุดประสงค์ในการเรียนรู้ ฉันเขียน lexer และ parser ที่สืบเชื้อสายแบบเรียกซ้ำสำหรับชุดย่อยของภาษาของฉัน (ปัจจุบันฉันสนับสนุนการแสดงออกทางคณิตศาสตร์เช่น+ - * /และวงเล็บ) โปรแกรมแยกวิเคราะห์ส่งกลับต้นไม้ทรีของฉันซึ่งฉันเรียกEvaluateวิธีการรับผลลัพธ์ของนิพจน์ ทุกอย่างทำงานได้ดี นี่คือสถานการณ์ปัจจุบันของฉันโดยประมาณ (ตัวอย่างโค้ดใน C # ถึงแม้ว่าจะเป็นผู้ไม่เชื่อเรื่องภาษามาก): public abstract class Node { public abstract Double Evaluate(); } public class OperationNode : Node { public Node Left { get; set; } private String Operator { get; set; } private Node Right …

12
จะเขียนล่ามคำสั่ง / parser ได้อย่างไร?
คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Software Engineering Stack Exchange อพยพ 7 ปีที่ผ่านมา ปัญหา: เรียกใช้คำสั่งในรูปแบบของสตริง ตัวอย่างคำสั่ง: /user/files/ list all; เทียบเท่ากับ: /user/files/ ls -la; อีกอันหนึ่ง: post tw fb "HOW DO YOU STOP THE TICKLE MONSTER?;" เทียบเท่ากับ: post -tf "HOW DO YOU STOP THE TICKLE MONSTER?;" ทางออกปัจจุบัน: tokenize string(string, array); switch(first item in array) …

4
ตัวแยกวิเคราะห์กฎทั่วไปสำหรับกฎเกมกระดาน RPG - จะทำอย่างไร?
ฉันต้องการสร้างเครื่องมือแยกวิเคราะห์กฎทั่วไปสำหรับระบบ RPG แบบปากกาและกระดาษ กฎสามารถเกี่ยวข้องโดยปกติ 1 ถึง N เอนทิตี 1 ถึง N บทบาทของลูกเต๋าและการคำนวณค่าตามหลายคุณลักษณะของเอนทิตี ตัวอย่างเช่น: ผู้เล่นมี STR 18 อาวุธที่ติดตั้งในปัจจุบันของเขาให้โบนัสแก่ +1 STR แต่ malus ของ DEX -1 เขาโจมตีมอนสเตอร์เอนทิตี้ของและตอนนี้เกมลอจิกจำเป็นต้องเรียกใช้ชุดของกฎหรือการกระทำ: ผู้เล่นทอยลูกเต๋าถ้าเขาได้รับตัวอย่างที่ 8 ขึ้นไป (ค่าการโจมตีพื้นฐานที่เขาต้องผ่านคือหนึ่งในคุณสมบัติพื้นฐานของเขา!) การโจมตีของเขาสำเร็จแล้ว จากนั้นสัตว์ประหลาดจะทอยลูกเต๋าเพื่อคำนวณว่าการโจมตีผ่านเกราะหรือไม่ ถ้าใช่ความเสียหายจะเกิดขึ้นหากไม่ได้ถูกโจมตี นอกจากกฎทางคณิตศาสตร์อย่างง่ายยังสามารถมีข้อ จำกัด เช่นการใช้เฉพาะกับผู้ใช้ระดับหนึ่ง (ตัวอย่างนักรบ vs ตัวช่วยสร้าง) หรือคุณลักษณะอื่น ๆ ดังนั้นนี่ไม่ได้ จำกัด เฉพาะการดำเนินการทางคณิตศาสตร์ หากคุณคุ้นเคยกับระบบสวมบทบาทอย่างเช่นดันเจี้ยนและมังกรคุณจะรู้ว่าฉันทำอะไรอยู่ ปัญหาของฉันคือตอนนี้ฉันไม่มีเงื่อนงำวิธีการสร้างสิ่งนี้อย่างถูกวิธีที่สุด ฉันต้องการให้ผู้คนสามารถตั้งกฎชนิดใดก็ได้และต่อมาก็ทำการกระทำเช่นการเลือกผู้เล่นและสัตว์ประหลาดและทำการกระทำ (ชุดของกฎเช่นการโจมตี) ฉันขอความช่วยเหลือจากด้านฐานข้อมูลของสิ่งต่าง ๆ น้อยลง …

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