Monday, 21 August 2017

Scala Parser Combinator Binära Alternativ


Haoyi s Programmering Blog. Enkel analysering med Parser Combinators. Parsing strukturerad text i datastrukturer har alltid varit en smärta. Om du är som jag kanske du har undrat varför alla parseringsverktyg verkar vara parser-generatorer istället för bara konfigurerbara parsers När allt kommer omkring, när du tittar på, säg ett 2D-fysikbibliotek som Chipmunk2D får du bara en massa klasser och funktioner du kan ringa. Analys av bibliotek som YACC eller ANTLR verkar emellertid ofta kräva anpassade byggnadssteg, kompileringstidskälla - kodgenerering och andra förvirrande saker som du aldrig ser på de flesta vanliga bibliotek. Det visar sig att det finns enkla bibliotek för analysering under namnet Parser Combinators. Medan dessa inte är välkända, avslöjar dessa parserkombinationer bibliotek en massa klasser och funktioner du kan använda för att bygga en parser på ett bekvämt sätt utan panna av handskriven rekursiv nedstigning parsa fraktigheten av Regexes eller komplexiteten av kod-genverktyg som ANTLR Detta inlägg kommer att utforska en su ch-biblioteket, FastParse och visa hur parserkombinatörer kan göra processen att analysera strukturerad text enkelt, enkelt och roligt. Ofta när du programmerar, befinner du dig själv att hantera strukturerad text eller binär data och behöver analysera den i någon form av datastruktur innan du kan använda den om du tycker att du arbetar med JSON, Python-källkod, något proprietärt dataformat eller en egen anpassad programmeringsspråkssyntax. Traditionellt ser dina alternativ för att analysera det ut som det här. Det har en existerande parser om Så, använd den här Det hanterar vanliga format som JSON eller Python-källkod, men för mindre allestädes närvarande dataformat kan du kanske inte hitta en bra parser, och därmed är du ensam. Kan jag analysera det med hjälp av Detta gäller Till överraskande många dataformat är exempelvis många filformat helt enkelt en post per rad i vilket fall n fungerar bra Men det här faller ner för något som är icke-trivialt, även om det är något så enkelt som CSV kan inte vara naivt delat på n och på grund av till närvaro av citerade kommatecken och escaping. Can jag analysera det med Regexes Detta fungerar ibland, speciellt om ingångsdata är tillräckligt regelbundna eller om du inte behöver 100 noggrannhet. Regexbaserade parsrar tenderar att vara sköra och felaktiga, med både falska positiva och falska negativ, och kan inte hantera rekursiva format som JSON, XML eller de flesta programmeringsspråk. Kan jag analysera det med hjälp av en handskriven rekursiv nedstigning. Denna teknik är i grund och botten ytterst flexibel och fungerar i princip alltid men är tråkig, verbos och felaktigt Det här är vad Scala-kompilatorn gör. Exempelvis kan jag analysera det med en parsergenerator. Dessa verktyg som YACC eller ANTLR genererar källkod som sedan sammanställs i en körbar parser. De används ofta men lite förvirrande och irriterande Att komma igång med på grund av det anpassade byggsteget Standard Python och Ruby-tolkar använder denna metod, liksom verktyg som Intellij IDEA. Overall, om du inte kan hitta en existerande parser, väljer dessa ioner är ett val mellan enkla, flexibla splittringsregeringar och flexibla, svåra rekursiva nedstignings - och parsergeneratorer. Hur är det med användarfallet där jag vill ha något som är både enkelt och flexibelt. Parser Combinator-bibliotek ger ett sådant alternativ något lite mer flexibelt än regexes, men mindre komplex än att skriva en egen rekursiv nedstigningsparser eller använda en parser-generator. För syftet med detta inlägg använder jag FastParse-biblioteket i Scala-programmeringsspråket. Det finns dock många andra parserkombinationer för Scala, liksom Liknande bibliotek på nästan alla större språk från JParsec för Java, PyParsing för Python, Parsec för Haskell och många mer Syntaxen mellan dessa biblioteksspråk kommer att skilja sig, men de underliggande parser-combinator-koncepten ska vara mestadels desamma för alla. First Parser Combinator. FastParse kan användas i alla Scala-projekt, byggda med hjälp av något verktyg SBT, Maven, Gradle och distribueras i vilken miljö som helst, men t Det enklaste sättet att komma igång är förmodligen via Ammonite Scala REPL. Det här kräver att du har installerat Java som en förutsättning och släpper in dig till en interaktiv Scala REPL du kan använda för att omedelbart börja spela med FastParse-biblioteket som medföljer. Den enklaste FastParse-parsern visas nedan. Här importerar vi snabbparse-biblioteket och definierar en parser med P-funktionen som analyserar en enda sträng, hej och inget annat. Du kan använda den här parsern genom att bara ringa den. Här kan vi se det Parsing hej lyckades, återvändande Vilken är Enhet eller tomrum i Scala och analysera till index 5 Å andra sidan försökte man analysera farväl misslyckades i rad 1 tecken 1 dvs den första karaktären som det förväntade sig hej men fann istället farväl. Om det inte räcker Inmatning för att analysera parse misslyckas också. Om däremot s för mycket ingångsparse lyckas, men med ett index som visar hur mycket det faktiskt analyseras. Om vi ​​vill fånga fallet där vi inte fullständigt tolka inmatningen är det rakt rward för att jämföra framgångsindex 5 mot längden på ingångsträngen 12 för att se huruvida vi fullständigt konsumerat ingången eller använd slutanvändaren vi ska diskutera senare. Till en början är denna parser förmodligen inte mer användbar än en Metodsamtal Det är dock hur du kombinerar parsers som verkligen ger parserkombinatornas deras värde. Regex-Like Parsers. Det finns två grundläggande sätt att kombinera parsers i FastParse-syntaxen ab och aa b kan analysera vad som helst a eller b kan analysera, försökte vänster Till höger, dvs prioriteras och b försökas bara om en misslyckas. Som du kan se, analyserar du antingen hej eller farväl, men analyserar du inte gör det misslyckas klagar det, väntade hej hejdå i rad 1 tecken 1 men fann istället en dunno Du kan kedja fler saker tillsammans med och det kommer att försöka alla dem från vänster till höger. b analyserar en följd av b. Som du kan se analyserar detta hellogoodbye på en gång. Om du försöker att analysera bara hej, misslyckas det inte Letar efter adjö i rad 1 tecken 5, men fann ingen inmatning sedan jag T hade nått slutet av strängen Om du försöker att analysera bara hejd det inte hävdar att det letar efter hej på rad 1 tecken 1, men istället fann adjö Again. is chainable så att du kan kedja så många parsers som du vill och de ll Var och en köra den ena efter den andra. Notera att du kan avsluta kedjan med en enda parsare, om du vill misslyckas i analysen om den inte använder hela ingången. Hela analysen av hellogoodbyeworld misslyckades eftersom det förväntade sig att ha analyserat till slutet Av inmatningssträngen men i stället hittade den fler tecken kvar. Detta är något du vanligtvis bara vill göra i slutet av parsern när du vet att inget borde vara kvar och sparar dig från att alltid behöva kontrollera om framgångsindexet Inmatningslängdslinjen uppåt. Om du är glad att analysera prefix av ingångssträngen och inte tänka om det inte gör det hela kan du också bara lämna den. Du kan kombinera och som är När saker börjar bli intressanta. Detta passerar på alla ingångar du skulle e Xpect. And misslyckas också på de saker du förväntar dig att misslyckas. Tidigare såg vi hur en triviell combinator parser handlar om så kraftfull som ett samtal. Nu har vi en något mer komplex combinator parser som är ungefär lika kraftfull som en regex t. ex. Hej hejdå världen seattle, men med mer informativa fel när parsen misslyckas Fortfarande, inget att skriva hem om. På samma sätt finns det syntax för att markera delar av en parser som upprepad. Her rep 1 betyder att det upprepar parsern minst en gång. Således om vi ha ett eller flera mellanslag mellan hej och värld som parsern förbrukar dem alla, men om du inte har några mellanslag klagar det på att leta efter en men istället hittade en värld på karaktär 6 Du kan också skicka in explicit min max samtal om Du vill binda den till ett visst område, eller exakt om du vill att den ska repetera exakt N gånger. Att markera en parser som valfri görs genom att använda. Här kan du se att parsern och världen seattle parser är alla frivilliga The Fall som du förväntar dig att arbeta med Med och utan en efterföljande värld jobbar allt, men om det finns en efterföljande men ingen värld, misslyckas det. Det beror på att när jag försöker tolka hej med ett eftersläpat utrymme lyckas man analysera utrymmet, men världen seattle misslyckas eftersom det inte finns något mer input efter utrymmet Eftersom hela bakom-rymdvärlden är valfri, parser backtrackarna till tecken 6, för att se om det kan fortsätta analysera utan att det nu förväntar sig att se slutet på ingången eftersom det inte är slutet - det finns fortfarande en mer i index 6 - parsen misslyckas. Hittat, inget en regex hej adjö världen seattle couldn t göra, bara läggs ut i längre och mer verbal syntax De följande delarna kommer att omfatta funktioner i parser combinator biblioteket som går utöver vad en regex är kapabel att. Fångst och transformera parsers. Så långt har alla våra parsers varit av typen Parser Unit som återvänder i framgångsresultatet Denna enhet i Scala, och motsvarar tomrummet i Java eller None i Python och säger i grunden inget värde dvs dessa Parsers analyserar ingången, kolla Att det matchar vad parsern förväntar sig men återvänder inte något nytt värde vid slutet. Det här är en förvånansvärt bra standard eftersom de flesta parsrar inte bryr sig om de flesta saker de parsar om. Om du parsar Java, till exempel, gör du inte oroa dig för alla whitespace, alla s, s eller s, kommentarer och kommentarer De måste existera, och du måste kunna identifiera dem medan du analyserar men det finns inget behov av att lagra någon information om dem när du är klar med parsen. Thus i de fall vi faktiskt bryr oss om det vi parsar, måste vi fånga det med användaren. Som vi kan se lägger vi till för att fånga både hej farväl och världen seattle och därmed när vi parserar vi framgångsrikt, vi får resultaten som en tupel som innehåller de två strängarna. Vi fångade inte en eller flera mellanslagsparser i mitten, så de utrymmen som det analyseras syns inte i produktionen. Dock vill vi ofta inte Tuples of strings vi vill ha en slags klass med namngivna fält som innehåller data vi vill Till exempel i Scala kan vi definiera detta som. I vilket fall kan vi använda för att vrida tupeln av String, String i en instans av den klassen. Slutligen har vi något vi kan göra med parserkombinatorer som du kan Visst kan du inte göra med en regex Visst, efter att du regexat en sträng kan du ta tag i de fångade grupperna genom index och sedan manipulera dem, men du kan inte bekvämt definiera den som en del av regex. Det finns ingen sådan sak som en regex som återvänder en Phrase-objekt, medan här har vi en Parser-fras som returnerar frasobjektet till framgång och vi kan mönstret matcha med att extrahera det frasobjektet och utnyttja det. Bryta upp Parsers. The ovanstående exempel blir lite långt men det s enkelt att bryta upp det definierar vi mindre parsers med samma val foo P-syntax och använder dem helt enkelt i huvudparsern. Här kan vi se att de enskilda prefix - och suffixparsrarna är Parser String snarare än Parser Unit de kommer att Returnera en sträng om deras parse lyckas rymden är st Sju parserenhet eftersom det inte har tagit någonting och huvudparsern fortfarande är Parser-fras Allmänt har alla FastParse-parsrar en statisk typ som berättar vad du kommer att få ut av det, vilket är användbart både för programmeraren att veta Vad du kan förvänta dig och för kompilatorn för att kontrollera att du inte gjorde ett misstag. Till exempel, om du gjorde ett misstag och antog i samtalet att prefix. suffix producerade en 3-tuple String, String, String istället för En 2-tuppel String, String. Kompilatorn kommer fånga den genast innan någon kod körs. Om du inte gjorde ett misstag, är användningen av den huvudsakliga parserparsern exakt densamma som tidigare. Även om vi kunde också använd prefix eller suffix på egen hand eftersom de är helt bra Parser String-objekt. Det här är något som regexes har problem med när en regex blir stor, det är inte lätt att bryta upp det samtidigt som det är giltigt och lättförståeligt. Om Du finner dig själv att fånga många olika saker i en stor Regex är det enkelt att blanda upp de fragment som fångats av t. ex. grupp 5 med grupp 7. Med parserkombinationer kan varje Parser T enkelt bryta ut komponenterna i separata delar och de är alla statiskt typade som Parser String Parser Unit Parser Phrase etc så om du försöker kombinera dem på ogiltiga sätt får du ett användbart kompilatorfel. I slutet är alla dessa prefix suffix parser saker är bara Plain Old Scala Objects av typen Parser T De kan instanseras var som helst, tilldelade lokala eller globala variabler , Precis som något annat objekt Du kan refactor delar av en stor parser ut, tilldela dem meningsfulla namn och kombinera dem för att göra den större parsern utan att behöva en enda monolitisk grammatikblock som innehåller all din parsinglogic. Recursive Parsers. This ability to referensparsers med namnet inuti en annan parser betyder att parsers kan vara rekursiva. Till exempel här byter vi fras till ett trädliknande objekt, det är antingen ett ord som innehåller en sträng eller ett par som innehåller två andra fraser. vi, vi sätter ihop allt i s, så REPL kommer att utföra de tre uttalandena som ett block i stället för att skilja kommandon Detta är nödvändigt här och för de efterföljande definitionerna, som är rekursiva och sålunda bara vettiga när de sätts samman. Nu kan vi modifiera parsern i stället för att analysera en hårdkodad prefixrums suffix grammatik, tillåter istället antingen prefixet eller suffixet att vara en invokation av parser men omgiven av parener. Här introducerar vi en ny parened parser, som är bokstavligen bara parser men med en före den och efter Insidan parser prefix är nu parened prefix och suffix är nu parened suffix Således parser och parened är nu ömsesidigt rekursiva var och en kan kalla den andra som en del av deras parse Definitionerna av prefix suffix och ws själva är oförändrade. Och vi kan använda den. Som vi kan se har vi nu en fungerande parser som kan analysera en given trädformad inmatning i en trädformad datastruktur. Inte dåligt för 7 linjer kod. Vidare ligger vi långt bortom vad som mest re Gexes kan, men koden för vår rekursiva språksparser är fortfarande kortfattad och lättförståelig. Att lägga den tillsammans. Som ett litet capstone-projekt för det här inlägget kommer jag att implementera en liten aritmetisk utvärderare med hjälp av parserkombinationer. Detta liknar till vilka människor du gör under programmeringsjobbintervjuer, men med en vridning måste det fungera på engelska representationer av saker. Till exempel, medan en traditionell aritmetisk utvärderare kan utvärdera. För att returnera 18 för denna övning kommer vi att analysera inmatning som. Bör också utvärdera till 18 För att förenkla saker kommer vi att begränsa det bokstavsliga talet från noll till nio, för att undvika alla komplexiteter kring ingångar som femton eller tolv eller ett hundra tjugoåtta. Till att börja med, låt oss genomföra vägen för att analysera bokstavliga tal. , listar vi manuellt alla möjliga tal och inuti kartsamtalet matchar varje sträng till det heltal som det representerar. Du kan se att på grund av vårt kartsamtal är numret nu ett Parser Int på framgång, det s resultat är ett 32-bitars heltal. Testing detta är easy. Som du kan se det analyserar det rätta numret det första numret inuti framgångsvärdet för varje ingång och misslyckas om ingången är ogiltig. Det har till och med ett relativt användbart fel meddelande som visar vad det förväntade sig och vad det funnit Great. Next måste vi tolka den rekursiva trädliknande strukturen, så vi kan hantera saker som. Till börja med vet vi att det kommer att se ut som om. Var är ws den Parser för whitespace, kanske som vi såg tidigare, även om vi skulle kunna göra det mer komplext som n om vi ville ha blankytor att även omfatta newlines. För nu, låt oss använda. Det komprimerar vi inte ännu - vi har t definierade lhs och rhs - men det är en början. Vad ska huvudparsern återvända Tidigare definierade vi vår egen anpassade fras klass som formades som ett binärt träd. Om vi ​​bara vill utvärdera uttrycket och inte behöver trädet, kan vi bara göra parsern återgå Int till att börja med och hoppa över att behöva bygga ett träd bara för att korsa det och utvärdera Åt det senare. Om vi ​​behövde ett träd kunde vi naturligtvis göra något som liknar vad vi gjorde tidigare och definiera en trädformad klasshierarki. Men för nu, släpp det. Nu vad går det med lhs och rhs Det är det antingen en antal eller parsern själv omringad av parener Dessutom, till skillnad från tidigare, det finns ingen skillnad mellan vad som kan gå i lhs och rhs så låt oss bara kalla dem båda expr. We har fortfarande otillräcklig operatör låt oss begränsa det till de fyra mest grundläggande operatörerna För nu. Här använder vi fångst på operatörsparsern så att vi kan se exakt vilken operatör som analyserades. Vi behöver det senare för att bestämma hur man kombinerar resultatet av expr på vänster sida och höger sida expr. Nu är vi åter Nästan gjort Men om du försöker köra detta får du ett kompileringsfel. Som du kan se klagar det för att det ser att hela parserparsern är en Parser Int, String, Int där-som vi annoterade det som en Parser Int Detta beror på att det är gjort av tre delparsers som returnerar värden. Om vi ​​vill konvertera Pa Rser Int, String, Int till en parser Int vi behöver kartlägga i det här fallet låt oss göra kartfunktionen kombinera lhs och rhs resultat, beroende på vad operatören var. Här är den fullständiga koden. Vi har nu skrivit en Enkel FastParse-parser för engelska-liknande aritmetiska uttryck som gör att du kan analysera och utvärdera dem på ett och samma gång. Hela saken är 30 linjer av rakt kod. Du kan klistra in hela det här satsen i Ammonite Scala REPL genom att omge det i s för att se till att det Körs som ett block, eller du kan använda det i något befintligt Scala-projekt genom att lägga till ett beroende av FastParse på Maven Central. Du får fullt IDE-stöd för att arbeta med dina FastParse-parsers, eftersom de ändå bara är Plain Old Scala-kod. Det är värt att ta en stund att överväga alternativ om du skulle genomföra detta med någon annan teknik, hur skulle du göra det? Det här är det beteende som vi vill implementera. Hur skulle du implementera denna motsvarighet med hjälp av en handskriven rekursiv nedstignings parser. Använda YACC eller ANTLR. As en övning är det värt att försöka använda en av dessa icke-parser-combinator metoder för att lösa denna godtyckliga uppgift att jämföra hur lösningen ser ut. Ovan har vi en implementering i 30 linjer med relativt enkel kod, som lätt Vara inbäddad i någon större kodbas utan några speciella verktyg eller byggsteg. Vad skulle alternativen se ut som att jag lämnar det som en övning för läsaren. Vi har nu gått igenom grunderna för att analysera strukturerad text i användbara värden om ett träd - Formad datastruktur eller ett enda Int resultat med hjälp av parserkombinationer Medan denna demonstration görs med hjälp av FastParse i Scala, ser koden ut nästan samma genom att använda en av parser-combinator-biblioteken på något annat språk, bara stavat annorlunda. b är istället stavad ab Python låter dig överbelasta operatören men inte. , ab är fortfarande ab och istället. b är i stället stavat Bab är stavat b och kallas fortfarande. Överallt stavas saker annorlunda och vissa saker har mindre skillnader, men de flesta parserkombinationer-bibliotek på alla språk är ganska lika. Du har lite sätt att konstruera Parser-objekt Du kombinerar dessa små Parser-objekt i större Parser-objekt via operatörer such. or map Du ringer med ett Parser-objekt på vissa inmatningar och det analyserar det till något värde eller misslyckas. Det är allt det finns. Detta inlägg har visat värdet av parser-combinators. De existerar som en mellanklass. Var kryptisk och flexibelare än regexes, t. ex. tillåter subparsers att delas upp och ges namn och hanterar enkelt rekursiva grammars. Simpler att skriva än en hand - rolled rekursiv nedstigning parser. Simpler för att komma igång med än code-gen verktyg som YACC eller ANTLR. Parsers som kräver den största prestanda och anpassningsbarhet kommer sannolikt att behöva använda handvalsad rekursiv nedstigning eller c ode-gen verktyg för att uppnå det Men det finns en stor klass av parsers som inte behöver super-prestanda eller super-anpassningsbarhet. Kanske vill du analysera något obskilt dataformat där en regex är nästan - men inte riktigt - nog, och du kan inte hitta en lämplig tredjepartsparser för den. Kanske kan du uppfinna ditt eget programmeringsspråk - för komplex för en regex programmeringsspråk. Syntax tenderar att vara rekursiv, för unik för att en tredjepartsparser ska existera trots allt du bara uppfunnit det men tillräckligt tidigt i processen, att prestanda inte riktigt spelar roll och du vill bara ha något som fungerar snabbt. Det är dessa fall där parser-combinator-biblioteken lyser du snabbt och enkelt kan knäcka en fungerande, robust parser med ok-prestanda i Om några minuter och gå vidare till nästa problem För många format kan det vara bra att skriva en komplett FastParse-parser än att ta reda på hur man integrerar ANTLR i ditt byggsystem. Kanske senare, om du bestämmer dig för att du behöver för att driva gränserna för prestanda och anpassningsbarhet kan du skriva om det i något mer allvarligt, men för tillfället är chansen att du inte behöver det. Notera att parserna ovan är bara ett enkelt exempel på vad du kan göra med FastParse parser Combinators Den faktiska FastParse-dokumentationen har mycket mer detaljer i varje ämne. Ett brett spektrum av inbyggda parsrar för hantering av vanliga användningsfall. Skräprapportering. Kollar vad, varför, hur. Hursom exempel parsrar Aritmetic, JSON, Python, Scala, CSS. Automatic whitespace handling. Monadic parsers, with. How att analysera indragning-grammars, som Python. Performance jämförelser. Interna implementeringsdetaljer. Debugging Tactics. While parserna ovan är bara leksak exempel, parser kombinatörer är flexibla och prestanda nog att bygga arbete parsers för komplexa, verkliga språk som CSS, JSON, Scala eller Python Parsers som människor använder i production. Parsing strukturerad text behöver inte vara svår, förvirrande eller tråkig Med parser combinato r bibliotek som FastParse din parser är bara ett annat objekt i ditt program du ringer funktioner. Att göra en större parser tar bara mindre parsers och kombinerar att transformera dem med funktioner som operatörer som. Eller ingen opak blob av kryptisk regex till pussel genom, inget speciellt byggkod-gensteg för att ställa upp Samma IDE och kompilatorer du använder för resten av koden ger dig hjälp och fångar dina fel när du arbetar med parserkombinationer. Peka på att du har en förståelse för vilka parserkombinatorer är och varför du kan använda dem Har du använt några parserkombinatorbibliotek tidigare eller har några parsingrelaterade krigshistorier att berätta Låt oss veta i kommentarerna nedan. C Parser Combinator Library . Jag har satt ett C parser-kombinationsbibliotek på GitHub Det finns ett exempel för att visa hur det används och det finns en enkel rekursiv anständig parser för jämförelse. Parser-combinators benchmark 20 snabbare än den enkla parsern Jag skulle uppskatta kommentarer på koden valet av kombinationer jag vill behålla numret till ett minimum utan att äventyra användbarheten och jämförbar läsbarhet av kod med hjälp av kombinationerna jämfört med den enkla parsern eller några andra tankar. Det finns två grundläggande streck ng recognisers accepterar, förväntar sig, två nullare parsers succ, fail och två parser-constructors alla, alla som tar en användarlevererad functor och en variadisk argumentlista av parsers eller recognisers Functor för parserkonstruktorerna är variadisk, så den passerar en Resultatet argument för varje parser, alla ringer bara functoren om alla parsrarna lyckas och ger alla argument, alla samtal functor så snart den första parsern från vänster lyckas med ett indexnummer som anger vilket argument som har det giltiga resultatet de återstående argumenten är Initialiserad med standardkonstruktorn Slutligen finns det fyra kombinatörer som kan användas på både genkännare och parsers, vilka beter sig som de gör i boolesk logik med kortslutningsutvärdering, många och kasta bort. Edit Den senaste versionen av det här biblioteket stöder kompletta backtracking-parserkombinationer , och skiljer sig från andra C-parser-kombinationsbibliotek eftersom det skiljer statisk och dynamisk polymorfism genom att begränsa dynamisk polymorfism t O bara där det behövs, kan kompilatorn inline kombinatorerna som är funktionsobjekt som resulterar i bättre prestanda än icke-combinator handskrivna rekursiva nedstigningsparsrar. Parametrarna är inte trådlösa. Brian Maso lade till en kommentar - 07 okt 11 6 13 PM - redigerad. Jag har precis kört in på samma NPE, på samma rad i Nej att NPE inträffade vid bearbetning av tiotusentals JSON docs Twitter API tweets, verkar faktiskt NPE på en rad JSON-ingångar Dokument som är välformat JSON-parsern är Dispatch JSON-parsern, version 0 8 5.Tackspårningen som jag mottog är densamma som den ursprungliga reportern för de senaste få stackramarna. null vid init. Vid init. Den övergripande linjen är 132 AFAICT. Det enda sättet som en NPE skulle hända vid den här tiden är om nästa, sistNoSuccess eller medlemmarna är null sistNoSuccess är en var i ytterklassen, så medan icke-nollkontrollen på linje 132 Verkar garantera att lastNoSuccess inte är noll, den mycket sällsynta och slumpmässiga förekomsten av NPE pekar på ett tävlingsförhållande, kanske den sistaNoSuccess-medlemen på något sätt ändras till null efter nullkontrollen, men före kontrollen. Brian Maso lade till en kommentar - 07 11 okt 13 13:00 - redigerad Jag körde precis in på samma NPE, på samma rad i Nej att NPE inträffade vid bearbetning av tiotusentals JSON docs Twitter API tweets, verkar faktiskt NPE på en rad JSON Inmatningsdokument som är välformat JSON-parsern är Dispatch JSON-parsern, version 0 8 5 Tackspåret jag mottog är densamma som den ursprungliga reportern för de sista få stapelramarna null vid init. vid init. Den förekommande linjen är 132 AFAICT. Det enda sättet som en NPE skulle hända vid den här tiden är om nästa, sistNoSuccess eller medlemmarna är null sistNoSuccess är en var i ytterklassen, så medan icke-nollkontrollen i linje 132 verkar Garantera lastNoSuccess är inte null, den mycket sällsynta och slumpmässiga förekomsten av NPE pekar på ett tävlingsförhållande, kanske den sistaNoSuccess-medlemen på något sätt ändras till null efter nullkontrollen, men före kontrollen. Välj2 Alternativstrategier. Bullar börjar ställa frågor om ytterligare uppåt Den haussefulla trenden är fortfarande på plats, men det finns potentiella problem framöver. K s planerar att gå ut ur Europeiska unionen, så kallad Brexit-aktiemarknaden i slutet av juni, mest sedan 2007, enligt en analys av Federal Reserve-uppgifterna genom Goldman Sachs Select2 Alternativ Strategier Börsmarknadsutbildning för nybörjare C10K-problemet Hjälp spara den bästa Linux-nyhetskällan på webben - prenumerera på Linux Weekly News Det är dags för webbservrar att hantera tio thousan d-klienter Det är dags för webbservrar att hantera tiotusen kunder samtidigt, tror du inte att vi ser - vid 20000 klienter, det är 50 kHz, 100 kbyte och 50 kbit sek per klient. Om du inte ser det mailet, kolla in din skräppost mapp där automatiska meddelanden ibland går Hur man fortfarande får 10 utdelningar om man kan mäta risken Affärsutvecklingsföretag kan vara flyktiga, men avkastningen kan vara värt om man kan hålla fast i många år, säger Phil van Doorn Hushållens egna mer av aktiemarknaden dessa dagar vem äger U. Scala Parser Combinator Binär Trading. No andra program erbjuder den roliga, intuitiva, engagerande upplevelsen som ger potential till livet Trading levererar aktiva handlare med utbildning och verktyg som de behöver för att göra affärer baserat på data - inte känslor och levererar innehåll, verktyg, data och handelssystem anpassade till proprietära handelsmetoder utvecklade av Connors Research Select2 Options Strategier är binära alternativ bättre än valutakartor Att vara en över genomsnittet investerare, uppför sig som en Gör smarta investeringsbeslut från övertygelse, snarare än att vara övertygad om att du är så smart Förbättra din börshandel med kvantifierade system som utvecklats av Larry Connors Perfekt för handel med SP 500, gungahandel, dagshandel och ETF-handel Diskussionen handlar om Unix-liknande operativsystem, eftersom det är mitt personliga intresseområde, men Windows är också täckt lite C10K-problemet Hjälp att spara den bästa Linux-nyhetskällan på webben - prenumerera på Linux Weekly News It s tid för webbservrar att hantera tio tusen kunder Senaste åtgärden föreslår sälja på rallytider kan vara här Bilden har visat sig något baisse med SPX-brytstöd och därmed förändrar vi vår ståndpunkt att sälja på rallyar Om supporten 2120 var tydligt att brytas, skulle en ännu mer aggressiv bearish hållning vara berättigad att aktierna dyppades ytterligare till negativt territorium på måndag då investerare var skitna på grund av oro över Deutsch E Bankens likviditet och U. You kan köpa en 1000MHz-maskin med 2 gigabyte RAM och ett 1000Mbit sec Ethernet-kort för 1200 eller så Select2 Options Strategies Se Nick Black s execellent Snabb UNIX-servrar sida för en circa-2009 titta på Sql Clustering Options Trading För att vara en över genomsnittlig investerare, beter sig som en. Gör smarta investeringsbeslut från övertygelse, snarare än att vara övertygad om att du är så smart. Den tunna klientmodellen för beräkning verkar komma tillbaka i stil - den här gången med Server ut på internet som serverar tusentals kunder Metatrader Ea Binär Options System 44 Läser Program C10K-problemet Hjälp spara den bästa Linux-nyhetskällan på webben - prenumerera på Linux Weekly News Det är dags för webbservrar att hantera tio tusen kunder med I det här fallet är några noter om hur du konfigurerar operativsystem och skriv kod för att stödja tusentals klienter. Om du fortfarande inte kan logga in, var god kontakta din lärares webbplatsadministratör. Karriärkryssning är en Global ledare inom karriärutvecklingsprogramvara för människor i alla åldrar Handel levererar aktiva näringsidkare med utbildning och verktyg som de behöver för att göra affärer baserade på data - inte känslor och levererar innehåll, verktyg, data och handelssystem i linje med de proprietära handelsmetoderna som utvecklats av Connors Research Select2 Alternativ Strategier Gratis Binär Optioner Mäklare Lysstake Mönster Donald Trump s nästan miljard dollar skatteförlust Han kanske inte har förlorat pengar alls En publicerad rapport som Donald Trump tog nästan 1 miljard förlust på sina skatter har tänt upp den politiska världen men experter säger att detaljerna är så ogenomskinliga att det är möjligt att han kanske inte har förlorat faktiska pengar alls. Det sägs att en återgång till stöd inte nödvändigtvis är en dålig sak, eftersom det finns flera nivåer att överväga och U Winnebago s lager spränger efter Grand Design buyout uppmanar uppgradera Winnebago s lager raketer mot den största en dags procentsats vinsten på 25 år efter att företaget har gått för att köpa 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