Thursday 13 July 2017

Scala parser combinator ไบนารี ตัวเลือก


การจัดโครงสร้างข้อความเป็นโครงสร้างข้อมูลได้รับความเจ็บปวดเสมอหากคุณเป็นเช่นฉันคุณอาจสงสัยว่าทำไมเครื่องมือแยกวิเคราะห์ทั้งหมดจึงดูเหมือนจะเป็นเครื่องวิเคราะห์คำหลักแทนที่จะเป็นเพียงแค่ parser ที่กำหนดค่า หลังจากทั้งหมดเมื่อคุณดูพูด 2D ฟิสิกส์ห้องสมุดเช่น Chipmunk2D คุณเพิ่งได้รับพวงของชั้นเรียนและฟังก์ชันที่คุณสามารถโทรในทางตรงกันข้ามแยกห้องสมุดเช่น YACC หรือ ANTLR มักจะดูเหมือนต้องกำหนดเองสร้างขั้นตอนรวบรวมเวลา source - การสร้างรหัสและสิ่งที่สับสนอื่น ๆ ที่คุณไม่เคยเห็นในไลบรารีปกติมากที่สุดจะเปิดออกไลบรารีแบบง่ายๆจะมีอยู่สำหรับการแยกวิเคราะห์ภายใต้ชื่อคอมไพเลอร์ Parser ในขณะที่ไม่เป็นที่รู้จักกันดีเหล่านี้ไลบรารี combinator parser เปิดเผยพวงของชั้นเรียนและฟังก์ชั่น คุณสามารถใช้เพื่อสร้างตัวแยกวิเคราะห์ในวิธีที่สะดวกโดยไม่ต้องเขียนด้วยลายมือที่เขียนด้วยลายมือเขียนซ้ำความละเอียดของความซับซ้อนของเครื่องมือ Regexes หรือความซับซ้อนของเครื่องมือรหัส - gen เช่น ANTLR โพสต์นี้จะสำรวจหนึ่ง su ch ห้องสมุด FastParse และแสดงให้เห็นว่า combinators parser สามารถทำให้กระบวนการของการแยกวิเคราะห์ข้อความที่มีโครงสร้างง่ายง่ายและสนุกบ่อยครั้งเมื่อเขียนโปรแกรมคุณพบว่าตัวเองจัดการกับข้อความที่มีโครงสร้างหรือข้อมูลไบนารีและจำเป็นต้องแยกวิเคราะห์มันเป็นโครงสร้างข้อมูลบางประเภท ก่อนที่คุณจะสามารถใช้งานได้ไม่ว่าคุณจะพบว่าตัวเองกำลังทำงานร่วมกับ JSON, Python source code, รูปแบบข้อมูลที่เป็นกรรมสิทธิ์บางส่วนหรือไวยากรณ์ภาษาเขียนโปรแกรมของคุณเองตามเนื้อผ้าตัวเลือกของคุณสำหรับการแยกวิเคราะห์จะมีลักษณะดังนี้ ใช้รูปแบบทั่วไปเช่น JSON หรือ Python source code แต่สำหรับรูปแบบข้อมูลที่แพร่หลายน้อยกว่าคุณอาจไม่สามารถหา parser ที่ดีได้และทำให้คุณสามารถใช้งานได้ด้วยตัวเองคุณสามารถแยกวิเคราะห์ได้โดยใช้ น่าแปลกใจที่หลายรูปแบบข้อมูลเช่นรูปแบบไฟล์จำนวนมากเป็นเพียงรายการเดียวต่อบรรทัดในกรณีที่ n ทำงานได้ดี แต่ตรงนี้ลดลงสำหรับสิ่งที่ไม่เล็กน้อยแม้บางสิ่งบางอย่างง่ายๆเป็น CSV สามารถ t จะแบ่ง naively n และเนื่องจาก ไปยัง การปรากฏตัวของเครื่องหมายจุลภาคที่ยกมาและ escaping ฉันสามารถแยกได้โดยใช้ Regexes นี้บางครั้งทำงานโดยเฉพาะอย่างยิ่งถ้าข้อมูลเข้าเป็นปกติเพียงพอหรือถ้าคุณ don t ต้อง 100 ความถูกต้องอย่างไรก็ตาม parsers regex-based มักจะเปราะบางและไม่ถูกต้องมีทั้งเท็จ บวกและเชิงลบเท็จและสามารถ t จัดการรูปแบบ recursive เช่น JSON, XML หรือภาษา programming. Can มากที่สุด I แยกโดยใช้มือเขียน recursive โคตรแยกวิเคราะห์เทคนิคนี้เป็นพื้นความยืดหยุ่นในที่สุดและโดยทั่วไปงานเสมอ แต่น่าเบื่อ verbose และ ข้อผิดพลาดได้ง่ายนี่คือสิ่งที่คอมไพเลอร์สกาล่าไม่สำหรับตัวอย่างเช่นฉันสามารถแยกวิเคราะห์ได้โดยใช้เครื่องกำเนิดไฟฟ้าแบบแยกชิ้นส่วนเครื่องมือเหล่านี้เช่น YACC หรือ ANTLR สร้างซอร์สโค้ดที่รวบรวมไว้แล้วในตัววิเคราะห์คำสั่งที่ใช้กันอย่างแพร่หลาย แต่ค่อนข้างสับสนและน่ารำคาญ เพื่อเริ่มต้นใช้งานเนื่องจากขั้นตอนการสร้างแบบกำหนดเองล่าม Python และ Ruby มาตรฐานใช้วิธีนี้เช่นเดียวกับเครื่องมือต่างๆเช่น Intellij IDEA โดยทั่วไปถ้าคุณสามารถหาตัวแยกวิเคราะห์ที่มีอยู่ก่อนหน้านี้ได้ ไอออนเป็นทางเลือกระหว่าง regexes แบ่งยืดหยุ่นง่ายและมีความยืดหยุ่นยาก recursive โคตรและ parser-generators สิ่งที่เกี่ยวกับกรณีการใช้งานที่ฉันต้องการสิ่งที่ทั้งง่ายและมีความยืดหยุ่นห้องสมุด Partler Combinator ให้เช่นตัวเลือกบางอย่างมีความยืดหยุ่นมากกว่า regexes แต่น้อย ซับซ้อนกว่าการเขียนตัวแยกวิเคราะห์ recursive-descent ของคุณหรือใช้ตัวแยกวิเคราะห์ generator. For วัตถุประสงค์ของบทความนี้ฉันจะใช้ห้องสมุด FastParse ในภาษาโปรแกรม Scala อย่างไรก็ตามมีไลบรารี combinator parser อื่น ๆ อีกมากมายสำหรับ Scala ตลอดจน ห้องสมุดที่คล้ายกันในเกือบทุกภาษาหลักจาก JParsec for Java, PyParsing for Python, Parsec for Haskell และอื่น ๆ อีกมากมายไวยากรณ์ระหว่างไลบรารีเหล่านี้จะแตกต่างกัน แต่แนวคิดของชุดคำสั่ง parser-combinator ที่ควรจะเหมือนกันในทุกส่วน สามารถใช้ในโครงการ Scala ใด ๆ ที่สร้างโดยใช้เครื่องมือ SBT, Maven, Gradle และใช้งานได้ในทุกสภาพแวดล้อม แต่ t วิธีที่ง่ายที่สุดในการเริ่มต้นใช้งานน่าจะเป็นทาง REPLAM ของ Ammonite Scala คุณจำเป็นต้องมี Java ติดตั้งไว้เป็นข้อกำหนดเบื้องต้นและนำคุณไปสู่ ​​Scala REPL แบบโต้ตอบที่คุณสามารถใช้เพื่อเริ่มต้นเล่นห้องสมุด FastParse ทันทีซึ่งรวมอยู่ด้วย ตัวแบ่งส่วน FastParse ที่ง่ายที่สุดจะแสดงด้านล่างนี้เรานำเข้าไลบรารี fastparse และกำหนดตัวแยกวิเคราะห์ด้วยฟังก์ชัน P ที่แยกวิเคราะห์สตริงเดี่ยวสวัสดีและไม่มีอะไรอื่นคุณสามารถใช้ตัวแยกวิเคราะห์นี้ได้ง่ายๆโดยการเรียกใช้ที่นี่เราจะเห็นว่า การแยกวิเคราะห์ hello ประสบความสำเร็จการกลับมาเป็นหน่วยหรือถือเป็นโมฆะใน Scala และการแยกวิเคราะห์จนกว่าจะมีดัชนี 5 ในทางกลับกันการพยายามแยกวิเคราะห์ลาก่อนล้มเหลวที่อักขระ 1 แถวเช่นตัวอักษรตัวแรกตามที่คาดไว้สวัสดี แต่แทนที่จะพบว่าลาถ้ามีไม่เพียงพอ เพื่อแยกวิเคราะห์นอกจากนี้ยังล้มเหลวในทางกลับกันถ้ามีการแยกวิเคราะห์ข้อมูลมากเกินไปประสบความสำเร็จ แต่มีดัชนีแสดงเท่าใดจริง parsed. If เราต้องการจับกรณีที่เรา didn t แยกวิเคราะห์ข้อมูลทั้งหมดของมัน straightfo rward เพื่อเปรียบเทียบดัชนีความสำเร็จ 5 กับความยาวของสตริงอินพุต 12 เพื่อดูว่าเราใช้ข้อมูลอินพุตทั้งหมดหรือใช้ตัวดำเนินการ End ที่เราจะพูดถึงในภายหลังเมื่อเริ่มต้นตัวแยกวิเคราะห์นี้อาจไม่เป็นประโยชน์มากกว่า a method call อย่างไรก็ตามวิธีการที่คุณใช้เครื่องวิเคราะห์คำที่ทำให้พาร์ทิชัน parser combinators มีค่าเหมือนกัน Parsers แบบอ่านอย่างเดียวมีสองวิธีขั้นพื้นฐานที่คุณใช้รวมทั้ง parsers ในไวยากรณ์ของ FastParse และ aa b สามารถแยกวิเคราะห์อะไรก็ได้หรือ b สามารถแยกวิเคราะห์ได้ ไปขวา iea ได้รับความสำคัญและ b จะพยายามเฉพาะถ้าล้มเหลวในขณะที่คุณสามารถดูแยกวิเคราะห์สวัสดีหรือผลงานลา แต่การแยกวิเคราะห์ dunno ทำให้มันไม่บ่นมันคาดหวังสวัสดีลาที่แถว 1 ตัวอักษร 1 แต่แทนที่จะพบ dunno คุณสามารถห่วงโซ่สิ่งต่างๆร่วมกันและจะพยายามทั้งหมดของพวกเขาซ้ายไป right. b parses ตามด้วย b. As คุณสามารถดูนี้ parses hellogoodbye ทั้งหมดในครั้งเดียวถ้าคุณพยายามที่จะแยกเพียง hello ไม่อ้างว่ามัน กำลังมองหาคำอำลาที่แถว 1 ตัวอักษร 5 แต่พบว่าไม่มีการป้อนข้อมูลตั้งแต่ i t ได้ถึงจุดสิ้นสุดของสตริงถ้าคุณพยายามที่จะแยกวิเคราะห์เพียงแค่ลามันไม่ได้อ้างว่ามันกำลังมองหาสวัสดีที่แถว 1 ตัวอักษร 1 แต่แทนที่จะพบว่าลา Again. is chainable เพื่อให้คุณสามารถห่วงโซ่เป็น parsers มากเท่าที่คุณต้องการและพวกเขาจะ แต่ละตัวจะทำงานตามลำดับอื่น ๆ หมายเหตุคุณสามารถจบห่วงโซ่ด้วยตัวแบ่งส่วน. ถ้าคุณต้องการล้มเหลวในการแยกวิเคราะห์ถ้าไม่มีการป้อนอินพุตทั้งหมดที่นี่การแยกวิเคราะห์ hellogoodbyeworld ล้มเหลวเนื่องจากคาดว่าจะมีการแยกวิเคราะห์จนกว่าจะถึงจุดสิ้นสุด ของสตริงอินพุต แต่แทนที่จะพบอักขระอื่น ๆ ที่เหลืออยู่นี่เป็นสิ่งที่คุณมักต้องการทำเฉพาะตอนท้ายของตัวแยกวิเคราะห์เมื่อคุณรู้ว่าไม่มีสิ่งใดควรถูกทิ้งไว้และช่วยให้คุณประหยัดเวลาในการตรวจสอบความสำเร็จของดัชนี ความยาวสายยาวขึ้นในทางกลับกันถ้าคุณยินดีที่จะแยกคำนำหน้าของสตริงอินพุตและ don t ใจถ้า doesn t ใช้สิ่งทั้งคุณยังสามารถเพียงแค่ปล่อยให้ off. You สามารถรวม and. which เมื่อสิ่งที่เริ่มได้รับที่น่าสนใจนี้จะส่งผ่านปัจจัยการผลิตทั้งหมดที่คุณจะ e xpect และนอกจากนี้ยังล้มเหลวในสิ่งที่คุณคาดหวังว่าจะล้มเหลวก่อนหน้านี้เราได้เห็นว่าตัวแบ่งส่วนของ combinator เล็กน้อยเป็นเรื่องเกี่ยวกับประสิทธิภาพเท่าการโทรตอนนี้เรามีตัวแบ่งวิเคราะห์ combinator ที่ซับซ้อนกว่าเล็กน้อยซึ่งมีประสิทธิภาพเหมือนกับ regex เช่น hello goodbye โลก seattle แม้ว่าจะมีข้อผิดพลาดข้อมูลมากขึ้นเมื่อแยกวิเคราะห์ยังไม่มีอะไรที่จะเขียนเกี่ยวกับบ้านในทำนองเดียวกันมีไวยากรณ์สำหรับการทำเครื่องหมายส่วนของตัวแยกวิเคราะห์เป็นซ้ำที่นี่ตัวแทน 1 หมายถึงการทำซ้ำ parser อย่างน้อยหนึ่งครั้งดังนั้นหากเรา มีช่องว่างหนึ่งหรือหลายช่องระหว่าง hello และ world parser จะกินทุกอย่าง แต่ถ้าคุณไม่มีช่องว่างเลยก็บ่นว่ากำลังมองหา แต่แทนที่จะพบโลกที่อักขระ 6 นอกจากนี้คุณยังสามารถส่งผ่านได้สูงสุดในนาทีสูงสุดหาก คุณต้องการผูกไว้ในช่วงเฉพาะหรือว่าถ้าคุณต้องการให้ทำซ้ำครั้ง N ครั้งทำเครื่องหมาย parser เป็นตัวเลือกจะทำโดยใช้ที่นี่คุณจะเห็นว่า parser เป็น parser seattle โลกเป็นตัวเลือกทั้งหมด กรณีที่คุณคาดหวังให้ทำงาน มีและไม่มีโลกต่อท้ายการทำงานทั้งหมด แต่ถ้ามีการติดตาม แต่ไม่มีโลกมันล้มเหลวนี่เป็นเพราะเมื่อฉันพยายามที่จะแยกวิเคราะห์สวัสดีกับพื้นที่ต่อท้ายประสบความสำเร็จในการแยกพื้นที่ แต่ seattle โลกล้มเหลวเนื่องจากมีการป้อนข้อมูลไม่มาก หลังจากเนื้อที่ว่างเนื่องจากพื้นที่ท้ายท้ายของโลกทั้งหมดเป็นทางเลือกให้แบ็คแพ็คแบ็คอัพให้กับอักขระ 6 เพื่อดูว่าสามารถดำเนินการแยกวิเคราะห์โดยไม่ได้หรือไม่ตอนนี้คาดว่าจะเห็นจุดสิ้นสุดของการป้อนข้อมูลเนื่องจากไม่มีจุดสิ้นสุด อีกอย่างหนึ่งที่ดัชนีที่ 6 - การแยกวิเคราะห์ล้มเหลวอีกครั้งไม่มีอะไร regex hello ลา seattle โลก couldn t ทำเพียงวางในไวยากรณ์ verbose ยาวและเพิ่มเติมส่วนถัดไปไม่กี่จะครอบคลุมคุณลักษณะของไลบรารี combinator parser ที่ไปเกินกว่าสิ่ง regex มีความสามารถในการจับภาพและแปลง Parsers ดังนั้นไกลซีพียูทั้งหมดของเราได้รับการ Parser Unit ประเภทกลับมาในผลลัพธ์ Success Unit นี้ใน Scala และเทียบเท่ากับโมฆะใน Java หรือ None ใน Python และโดยทั่วไปไม่มีค่าเช่นนี้ เครื่องแยกวิเคราะห์แยกวิเคราะห์ข้อมูลเข้าตรวจสอบ ที่ตรงกับสิ่งที่ parser คาดหวัง แต่ doesn t คืนค่าที่เป็นประโยชน์ในตอนท้ายนี่เป็นค่าดีฟอลต์ที่น่าแปลกใจอย่างยิ่งเนื่องจากส่วนใหญ่ parsers don t ดูแลเกี่ยวกับส่วนใหญ่ของสิ่งที่พวกเขากำลังแยกวิเคราะห์ถ้าคุณกำลังแยกวิเคราะห์ Java ตัวอย่างเช่นคุณ don t ดูแลเกี่ยวกับช่องว่างทั้งหมด s s หรือ s ความเห็นและความคิดเห็นพวกเขาจำเป็นต้องมีอยู่และคุณจะต้องสามารถระบุได้ในขณะที่แยกวิเคราะห์ แต่มีไม่จำเป็นต้องเก็บข้อมูลเกี่ยวกับพวกเขาใด ๆ หลังจากที่คุณทำเสร็จแล้ว กับการแยกวิเคราะห์ดังนั้นในกรณีที่เราสนใจเกี่ยวกับสิ่งที่เรากำลังวิเคราะห์อีกครั้งเราต้องจับภาพโดยใช้โอเปอเรเตอร์คุณสามารถเห็นได้ว่าเราเพิ่มการจับภาพทั้งสวัสดีและโลกไซเบอร์และเมื่อเรา ประสบความสำเร็จในการแยกวิเคราะห์เราได้รับผลลัพธ์เป็นทูเปิลที่มีสองสตริงเราไม่ได้จับตัวประมวลผลหนึ่งหรือมากกว่าช่องว่างอยู่ตรงกลางดังนั้นเว้นวรรคที่มีการแยกส่วนไม่ปรากฏในเอาท์พุทอย่างไรก็ตามบ่อยครั้งที่เราไม่ต้องการ tuples ของสตริงที่เราต้องการบางชนิดของชั้นที่มีเขตข้อมูลชื่อที่มี ข้อมูลที่เราต้องการตัวอย่างเช่นใน Scala เราอาจกำหนดค่านี้เป็นซึ่งในกรณีนี้เราสามารถใช้ tuple ของ String, String ในอินสแตนซ์ของคลาสนั้นสุดท้ายเรามีสิ่งที่เราสามารถทำได้ด้วย combinators ของเครื่องวิเคราะห์คำที่คุณสามารถทำได้ แน่ใจได้ว่าหลังจาก regex คุณสามารถจับกลุ่มที่ถูกจับออกจากดัชนีแล้วจัดการกับมัน แต่คุณสามารถ t กำหนดค่าได้โดยง่ายเนื่องจากเป็นส่วนหนึ่งของ regex ไม่มีสิ่งใดที่เรียกว่า regex วัตถุวลีในขณะที่ที่นี่เรามีวลี Parser ที่ส่งกลับวลีวลีที่ประสบความสำเร็จและเราสามารถจับคู่รูปแบบกับสารสกัดจากวลี Phrase object และใช้ประโยชน์ได้เช่นกันการสร้าง Parsers ขึ้นตัวอย่างข้างต้นกำลังได้รับความยาวสักหน่อย s ง่ายที่จะทำลายมันขึ้นมาเรากำหนด parsers ขนาดเล็กโดยใช้ไวยากรณ์ val foo P เดียวกันและใช้ประโยชน์จากมันใน parser หลักที่นี่เราจะเห็นว่าแต่ละคำนำหน้าและ parsers ส่วนต่อท้ายเป็น Parser String มากกว่า Parser Unit พวกเขาจะ return String ถ้าการแยกวิเคราะห์ของพวกเขาประสบความสำเร็จพื้นที่คือ st ill Parser Unit เนื่องจากไม่สามารถจับภาพอะไรได้และตัวแยกวิเคราะห์หลักก็ยังเป็น Parser Phrase โดยทั่วไปแล้วเครื่องวิเคราะห์ย่อทั้งหมดของ FastParse จะมีประเภทแบบคงที่ซึ่งจะบอกคุณถึงสิ่งที่คุณจะออกไปซึ่งเป็นประโยชน์สำหรับทั้งสองโปรแกรมเมอร์ สิ่งที่คาดหวังเช่นเดียวกับคอมไพเลอร์เพื่อช่วยตรวจสอบว่าคุณ didn t ทำผิดพลาดตัวอย่างเช่นถ้าคุณทำผิดพลาดและสันนิษฐานในการโทรว่า prefix. suffix ผลิต 3-tuple String, String, String แทน 2-tuple ของ String, สตริงคอมไพเลอร์จะจับมันได้ทันทีก่อนที่รหัสใด ๆ จะถูกเรียกใช้สมมติว่าคุณ didn t ทำผิดการใช้ parser parser หลักคือตรงกับที่ได้ก่อนหน้านี้แม้ว่าเรายังสามารถ ใช้คำนำหน้าหรือคำต่อท้ายด้วยตัวเองเนื่องจากเป็นอ็อบเจ็กต์ Parser String ที่ดีอย่างสมบูรณ์แบบนี่คือสิ่งที่ regexes มีปัญหาเมื่อ regex เติบโตขึ้นมากไม่ใช่เรื่องง่ายที่จะทำลายมันขึ้นมาในขณะที่รักษาความถูกต้องและเข้าใจได้ง่ายนอกจากนี้ถ้า คุณพบว่าตัวเองจับสิ่งต่าง ๆ มากมายในขนาดใหญ่ regex มันง่ายที่จะผสมตัวอย่างที่จับโดยกลุ่มเช่น 5 กับกลุ่ม 7 ด้วย combinators parser แต่ละ Parser T สามารถมีส่วนประกอบแยกได้ง่ายออกเป็นส่วนแยกและพวกเขาทั้งหมดอีกครั้ง statically พิมพ์เป็น Parser String Parser Unit Parser Phrase ฯลฯ ดังนั้นหากคุณพยายามที่จะรวมไว้ในรูปแบบที่ไม่ถูกต้องคุณจะได้รับข้อผิดพลาดของคอมไพเลอร์ที่เป็นประโยชน์ในท้ายที่สุดสิ่งต่อท้ายคำนำหน้าทั้งหมดเหล่านี้เป็นเพียงสิ่งที่สเกลเก่าธรรมดาของ Parser ชนิด T พวกเขาสามารถ instantiated ได้ทุกที่กำหนดให้กับตัวแปรท้องถิ่นหรือระดับโลก , เช่นเดียวกับวัตถุอื่น ๆ คุณสามารถ refactor ส่วนของ parser ขนาดใหญ่ออกมอบหมายให้ชื่อที่มีความหมายและรวมไว้เพื่อให้ parser ใหญ่โดยไม่จำเป็นต้อง blob ไวยากรณ์เสาหินเดียวที่มีตรรกะแยกวิเคราะห์ของคุณ. parsers อ้างอิงตามชื่อภายใน parser อื่นหมายถึง parsers สามารถ recursive ตัวอย่างเช่นที่นี่เราเปลี่ยนวลีเป็นวัตถุเหมือนต้นไม้มันเป็นทั้ง Word ที่มีสตริงหรือคู่ที่มีสองวลีอื่น ๆ ก่อนที่เราห่อทุกอย่างใน s ดังนั้น REPL จะดำเนินการสามงบเป็นหนึ่งบล็อกมากกว่าคำสั่งแยกนี้เป็นสิ่งจำเป็นที่นี่และสำหรับคำจำกัดความที่ตามมาซึ่งเป็น recursive และทำให้เพียงทำให้รู้สึกเมื่อใส่กันตอนนี้เราสามารถปรับเปลี่ยน ตัวแยกวิเคราะห์แทนที่จะมีการแยกวิเคราะห์ไวยากรณ์ส่วนต่อท้ายของฮาร์ดโค้ดต่อท้ายพื้นที่แทนให้ใช้คำนำหน้าหรือคำต่อท้ายคำนำของตัวแยกวิเคราะห์ แต่จะล้อมรอบด้วย parens ที่นี่เราแนะนำตัวแบ่งส่วนที่แยกใหม่ซึ่งเป็นตัวแยกวิเคราะห์เพียงอย่างเดียว กับก่อนหน้านี้และหลังคำนำหน้า parser ภายในอยู่ในขณะนี้ parened คำนำหน้าและคำต่อท้ายคือตอนนี้ suffened suffix ดังนั้น parser และ parened ขณะนี้ recursive กันและกันแต่ละคนสามารถเรียกอื่น ๆ เป็นส่วนหนึ่งของการแยกของพวกเขาคำนิยามของคำนำหน้าคำต่อท้ายและ ws ตัวเองจะไม่เปลี่ยนแปลง และเราสามารถใช้งานได้คุณสามารถดูได้ตอนนี้เรามีตัวแบ่งงานที่ใช้งานได้ซึ่งสามารถแยกวิเคราะห์ข้อมูลที่มีรูปทรงเป็นรูปทรงเป็นต้นไม้ได้ข้อมูลไม่เลวสำหรับโค้ด 7 บรรทัดตอนนี้เราอยู่ไกลเกินกว่าสิ่งที่มากที่สุด อีกครั้ง gexes มีความสามารถ แต่รหัสสำหรับตัวแยกวิเคราะห์ recursive ภาษาของเรายังคงสั้นและง่ายเข้าใจได้ - การใช้ร่วมกันเป็นโครงการ capstone เล็ก ๆ สำหรับการโพสต์นี้ฉันจะใช้เครื่องประเมินเลขคณิตขนาดเล็กโดยใช้ combinators parser นี่คือคล้าย กับสิ่งที่ผู้คนทำให้คุณทำในระหว่างการสัมภาษณ์งานเขียนโปรแกรม แต่ต้องมีการบิดการทำงานในการเป็นตัวแทนของสิ่งต่างๆในภาษาอังกฤษเช่นในขณะที่นักประเมินคณิตศาสตร์แบบดั้งเดิมอาจประเมินเพื่อกลับไปหา 18 สำหรับการออกกำลังกายนี้เราจะแยกวิเคราะห์ข้อมูลเช่น. ควรจะประเมินถึง 18 เพื่อลดความซับซ้อนของสิ่งที่เราจะ จำกัด จำนวนตัวอักษรจากศูนย์ถึงเก้าหลีกเลี่ยงความซับซ้อนทั้งหมดรอบปัจจัยการผลิตเช่นสิบห้าหรือสิบสองหรือหนึ่งร้อยยี่สิบแปดเพื่อเริ่มต้นให้ s ใช้วิธีการแยกหมายเลขตามตัวอักษรที่นี่ เราจะแสดงรายการตัวเลขที่เป็นไปได้ทั้งหมดด้วยตนเองและภายในแมปแผนที่จะจับคู่สตริงแต่ละตัวกับค่าจำนวนเต็มที่เป็นตัวแทนคุณจะเห็นได้ว่าเนื่องจากการโทรแผนที่ของเราจำนวนนี้เป็น Parser Int ในความสำเร็จ s ผลเป็นจำนวนเต็ม 32 บิตการทดสอบนี้เป็นเรื่องง่ายในขณะที่คุณสามารถดูจะแยกหมายเลขที่ถูกต้องหมายเลขแรกภายในค่าความสำเร็จสำหรับการป้อนข้อมูลแต่ละครั้งและล้มเหลวหากใส่ไม่ถูกต้องก็ยังมีข้อผิดพลาดค่อนข้างเป็นประโยชน์ ข้อความแสดงสิ่งที่คาดหวังและสิ่งที่พบ Great. Next เราต้องแยกโครงสร้างต้นไม้เหมือน recursive เพื่อให้เราสามารถจัดการ stuff like. To เริ่มต้นด้วยเรารู้ว่ามันจะดูอะไร like. Where ws คือ parser สำหรับ whitespace อาจเป็นเหมือนสิ่งที่เราเห็นก่อนหน้านี้แม้ว่าเราจะทำให้ซับซ้อนมากขึ้นเช่น n ถ้าเราต้องการให้ whitespace รวมบรรทัดใหม่ด้วยเช่นกันตอนนี้ให้ใช้เลยทีเดียวเช่นกันเราไม่ได้ระบุ lhs และ rhs - แต่จะเริ่มต้นสิ่งที่ควร parser กลับหลักก่อนหน้านี้เรากำหนดระดับวลีที่กำหนดเองของเราที่มีรูปร่างเหมือนต้นไม้ไบนารี แต่ถ้าเราเพียงต้องการประเมินการแสดงออกและ don t ต้องต้นไม้เราสามารถทำ parser return Int เพื่อเริ่มต้นและข้ามการสร้างต้นไม้เพื่อสำรวจและประเมินผล กินมันในภายหลังถ้าเราต้องการต้นไม้เราแน่นอนสามารถทำสิ่งที่คล้ายกับสิ่งที่เราทำก่อนหน้านี้และกำหนดลำดับชั้นชั้นต้นไม้ แต่ตอนนี้ให้ s skip that. Now สิ่งที่ไปใน lhs และ rhs ดีก็เป็นทั้ง หมายเลขหรือ parser ตัวล้อมรอบด้วย parens นอกจากนี้แตกต่างจากก่อนหน้านี้มีความแตกต่างระหว่างสิ่งที่สามารถไปใน lhs และ rhs เพื่อให้ s เพียงเรียกพวกเขาทั้งสอง expr. We ยัง haven t กำหนดดำเนินการให้ s จำกัด ให้สี่ตัวดำเนินการพื้นฐานที่สุด สำหรับตอนนี้เราใช้การจับภาพใน parser ผู้ประกอบการเพื่อให้เราสามารถเห็นว่าผู้ประกอบการถูกแยกวิเคราะห์เราจะต้องที่ภายหลังเพื่อตัดสินใจว่าจะรวมผลของ expr ด้านซ้ายและด้านขวา expr. Now เราอีกครั้ง ทำเกือบ แต่ถ้าคุณพยายามที่จะเรียกใช้นี้คุณจะได้รับข้อผิดพลาดในการคอมไพล์คุณสามารถดูได้เพราะบ่นเพราะเห็นว่า parser parser ทั้งหมดเป็น Parser Int, String, Int โดยที่เราอธิบายว่าเป็น Parser Int นี่เป็นเพราะมันทำจากสามตัวแบ่งย่อยที่ส่งกลับค่าดังนั้นถ้าเราต้องการแปลง Pa rser Int, String, int ไปยัง Parser Int เราจำเป็นต้องแม็ปมันในกรณีนี้ให้ s ให้ฟังก์ชัน map รวมผลลัพธ์ lhs และ rhs ขึ้นอยู่กับว่าโอเปอเรเตอร์อยู่ที่นี่นี่คือโค้ดที่สมบูรณ์ ตัวแยกวิเคราะห์ FastParse แบบง่ายๆสำหรับการแสดงผลทางคณิตศาสตร์แบบอังกฤษที่ช่วยให้คุณสามารถแยกวิเคราะห์และประเมินผลได้ในครั้งเดียวสิ่งที่ทั้งสามข้อคือ 30 บรรทัดของโค้ดตรงไปตรงมาคุณสามารถวางตัวอย่างข้อมูลทั้งหมดนี้ลงใน Ammonite Scala REPL โดยล้อมรอบไว้ใน s เพื่อให้แน่ใจว่า หรือคุณสามารถใช้ในโครงการ Scala ที่มีอยู่ได้โดยการเพิ่มการพึ่งพา FastParse ใน Maven Central คุณจะได้รับการสนับสนุน IDE เต็มรูปแบบสำหรับการทำงานร่วมกับเครื่องวิเคราะห์คำอธิบาย FastParse ของคุณเนื่องจากหลังจากทั้งหมดนี้เป็นโค้ด Scala แบบ Plain เก่าเท่านั้น ควรใช้เวลาสักครู่เพื่อพิจารณาทางเลือกถ้าคุณจะใช้สิ่งนี้โดยใช้เทคนิคอื่น ๆ บางวิธีคุณจะทำเช่นไรนี่คือพฤติกรรมที่เราต้องการใช้คุณจะใช้การใช้งานที่เท่าเทียมกันนี้ได้อย่างไรการเขียนพาร์เซอรี่ recursive-descent ที่เขียนด้วยลายมือ ใช้ YACC หรือ ANTLR ในฐานะที่เป็นแบบฝึกหัดควรพยายามใช้วิธีใดวิธีหนึ่งที่ไม่ใช่ parser-combinator เพื่อแก้ปัญหานี้โดยพลการเพื่อเปรียบเทียบว่าโซลูชันนี้มีลักษณะอย่างไรข้างต้นเรามีการใช้งาน 30 บรรทัดในโค้ดง่ายๆซึ่งสามารถใช้งานได้ง่าย จะฝังตัวอยู่ใน codebase ใด ๆ ที่มีขนาดใหญ่โดยไม่ต้องมีเครื่องมือพิเศษใด ๆ หรือ build-step. What ทางเลือกที่จะมีลักษณะเหมือนฉันจะออกจากที่เป็นออกกำลังกายสำหรับผู้อ่านตอนนี้เราได้เดินผ่านพื้นฐานของการแยกวิเคราะห์ข้อความที่มีโครงสร้างเป็นค่าที่เป็นประโยชน์ไม่ว่าจะเป็นต้นไม้ - โครงสร้างข้อมูลที่มีรูปร่างหรือผลลัพธ์ Int เดียวโดยใช้ combinator ในขณะที่การสาธิตนี้ทำโดยใช้ FastParse ใน Scala โค้ดจะดูเกือบเหมือนกันโดยใช้ไลบรารี parser-combinator ในภาษาอื่น ๆ เพียงสะกดแตกต่างกัน b แทน สะกด ab Python ช่วยให้คุณโอเปอเรเตอร์ - เกิน แต่ไม่ , ab ยังคงเป็น ab และเป็น replace. b แทนการสะกดคำว่า bab ถูกสะกดไว้ b และยังคงถูกเรียกใช้โดยทั่วๆไปสิ่งที่สะกดแตกต่างกันและบางสิ่งอาจมีความแตกต่างเล็ก ๆ น้อย ๆ แต่ห้องสมุดส่วนใหญ่ของ parser combinator ในทุกภาษาก็เหมือนกัน วิธีการสร้างออบเจ็กต์ Parser คุณสามารถรวมอ็อบเจ็กต์ Parser ขนาดเล็กเหล่านี้ไว้ในออบเจ็กต์ Parser ที่ใหญ่กว่าได้ผ่านทางตัวดำเนินการ like. or แผนที่คุณเรียกใช้อ็อบเจ็กต์ Parser ในการป้อนข้อมูลบางส่วนและจะแยกวิเคราะห์เป็นค่าบางอย่างหรือล้มเหลวนั่นคือทั้งหมดที่มีอยู่ โพสต์นี้ได้แสดงให้เห็นถึงค่าของ parser-combinators พวกเขามีอยู่เป็นพื้นกลางไม่มีความคลุมเครือและมีความยืดหยุ่นมากกว่า regexes เช่นช่วยให้สามารถแบ่งย่อยของตัวแปรย่อยและระบุชื่อได้และสามารถจัดการกับ grammars แบบวนซ้ำได้ง่ายกว่าเขียนด้วยมือ ที่มีการเรียงลำดับตัวทำซ้ำ recursive เริ่มต้นด้วยเครื่องมือรหัส - gen เช่น YACC หรือ ANTLR. Parsers ที่ต้องการประสิทธิภาพสูงสุดและ customizability จะยังคงต้องใช้มือกลิ้ง recursive โคตรหรือ c เครื่องมือ ode - gen เพื่อให้บรรลุว่า แต่มีระดับใหญ่ของ parsers ที่ไม่จำเป็นต้องมีประสิทธิภาพ super หรือ super - customizability บางทีคุณอาจต้องการแยกข้อมูลบางรูปแบบปิดบังที่ regex เกือบ - แต่ไม่มาก - และคุณสามารถหา parser ของบุคคลที่สามที่น่าสนใจสำหรับ it บางทีคุณอาจคิดค้นภาษาการเขียนโปรแกรมของคุณเอง - ซับซ้อนเกินไปสำหรับไวยากรณ์ของการเขียนโปรแกรม regex มีแนวโน้มที่จะเป็น recursive มากเกินไปสำหรับ parser ของบุคคลที่สามที่มีอยู่หลังจากคุณ เพิ่งคิดค้น แต่เร็วพอในกระบวนการที่ประสิทธิภาพ doesn t เรื่องจริงๆและคุณต้องการสิ่งที่ทำงานได้อย่างรวดเร็วเป็นกรณีเหล่านี้ที่ห้องสมุด parser-combinator ส่องคุณสามารถได้อย่างรวดเร็วและง่ายดายปังทำงานที่มีประสิทธิภาพ parser กับ ok ประสิทธิภาพใน เรื่องของนาทีและไปยังปัญหาต่อไปสำหรับหลายรูปแบบเขียน parser FastParse สมบูรณ์อาจใช้เวลาน้อยกว่าการหาวิธีการรวม ANTLR ในระบบสร้างของคุณบางทีต่อไปหากคุณต้องการที่คุณต้องการ ที่จะผลักดันขีด จำกัด ของประสิทธิภาพการทำงานและ customizability คุณสามารถเขียนใหม่ในสิ่งที่รุนแรงมากขึ้น แต่สำหรับตอนนี้โอกาสที่คุณ ain t gonna ต้อง it. Note ที่ parsers ข้างต้นเป็นเพียงตัวอย่างง่ายๆของสิ่งที่คุณสามารถทำกับตัวแยกวิเคราะห์ FastParse combinators เอกสาร FastParse ที่เกิดขึ้นจริงมีรายละเอียดมากขึ้นในทุกหัวข้อมีหลายตัวแยกวิเคราะห์ในตัวสำหรับการจัดการกรณีการใช้งานร่วมกันพฤติกรรมการรายงานข้อผิดพลาดอะไรทำไมถึงทำอย่างไรตัวอย่างเช่น parsers Arithmetic, JSON, Python, Scala, CSS. Automatic การจัดการไวท์สเปซการแยกวิเคราะห์แบบสุ่มด้วยการแยกวิเคราะห์ย่อหน้าของไวยากรณ์เช่น Python. Performance เปรียบเทียบรายละเอียดการใช้งานภายในสรุปยุทธวิธีในขณะที่ตัวแยกวิเคราะห์ด้านบนเป็นเพียงตัวอย่างของเล่น combinators ของตัวจัดกลุ่มมีความยืดหยุ่นและมีประสิทธิภาพพอที่จะสร้างงานได้ parsers สำหรับภาษาที่ซับซ้อนในโลกแห่งความจริงเช่น CSS, JSON, Scala หรือ Python Parsers ที่ผู้คนใช้ในการผลิตการจัดโครงสร้างข้อความไม่จำเป็นต้องยุ่งยากสับสนหรือน่าเบื่อด้วย parser combinato r ไลบรารีเช่น FastParse ตัวแยกวิเคราะห์ของคุณเป็นเพียงอีกหนึ่งออบเจ็กต์ในโปรแกรมที่คุณเรียกใช้ฟังก์ชันการทำ parser ที่มีขนาดใหญ่ขึ้นคือการประมวลผล parser ขนาดเล็กลงและรวมการแปลงค่าเหล่านี้ไว้กับตัวดำเนินการเช่น หรือไม่มี blob แบบหยาบคายของ regex ที่คลุมเครือในการไขปริศนาโดยไม่มีขั้นตอนสร้างโค้ดโค้ดแบบพิเศษเพื่อตั้งค่า IDEs แบบเดียวกันและคอมไพเลอร์ที่คุณใช้สำหรับส่วนที่เหลือของโค้ดของคุณจะให้ความช่วยเหลือและตรวจจับข้อผิดพลาดของคุณเมื่อทำงานกับ combinators ของตัวจัดแบ่งวิเคราะห์คำแนะนำด้วยวิธีนี้ จุดที่คุณมีความเข้าใจในสิ่งที่ combinators แยกวิเคราะห์เป็นและทำไมคุณอาจใช้พวกเขามีคุณใช้ห้องสมุดใด ๆ combinator parser ในอดีตหรือมีการแยกวิเคราะห์ที่เกี่ยวข้องกับเรื่องสงครามบอกบอกให้เราทราบในความคิดเห็นด้านล่างห้องสมุด Parser Combinator ฉันได้ใส่ไลบรารีตัวแบ่งเซ็ตอัพ C ใน GitHub มีตัวอย่างเพื่อแสดงวิธีการใช้งานและมีตัวแบ่งวิเคราะห์ที่เหมาะสมสำหรับ recursive สำหรับการเปรียบเทียบชุดทดสอบ parser-combinators 20 เร็วกว่าตัวแยกวิเคราะห์แบบง่ายฉันจะขอบคุณความคิดเห็นในโค้ด , combinators เลือกฉันต้องการให้จำนวนต่ำสุดโดยไม่สูญเสียประโยชน์และการอ่านเปรียบเทียบของรหัสใช้ combinators vs parser ง่ายหรือความคิดอื่น ๆ มีสอง stri ขั้นพื้นฐาน ยอมรับความคาดหวังสอง parsers nullary succ, ล้มเหลวและสอง parser constructors ทั้งหมดที่ใช้ผู้ functor ให้และรายการอาร์กิวเมนต์ variadic ของ parsers หรือ recognisers functor สำหรับ constructor parser เป็น variadic จึงจะผ่านหนึ่ง อาร์กิวเมนต์ผลลัพธ์สำหรับตัวแยกวิเคราะห์แต่ละตัวจะเรียกเฉพาะฟังก์ชัน functor ถ้าพาร์ติเซ็ททั้งหมดประสบความสำเร็จและให้อาร์กิวเมนต์ทั้งหมดการเรียกใช้ฟังก์ชัน functor ทันทีที่ตัวแยกวิเคราะห์ตัวแรกจากด้านซ้ายประสบความสำเร็จกับหมายเลขดัชนีซึ่งระบุอาร์กิวเมนต์ที่มีผลลัพธ์ที่ถูกต้องอาร์กิวเมนต์ที่เหลืออยู่ initialised กับ constructor เริ่มต้นสุดท้ายมี combinators สี่ที่สามารถใช้ในทั้ง recognisers และ parsers ซึ่งประพฤติตามที่พวกเขาทำใน boolean ตรรกะกับการประเมินผลลัดวงจรหลายและ discard. Edit รุ่นล่าสุดของไลบรารีนี้สนับสนุน backinstructor combinators เต็มรูปแบบ และแตกต่างจากไลบรารี combinator parser อื่นเนื่องจากแยกความแตกต่างแบบสถิตและแบบไดนามิกโดยการ จำกัด polymorphism แบบไดนามิก t o เฉพาะที่จำเป็นจริงคอมไพเลอร์สามารถแทรกอินไลน์ combinators ซึ่งเป็นอ็อบเจ็กต์ฟังก์ชันซึ่งส่งผลให้ประสิทธิภาพดีกว่า non-combinator handparted descend parsers parsers คอมไพเลอร์แบบรวมกันไม่ได้เป็นหัวข้อที่ปลอดภัย Brian Maso เพิ่มความคิดเห็นไว้ - 07 Oct 11 6 13 PM - edited ฉันเพิ่งวิ่งเข้าไปในนี้เดียวกัน NPE ที่บรรทัดเดียวกันในไม่ว่า NPE เกิดขึ้นเมื่อการประมวลผลนับหมื่นของเอกสาร JSON Twitter tweets API จริง NPE ดูเหมือนว่าจะเกิดขึ้นในบรรทัดของการป้อนข้อมูล JSON เอกสารที่สร้างขึ้นอย่างดีตัวจัดแบ่งข้อมูล JSON เป็นตัวจัดแบ่งข้อมูล JSON distribution, version 0 8 5. การติดตามการสืบค้นกลับที่ฉันได้รับนั้นเหมือนกับการรายงานต้นฉบับสำหรับชุดสแต็คเฟรมสุดท้ายไม่กี่ชุด null ที่ init ที่ init บรรทัดที่กระทำผิดคือ 132 AFAICT วิธีเดียวที่ NPE จะเกิดขึ้น ณ จุดนี้คือถ้า next, lastNoSuccess หรือสมาชิกเป็น null lastNoSuccess เป็น var ในชั้นนอกดังนั้นในขณะที่ไม่ใช่ null check ที่บรรทัด 132 ดูเหมือนว่าจะรับประกัน lastNoSuccess ไม่เป็นโมฆะการเกิดขึ้นบ่อยมากและสุ่มของจุด NPE เพื่อสภาพการแข่งขันบางทีสมาชิก lastNoSuccess เป็นอย่างใดการเปลี่ยนเป็นโมฆะหลังจากการตรวจสอบ null แต่ก่อน check. Brian Maso เพิ่มความคิดเห็น - 07 ต. ค. 11 6 13 PM - แก้ไขฉันเพิ่งวิ่งไปที่นี้เดียวกัน NPE ที่บรรทัดเดียวกันในไม่ว่า NPE เกิดขึ้นเมื่อการประมวลผลนับหมื่น JSON เอกสาร Twitter tweets API จริง NPE ดูเหมือนว่าจะเกิดขึ้นในบรรทัดของ JSON เอกสารการป้อนข้อมูลที่สร้างขึ้นอย่างดีตัวจัดแบ่งข้อมูล JSON เป็นตัวจัดแบ่งประเภท JSON dispatching, version 0 8 5 การติดตามการสืบค้นข้อมูลที่ฉันได้รับนั้นเหมือนกับการรายงานต้นฉบับของ sfor ในช่วงไม่กี่วินาทีของเฟรมสแต็คที่ init ที่ init บรรทัดที่กระทำผิดคือ 132 AFAICT วิธีเดียวที่ NPE จะเกิดขึ้น ณ จุดนี้คือถ้า next, lastNoSuccess หรือสมาชิกเป็น null lastNoSuccess เป็น var ในชั้นนอกดังนั้นในขณะที่การตรวจสอบ non-null ที่บรรทัด 132 ดูเหมือนจะ รับประกัน lastNoSuccess ไม่เป็นโมฆะการเกิดขึ้นอย่างไม่บ่อยและสุ่มของจุด NPE เพื่อสภาพการแข่งขันบางทีสมาชิก lastNoSuccess เป็นอย่างใดถูกเปลี่ยนเป็นโมฆะหลังจากการตรวจสอบเป็นโมฆะ แต่ก่อน check. Select2 Options Strategies. Bulls เริ่มเผชิญคำถามเกี่ยวกับ แนวโน้มขาขึ้นยังคงมีอยู่ แต่อาจมีปัญหาที่อาจเกิดขึ้นในอนาคตสำหรับแผนการออกจากสหภาพยุโรปหรือที่เรียกว่าตลาดตราสารทุน Brexit ณ สิ้นเดือนมิถุนายนซึ่งมากที่สุดนับตั้งแต่ปีพ. ศ. 2550 ตามการวิเคราะห์ข้อมูล Federal Reserve โดย Goldman Sachs Select2 ตัวเลือกกลยุทธ์การฝึกอบรมตลาดสต๊อกสำหรับมือใหม่ปัญหา C10K ช่วยประหยัดแหล่งข่าวลีนุกซ์ที่ดีที่สุดบนเว็บ - สมัครสมาชิกลินุกซ์ข่าวรายสัปดาห์ถึงเวลาแล้วที่เว็บเซิร์ฟเวอร์จะจัดการสิบพันปี d ลูกค้าถึงเวลาสำหรับเว็บเซิร์ฟเวอร์ที่จะจัดการกับลูกค้าหมื่นคนพร้อม ๆ กันอย่าคิดว่าให้ดูซิ - ที่ 20000 เครื่องนั่นคือ 50KHz, 100Kbytes และ 50Kbits วินาทีต่อไคลเอ็นต์ถ้าคุณไม่เห็นอีเมลนั้นให้ค้นหาสแปมของคุณ โฟลเดอร์ที่ข้อความอัตโนมัติบางครั้งไปวิธีที่จะยังคงได้รับผลตอบแทน 10 เงินปันผลถ้าคุณสามารถกระเพาะอาหารความเสี่ยง บริษัท พัฒนาธุรกิจสามารถระเหย แต่ผลตอบแทนอาจจะคุ้มค่าถ้าคุณสามารถถือเป็นเวลาหลายปีฟิล Do Doorn ครอบครัวเจ้าของของตัวเองมากขึ้นกล่าวว่า ของตลาดหุ้นในวันนี้ใครเป็นเจ้าของ U. Scala Parser Combinator ไบนารี Trading. No โปรแกรมอื่น ๆ มีความสนุกสนานใช้งานง่ายประสบการณ์การมีส่วนร่วมที่จะนำศักยภาพในการดำรงชีวิตการค้าวัสดุที่ใช้งานผู้ค้ากับการศึกษาและเครื่องมือที่พวกเขาต้องการที่จะทำให้ธุรกิจการค้าขึ้นอยู่กับข้อมูล - ไม่อารมณ์และมอบเนื้อหาเครื่องมือข้อมูลและระบบการซื้อขายที่สอดคล้องกับวิธีการซื้อขายที่เป็นกรรมสิทธิ์ที่พัฒนาโดย Connors Research Select2 Options Strategies เป็นตัวเลือกไบนารีที่ดีกว่าแผนภูมิ forex นักลงทุนสูงกว่าค่าเฉลี่ยพฤติกรรมเช่นหนึ่งตัดสินใจลงทุนอย่างชาญฉลาดจากความเชื่อมั่นมากกว่าการเชื่อว่าคุณเป็นสมาร์ทเพื่อปรับปรุงการซื้อขายหุ้นในตลาดหุ้นของคุณด้วยระบบเชิงปริมาณที่พัฒนาโดย Larry Connors เหมาะสำหรับการซื้อขาย SP 500 การเทรดดิ้งแกว่งซื้อขายวันและ การซื้อขาย ETF การอภิปรายเกี่ยวกับระบบปฏิบัติการยูนิกซ์เหมือนกับที่เป็นที่สนใจของฉัน แต่วินโดวส์ยังครอบคลุมปัญหาของ C10K ช่วยประหยัดแหล่งข่าวลีนุกซ์ที่ดีที่สุดบนเว็บ - สมัครสมาชิก Linux Weekly News เวลาสำหรับเว็บเซิร์ฟเวอร์เพื่อจัดการลูกค้าหมื่นตัวการดำเนินการล่าสุดแสดงให้เห็นว่าการขายหุ้นในช่วงเวลาอาจอยู่ที่นี่ภาพดังกล่าวได้ปรับตัวลดลงบ้างแล้วด้วยการสนับสนุนจาก SPX ซึ่งเป็นผลให้เราเปลี่ยนท่าทางในการขายเมื่อการชุมนุมถ้าการสนับสนุนที่ 2120 เห็นได้ชัดว่าดัชนีหักล้างความเชื่อมั่นเชิงรุกมากขึ้นก็น่าจะเป็นปัจจัยลบต่อหุ้นที่ร่วงลงในวันนี้เนื่องจากนักลงทุนยังคงวิตกกังวลเกี่ยวกับ Deutsch e สภาพคล่องของธนาคารและ U คุณสามารถซื้อเครื่อง 1000MHz พร้อมแรม 2 กิกะไบต์และการ์ด Ethernet 1000Mbit sec สำหรับ 1200 หรือมากกว่า Select2 Options Strategies ดูหน้าเซิร์ฟเวอร์ UNIX เวอร์ชัน execresses ของ Nick Black ที่ใช้งานได้ดีสำหรับรูปลักษณ์ Sql Clustering Options Trading เป็นนักลงทุนสูงกว่าค่าเฉลี่ยที่ประพฤติตัวเหมือนหนึ่งตัดสินใจลงทุนอย่างชาญฉลาดจากความเชื่อมั่นแทนที่จะเชื่อมั่นว่าคุณจะฉลาดอีกครั้งและรูปแบบของคอมพิวเตอร์บางรุ่นดูเหมือนจะกลับมาเป็นสไตล์อีกครั้ง เซิร์ฟเวอร์บนอินเทอร์เน็ตที่ให้บริการลูกค้านับพันราย Metatrader Ea Binary Options System 44 โปรแกรมอ่านปัญหา C10K ช่วยประหยัดแหล่งข่าวลีนุกซ์ที่ดีที่สุดบนเว็บ - สมัครสมาชิกลินุกซ์ข่าวประจำสัปดาห์ถึงเวลาแล้วที่เว็บเซิร์ฟเวอร์จะจัดการกับลูกค้านับหมื่น ทราบว่านี่เป็นบันทึกย่อบางส่วนเกี่ยวกับวิธีการกำหนดค่าระบบปฏิบัติการและเขียนโค้ดเพื่อสนับสนุนลูกค้าหลายพันรายหากคุณยังไม่สามารถเข้าสู่ระบบได้โปรดติดต่อผู้ดูแลเว็บไซต์ครูของคุณ Career Cruising คือ ผู้นำระดับโลกในด้านซอฟต์แวร์การพัฒนาอาชีพสำหรับคนทุกเพศทุกวัยเทรดดิ้งผู้ค้าที่ใช้งานอยู่ด้วยการศึกษาและเครื่องมือที่จำเป็นในการทำธุรกิจการค้าบนพื้นฐานของข้อมูลไม่ใช่อารมณ์และมอบเนื้อหาเครื่องมือข้อมูลและระบบการซื้อขายที่สอดคล้องกับวิธีการซื้อขายที่เป็นกรรมสิทธิ์ที่พัฒนาโดย Connors Research Select2 ตัวเลือกกลยุทธ์ Free Binary Options Brokers รูปแบบแท่งเทียนโดนัลด์ทรัมพ์สูญเสียรายได้เกือบพันล้านดอลลาร์เขาอาจไม่ได้สูญเสียเงินทั้งหมดรายงานที่เผยแพร่ว่าโดนัลด์ทรัมพ์เอาเกือบ 1 พันล้านสูญเสียภาษีของเขาได้จุดขึ้นในโลกทางการเมือง แต่ ผู้เชี่ยวชาญกล่าวว่ารายละเอียดมีความทึบแสงที่เป็นไปได้ที่เขาอาจจะไม่ได้สูญเสียเงินที่เกิดขึ้นจริงที่กล่าวว่า pullback เพื่อสนับสนุน isn t จำเป็นต้องเป็นสิ่งที่ไม่ดีเนื่องจากมีหลายระดับที่จะต้องพิจารณาและ U Winnebago สต็อก s blasts off หลังจากแกรนด์ การซื้อกิจการของ Design ให้คำแนะนำแก่การอัพเกรด Winnebago's Stock Rocket ไปสู่กำไรที่ใหญ่ที่สุดในหนึ่งวันใน 25 ปีหลังจากที่ บริษัท ได้ตกลงซื้อ Grand Design Recre ational Vehicle prompts RW Baird to upgrade the RV maker Select2 Options StrategiesIt shouldn t take any more horsepower than that to take four kilobytes from the disk and send them to the network once a second for each of twenty thousand clients Those 100 client licensing fees some operating systems charge are starting to look a little heavy In 1999 one of the busiest ftp sites, actually handled 10000 clients simultaneously through a Gigabit Ethernet pipe And the thin client model of computing appears to be coming back in style -- this time with the server out on the Internet, serving thousands of clients. We have sent an email to email That email contains instructions on logging into your account Select2 Options Strategies In October 2003, Felix von Leitner put together an excellent web page and presentation about network scalability, complete with benchmarks comparing various networking system calls and operating To Earn Money Online Without Any Investment In Benin As of 2001, that s ame speed is now being offered by several ISPs, who expect it to become increasingly popular with large business customers Binary Options Collar Strategy Rollover. Read Select2 Options Strategies Next. Aug 26, 2016 Chinese developers such as Greenland, Oceanwide and Shenzhen Hazens are By investing in Los Angeles, the builders are staking downtown s revival The Chinese can come in with a lot of money and execute deals a move prompted by a steep decline in the country s foreign exchange reserves. Best binary options strategies xposed autotrader Fibonacci strategy tool is macd winoptions binary strategy to formulate. Trade and Settlement Dates The date an order is filled is the trade date, whereas the security and cash are transferred on the settlement date. Connect With Us. Trade Binary Options Facebook Statistics. This will boost traffic for your target audience and also reduce page loading time If website loads fast visitors will generally spend more time on it, look at more pages and buy mo re products on it Trade Binary Options Facebook Statistics Binary Options Win Rate Group Links Website Facebook Twitter Google Linkedin Trade binary options with the world s leading regulated anyoption, anyone can You can find similar websites and websites using the same design template - Sites like The best binary options signal provider of binary options trading 70 accuracy free binary options signals will be issued in UK and US sessions based on binary options strategy - Sites like The event is organized for investors, Traders, and private banking, investment banks, Hedge funds, capital management, Forex Brokers, advisors, money managers, Financial news and service providers to engage with each other - Sites like Online Forex Trading Reviews, Broker Ratings, News and Information about the Forex Market General rule is try to host your website in country where your visitors are located Based on several factors, this report will give you estimated value of this website This report will let you find out how popular is this website Detailed analysis of economic indicators and statistics and their You don t have to download or install any software to trade Binary Options with First Trade Binary Options Facebook Statistics Long Term Binary Option Trading Australia Links Website Facebook Twitter Google Linkedin The best currency prediction tool to trade binary indicator will tell you which Mike s Facebook group Binary Options Trading experience Before joining The Admin and top traders weekly performance stats below Last names are Links Website Facebook Twitter Google Linkedin Trade binary options with the world s leading regulated anyoption, anyone can Page speed in also one of the ranking factors in search engine ranking alhorithms and it will also enable your users to browse throught your site more easily. Trade Binary Options Facebook Statistics Forecast Of Forex For Tomorrow Links Website Facebook Twitter Google Linkedin The best currency prediction tool to trade bina ry indicator will tell you which Mike s Signals Group on Facebook is a Community of Binary Options Traders Many of you will probably begin their trading careers with a FREE IQ Option demo week and the stats reflect the all-time average win rate of the group s admins Azrbaycanda Online Trading Veb Shif Links Website Facebook Twitter Google Linkedin Trade binary options with the world s leading regulated anyoption, anyone can. It will also estimate earning potential - how much this site could be making from displaying advertisements This data can This website in hosted on web server located in Germany Trade Binary Options Facebook Statistics Stock Market Charts Live Uk SEO Tip Hosting location can influence search engine rankings Trade Binary Options Facebook Statistics Binary options signals provider, binary options trading, binary options auto trade Traffic Statistics for. has 2,375 daily visitors and has the potential to earn up to 285 USD per month by showing ads Review, Compare and Rate the Best Forex Brokers and find Fx Trading Articles and Strategies Traffic Statistics Report will help you answer the question How much is this website worth It will estimate how much daily visitors and pageviews there are on this website Trade Binary Options Facebook Statistics Dedeler Video No Brainer Forex Binary Option Strategies Char. Best Trading Sites.24Option Trade 10 Minute Binaries. TradeRush Account Open a Demo Account. Boss Capital Start Trading Live Today.

No comments:

Post a Comment