Sunday, 14 April 2019

Scala parser combinator binário opções


Haoyi s Programação Blog. Easy Parsing com Parser Combinators. Parsing texto estruturado em estruturas de dados sempre foi uma dor Se você é como eu, você pode ter se perguntado por que todas as ferramentas de análise parecem ser parser-geradores em vez de apenas configurável-parsers Depois de tudo, quando você olha, por exemplo, uma biblioteca de física 2D como Chipmunk2D você só tem um monte de classes e funções que você pode chamar Em contraste, analisar bibliotecas como YACC ou ANTLR muitas vezes parecem exigir etapas de compilação personalizadas, A geração de código e outras coisas confusas que você nunca vê na maioria das bibliotecas normais. Parece que existem bibliotecas simples para analisar, sob o nome Parser Combinators Embora não tão bem conhecidas, essas bibliotecas de combinadores de analisadores expõem um monte de classes e funções Você pode usar para construir um analisador de forma conveniente, sem o boilerplate de mão-escrito recursive-descent parsing a fragiity de Regexes ou a complexidade de código-gen ferramentas como ANTLR Este post irá explorar um su FastParse e mostram como combinadores de analisador podem tornar o processo de análise de texto estruturado simples, fácil e divertido. Muitas vezes, ao programar, você encontra-se lidar com texto estruturado ou dados binários e precisa analisá-lo em algum tipo de estrutura de dados Antes de você pode usá-lo se você está trabalhando com JSON, código-fonte Python, algum formato de dados proprietário ou sua própria linguagem de programação personalizada sintaxe Tradicionalmente, suas opções para analisá-lo olhar algo parecido com isso. Dois tem um analisador preexistente If Portanto, use-o Isso lida com formatos comuns como JSON ou Python código-fonte bem, mas para menos onipresente dados-formatos, você pode não ser capaz de encontrar um bom analisador, e assim você está no seu own. Can eu analisá-lo usando Isto se aplica Para surpreendentemente muitos formatos de dados, por exemplo, muitos formatos de arquivo são simplesmente uma entrada por linha, caso em que n funciona muito No entanto, isso cai para qualquer coisa não trivial mesmo algo tão simples como CSV pode ser ingenuamente dividido em n e, devido para A presença de vírgulas entre aspas e escaping. Can I analisá-lo usando Regexes Isso às vezes funciona, especialmente se os dados de entrada é suficientemente regular, ou se você don t precisa de 100 precisão No entanto regex baseados analisadores tendem a ser frágil e impreciso, Positivos e falsos negativos, e não pode lidar com formatos recursivos como JSON, XML ou a maioria das linguagens de programação. Posso analisá-lo usando uma escrita escrita à mão recursiva-descendente Esta técnica é basicamente em última análise flexível e basicamente funciona, mas é tedioso, detalhado e Isto é o que o compilador Scala faz, por exemplo. Posso analisá-lo usando um gerador de parser Estas ferramentas como YACC ou ANTLR gerar código-fonte que é então compilado em um analisador executável Eles são amplamente utilizados, mas um pouco confuso e irritante Para começar com devido à etapa de compilação personalizada Os intérpretes padrão Python e Ruby usam essa abordagem, assim como ferramentas como Intellij IDEA. Em geral, se você não consegue encontrar um analisador preexistente, estes opt Ions são uma escolha entre as flexões flexíveis flexíveis regexes e flexível difícil recursiva descida e parser-geradores Que sobre o caso de uso onde eu quero algo que é fácil e flexível. Parser Combinator bibliotecas fornecer tal opção algo ligeiramente mais flexível do que regexes, mas menos Complexo do que escrever seu próprio analisador de descida recursiva ou usando um analisador de parser-generator. For o propósito deste post, vou estar usando a biblioteca FastParse na linguagem de programação Scala No entanto, existem muitas outras bibliotecas de combinador de analisador Scala, bem como Bibliotecas semelhantes em quase todas as principais linguagens de JParsec para Java, PyParsing para Python, Parsec para Haskell, e muitos mais A sintaxe entre essas bibliotecas línguas será diferente, mas os conceitos subjacentes parser-combinator deve ser principalmente o mesmo em todos eles. First Parser Combinator. FastParse pode ser usado em qualquer projeto Scala, construído usando qualquer ferramenta SBT, Maven, Gradle e implantado em qualquer ambiente Mas t A maneira mais fácil de começar é, provavelmente, através da Ammonite Scala REPL. Isso requer que você tenha o Java instalado como um pré-requisito e deixa você em um Scala REPL interativo que você pode usar para começar imediatamente a brincar com a biblioteca FastParse que está empacotada. O analisador FastParse mais simples é mostrado abaixo. Aqui, nós importamos a biblioteca fastparse e definimos um analisador com a função P que analisa uma única string, olá e nada mais Você pode usar este analisador simplesmente chamando-o. Aqui, podemos ver que Por outro lado, tentando parse adeus falhou na linha 1 caractere 1, ou seja, o primeiro caractere como esperava oi, mas em vez encontrou adeus. Se não houver suficiente Input para analisar parse também falha. Por outro lado, se houver muito input parse é bem-sucedido, mas com um índice mostrando o quanto ele realmente analisado. Se queremos pegar o caso onde nós didn t analisar completamente a entrada, é straightfo Para comparar o índice de sucesso 5 com o comprimento da seqüência de entrada 12 para ver se ou não consumimos totalmente a entrada, ou usar o operador final que discutiremos mais tarde. Como um começo, este analisador provavelmente não é mais útil do que um Chamada de método No entanto, é como você combinar analisadores que realmente dá o parser combinadores seu valor. Regex-Like Parsers. There são duas maneiras básicas você combinar analisadores em FastParse sintaxe ab e aa b pode analisar qualquer coisa a ou b pode analisar, tentou deixado - a-direita iea obtém prioridade, eb só é tentado se um fails. As você pode ver, analisando ou olá ou adeus funciona, mas analisando dunno faz com que ele falha queixando-se que esperou adeus em fila 1 personagem 1, mas em vez encontrou um dunno Você pode encadear mais coisas junto com e tentará todas elas esquerda-para-right. b parses um seguido por b. Como você pode ver, isto analisa hellogoodbye tudo de uma vez Se você tentar analisar apenas olá falha reivindicando s Procurando adeus na linha 1 personagem 5, mas não encontrou entrada desde i T tinha chegado ao final da seqüência Se você tentar analisar apenas adeus falha reivindicando ele está procurando olá na linha 1 personagem 1, mas em vez encontrou adeus Again. is chainable para que você possa cadeia como muitos parsers como você quer e eles ll Cada executar um após o outro. Nota que você pode terminar a cadeia com a. End parser, se você quiser falhar o parse se doesn t consumir a entrada inteira. Aqui, analisando hellogoodbyeworld falhou porque estava esperando para analisar até o fim Da seqüência de caracteres de entrada, mas em vez disso, encontrou mais caracteres sobrando Isso é algo que você geralmente só quer fazer no final do analisador quando você sabe que nada deve ser sobrando e salva você sempre precisando verificar se o índice de sucesso Input-length line up. Por outro lado, se você está feliz para analisar prefixos da string de entrada e don t mente se ele doesn t usar toda a coisa, você também pode apenas deixá-lo off. You pode combinar e. que é Quando as coisas começam a ficar interessantes. Isso transmite todas as entradas que você Xpect. And também falha nas coisas que você espera que falhe. Mais cedo, vimos como um analisador de combinações trivial é tão poderoso quanto uma chamada Agora, temos um analisador de combinações um pouco mais complexo que é tão poderoso como um regex, por exemplo Olá, adeus ao mundo seattle, embora com mais erros informativos quando o parse falhar Ainda, nada a escrever home about. Similarly, há sintaxe para a marcação de partes de um analisador como repeat. Here rep 1 significa que repete o analisador pelo menos uma vez Assim, se nós Ter um ou vários espaços entre o Olá e mundo o analisador consome todos eles, mas se você não tem espaços em tudo que se queixa estava procurando um mundo, mas em vez encontrou um personagem 6 Você também pode passar em min max explícita chamadas se Você quer ligá-lo a um determinado intervalo, ou exatamente se você quiser que ele repita exatamente N times. Marking um analisador como opcional é feito usando. Aqui, você pode ver que o analisador, bem como o mundo parser seattle são todos os opcionais Casos que você esperaria trabalhar Com e sem um mundo à direita todo o trabalho, mas se há um arrasto mas nenhum mundo falha. Isto é porque quando eu tento analisar olá com um espaço à direita, sucede em analisar o espaço mas o mundo seattle falha desde que não há mais entrada Depois do espaço Como todo o espaço-espaço-trailing é opcional, o parsebackbacks para o caractere 6, para ver se ele pode continuar o parse sem ele, agora esperando ver o Fim da entrada Já que não é o fim - ainda há Um mais no índice 6 - as falhas de análise. Além disso, nada um regex olá adeus mundo seattle couldn t fazer, apenas dispostos em sintaxe mais longa e mais detalhada As próximas seções irá cobrir recursos da biblioteca combinador parser que vão além do que um regex É capaz de. Capturing e transformar Parsers. So até agora, todos os nossos analisadores foram de tipo Parser Unit retornando no resultado de sucesso Esta unidade em Scala, e é equivalente a void em Java ou None em Python, e basicamente diz que nenhum valor ou seja, estes Analisar a entrada, verificar Que corresponde ao que o analisador espera, mas não retorna nenhum valor útil no final. Este é um padrão surpreendentemente bom porque a maioria dos analisadores não se preocupam com a maioria das coisas que eles estão analisando Se você está analisando Java, por exemplo, você não T preocupar-se com todos os espaços em branco, todos os s, s ou s, comentários e comentários Eles precisam existir, e você precisa ser capaz de identificá-los durante a análise, mas não há necessidade de armazenar qualquer informação sobre eles depois que você está feito Com o parse. Thus nos casos onde nós realmente nos preocupamos com a coisa que estamos analisando, devemos capturar usando o operador. Como você pode ver, adicionamos para capturar tanto o olá adeus, bem como o mundo seattle e, portanto, quando nós Com êxito analisá-lo obtemos os resultados como uma tupla contendo as duas cadeias Nós não capturamos o analisador de um ou mais espaços no meio, então os espaços analisados ​​não aparecem na saída. No entanto, muitas vezes não queremos Nós queremos algum tipo de classe com campos nomeados que contém o Dados que queremos Por exemplo, em Scala podemos definir isso como. Em qual caso, podemos usar para transformar a tupla de String, String em uma instância dessa classe. Finalmente, temos algo que podemos fazer com combinadores de analisador que você pode T fáceis de fazer com um regex Claro, depois de regex uma seqüência de caracteres, você pode pegar os grupos capturados por índice e manipulá-los, mas você pode t convenientemente defini-lo como parte da regex Não existe tal coisa como um regex retornando um Phrase, enquanto que aqui temos uma Frase de Parser retornando o objeto Phrase em sucesso e podemos modelar o jogo contra o para extrair o objeto Phrase e usá-lo. Analisando os Parsers. O exemplo acima está ficando um pouco longo, mas ele É fácil dividi-lo definimos parsers menores usando a mesma sintaxe val foo P, e simplesmente usá-los no parser. Here, podemos ver que o indivíduo prefixo e sufixo parsers são Parser String em vez de Parser Unit eles irão Retornar um String se seu parse sucede espaço é st Mal Parser Unit uma vez que não capturar nada, eo analisador principal ainda é Parser Phrase Em geral, todos os analisadores FastParse tem um tipo estático que lhe diz o que você vai sair dela, o que é útil tanto para o programador de saber O que esperar, bem como para o compilador para ajudar a verificar que você didn t fazer um erro. Por exemplo, se você cometeu um erro e assumiu na chamada que o prefix. suffix produziu um 3-tupla String, String, String em vez de Uma 2-tupla de String, String. O compilador irá pegá-lo imediatamente, antes de qualquer código ser executado. Assumindo que você não cometeu um erro, o uso do analisador de parser principal é exatamente o mesmo que era anterior. Use o prefixo ou o sufixo no seus próprios, porque são perfeitamente bons objetos da corda do analisador. Isto é algo que os regexes têm um problema com quando um regex cresce enorme, não é fácil quebrá-lo ao mantê-lo válido e facilmente compreensível Além disso, se Você se encontra captando muitas coisas diferentes em um grande Regex, é fácil misturar os snippets capturados, por exemplo, grupo 5 com o grupo 7 Com os analisadores de parser, cada Parser T pode ter seus componentes facilmente divididos em partes separadas, e eles são todos tipados estaticamente como Parser String Parser Parser Phrase etc. Por isso, se você tentar combiná-los de forma inválida, você obterá um erro compilador útil. No final, todos esses prefixo sufixo analisador coisas são apenas Plain Old Scala Objetos de tipo Parser T Eles podem ser instanciados em qualquer lugar, atribuído a local ou global variáveis , Assim como qualquer outro objeto Você pode refatorar partes de um analisador grande para fora, atribuí-los a nomes significativos e combiná-los para fazer o analisador maior sem precisar de um único blob de gramática monolítica que contém toda a sua lógica de análise. Recursive Parsers. This capacidade de Os analisadores de referência por nome dentro de outro parser significam que os analisadores podem ser recursivos. Por exemplo, aqui nós mudamos Frase em um objeto semelhante a uma árvore, ou é um Word contendo uma string, ou um Pair contendo duas outras frases. H Ere, nós envolvemos tudo em s, então o REPL irá executar as três instruções como um bloco em vez de comandos separados Isto é necessário aqui e para as definições subsequentes, que são recursivas e, portanto, só fazem sentido quando juntas. Agora, podemos modificar O analisador em vez de ter analisar uma gramática de sufixo de espaço de prefixo codificado, em vez disso, permitem que o prefixo ou sufixo para ser uma invocação de parser, mas cercado por parens. Here, vamos introduzir um parser novo parented, que é literalmente apenas parser, mas Com um antes e depois de Parser interior prefixo é agora parened prefixo e sufixo é agora parented sufixo Assim, parser e parened são agora recíproco mutuamente cada um pode chamar o outro como parte de seu parse As definições de prefixo sufixo e ws si são inalteradas. E podemos usá-lo. Como você pode ver, agora temos um analisador de trabalho que pode analisar uma determinada entrada em forma de árvore em uma estrutura de dados em forma de árvore Não é ruim para 7 linhas de código Até agora, estamos muito além do que a maioria ré Gexes são capazes de, mas o código para o nosso analisador de linguagem recursiva ainda é curto e facilmente compreensível. Putting-lo juntos. Como um pequeno projeto de capstone para este post, vou implementar um pequeno avaliador aritmético usando combinadores de analisadores Isto é semelhante Para o que as pessoas fazem você fazer durante as entrevistas de emprego de programação, mas com uma torção deve trabalhar sobre as representações em inglês de coisas Por exemplo, enquanto um avaliador aritmético tradicional pode avaliar. Para retornar 18 para este exercício, vamos analisar a entrada como. Deve também avaliar a 18 Para simplificar as coisas, vamos limitar o número literal de zero a nove evitando todas as complexidades em torno de insumos como quinze ou doze ou cento e vinte e oito. Para começar, vamos implementar a maneira de analisar números literais. Aqui , Nós lista manualmente para fora todos os números possíveis, e dentro da chamada de mapa corresponder cada seqüência de caracteres para o valor inteiro que representa Você pode ver que, devido à nossa chamada de mapa, o número é agora um Parser Int em sucesso, ele O resultado é um integer de 32 bits. Testando isso é fácil. Como você pode ver, ele analisa o número correto o primeiro número dentro do valor de Sucesso para cada entrada e falha se a entrada é inválida Ele ainda tem um erro relativamente útil Mensagem mostrando o que ele esperava, e o que ele encontrou Great. Next, temos que analisar a árvore recursiva-como estrutura, para que possamos lidar com coisas como. Para começar, sabemos que vai olhar algo como. Onde ws é o Parser para o espaço em branco, talvez como o que vimos anteriormente, embora pudéssemos torná-lo mais complexo como n se queríamos espaço em branco para abranger novas linhas também Por agora, vamos usar s. Este doesn t compilar ainda - nós haven t definido lhs e rhs - Mas é um start. What o retorno do analisador principal Anteriormente, definimos a nossa própria classe de frases personalizadas que s em forma de uma árvore binária No entanto, se apenas queremos avaliar a expressão e don t necessidade da árvore, podemos apenas fazer o analisador Retornar Int para começar com e ignorar a necessidade de construir uma árvore apenas para percorrê-lo e avaliar Comemos mais tarde. Se precisávamos de uma árvore, poderíamos fazer algo semelhante ao que fizemos anteriormente e definir uma hierarquia de classes em forma de árvore. Mas, por enquanto, vamos ignorar isso. Agora, o que acontece em lhs e rhs. Número ou o parser em si cercado por parens Além disso, ao contrário do anterior, não há nenhuma diferença entre o que pode ir em lhs e rhs assim vamos s apenas chamá-los ambos expr. Nós ainda haven t operador definido vamos restringir-lo para os quatro operadores mais básicos Por agora. Aqui, usamos captura no analisador de operador para que possamos ver exatamente qual operador foi analisado Vamos precisar disso mais tarde para decidir como combinar o resultado da expr do lado esquerdo e do lado direito expr. Now, we re Quase feito Mas se você tentar executar isso, você obtém um erro de compilação. Como você pode ver, ele está reclamando porque ele vê que o analisador de parser inteiro é um Parser Int, String, Int onde-como nós anotámos como Parser Int Isto é porque ele é feito de três sub-parsers que retornam valores. Assim, se quisermos converter o Pa Rser Int, String, Int para um Parser Int, precisamos mapeá-lo Neste caso, vamos fazer a função mapa combinar os resultados lhs e rhs, dependendo do que o operador foi. Aqui está o código completo. Agora temos escrito um Simples FastParse parser para Inglês-como expressões aritméticas, que permite que você analisá-los e avaliá-los de uma só vez A coisa toda é de 30 linhas de código simples Você pode colar este trecho inteiro para o Ammonite Scala REPL por cercá-lo em s para se certificar de que É executado como um bloco, ou você pode usá-lo em qualquer projeto Scala existente, adicionando uma dependência em FastParse no Maven Central Você obter suporte completo IDE para trabalhar com seus analisadores FastParse, uma vez que afinal eles são apenas Plain Scala código antigo. Vale a pena tomar um momento para considerar alternativas se você fosse implementar isso usando alguma outra técnica, como você faria isso Este é o comportamento que queremos implementar. Como você iria implementar este equivalente usando. Um parser recursivo-descendente escrito à mão. Usando YACC ou ANTLR. Como um exercício, vale a pena tentar usar uma dessas abordagens de não-analisador-combinador para resolver esta tarefa arbitrária para comparar o que a solução parece Acima, temos uma implementação em 30 linhas de código relativamente simples, que poderia facilmente Ser incorporado em qualquer base de código maior sem qualquer ferramental especial ou build-step. What que as alternativas parecem que vou deixar isso como um exercício para o leitor. Agora andamos através do básico de análise de texto estruturado em valores úteis se uma árvore - Estrutura de dados, ou um único resultado Int usando combinadores de analisador Enquanto esta demonstração é feita usando FastParse em Scala, o código seria quase o mesmo usando uma das bibliotecas de parser-combinator em qualquer outro idioma, apenas digitado differently. b é em vez Spelled ab Python permite que você operador sobrecarga, mas não. , Ab ainda é ab e é em vez disso. B é em vez disso soletrado bab é soletrado b e ainda é chamado. Em geral, as coisas são soletradas de forma diferente, e algumas coisas têm pequenas diferenças, mas a maioria das bibliotecas combinador de analisador em todas as línguas são bastante semelhantes Você tem alguns Maneira de construir objetos Parser Você combina esses pequenos objetos Parser em objetos Parser maiores, através de operadores like. or map Você chama usando um objeto Parser em alguma entrada, e o analisa em algum valor ou falha Isso é tudo o que há para it. Hopefully Este post tem demonstrado o valor de parser-combinators Eles existem como um meio ground. Mess críptico e mais flexível do que regexes, por exemplo, permitindo sub-parsers a ser dividido e dado nomes, e facilmente manipulação gramáticas recursivas. Simpler para escrever do que uma mão - rolled recursive descent parser. Simpler para começar com o que codificar-gen ferramentas como YACC ou ANTLR. Parsers que exigem o máximo desempenho e customizability ainda provavelmente necessidade de usar a mão-rolou recursiva descendente ou c Ode-gen ferramentas para alcançar isso No entanto, há uma grande classe de analisadores que não precisa de super-performance ou super-customizability. Perhaps você quer analisar alguns dados obscuros formato onde um regex é quase - mas não bastante - o suficiente, E você não pode encontrar um parser de terceiros conveniente para it. Perhaps você está inventando sua própria linguagem de programação - muito complexa para uma linguagem de programação regex sintaxe tende a ser recursiva, muito original para um analisador de terceiros para existir depois de tudo, você Apenas inventado, mas cedo o suficiente no processo que o desempenho realmente não importa e você só quer algo de trabalho quickly. It é esses casos onde as bibliotecas de parser-combinator brilho você pode rapidamente e facilmente bang um parser de trabalho, robusto com ok-performance in Uma questão de minutos, e passar para o próximo problema Para muitos formatos, escrever um analisador FastParse completo pode muito bem levar menos tempo do que descobrir como integrar ANTLR em seu sistema de compilação Talvez mais tarde, se você decidir que você precisa Para empurrar os limites de desempenho e customizability, você pode reescrevê-lo em algo mais sério, mas por agora as chances são que você não vai precisar it. Note que os analisadores acima são apenas um exemplo simples do que você pode fazer com FastParse parser Combinators A documentação FastParse real tem muito mais detalhes em cada tópico. Uma ampla gama de analisadores integrados para o tratamento de casos de uso comum. Error relatório behavior. Cuts o que, porquê, how. Several exemplo parsers aritmética, JSON, Python, Scala, CSS. Automatic whitespace manipulação. Monadic parsers, with. How para analisar indentação-gramáticas, como Python. Performance comparações. Internal implementação details. Debugging Tactics. While os analisadores acima são apenas exemplos de brinquedo, analisadores de parser são flexíveis e performant o suficiente para construir trabalho Analisadores para linguagens complexas do mundo real, como CSS, JSON, Scala ou Python Parsers que as pessoas usam na produção. Parsing texto estruturado não precisa ser difícil, confuso ou tedioso Com o analisador de parser R bibliotecas como FastParse seu analisador é apenas outro objeto em seu programa que você chamar funções em Tornar um analisador maior é apenas tendo parsers menores e combinando transformá-los com funções como operadores. Ou nenhum blob opaco de regex críptico para quebra-cabeças, sem configuração especial de código gen-passo para configurar Os mesmos IDEs e compiladores que você usa para o resto do seu código dar-lhe ajuda e pegar seus erros ao trabalhar com combinadores parser. Hopefully por isso Você tem uma compreensão do que são combinadores de analisador, e por que você pode usá-los Você já usou bibliotecas de combinador de analisador no passado, ou tem qualquer parsing relacionadas com histórias de guerra para nos informar Deixe-nos saber nos comentários abaixo. C Parser Combinator Library . Eu coloquei uma biblioteca de combinador de analisador de C em GitHub Há um exemplo para mostrar como ele é usado, e há um analisador decente simples recursive para comparação O parser-combinadores benchmark 20 mais rápido que o analisador simples Eu apreciaria comentários sobre o código , A escolha de combinadores Eu quero manter o número mínimo, sem comprometer a utilidade, ea comparabilidade legível do código usando os combinadores versus o analisador simples, ou qualquer outros pensamentos. Existem dois básicos stri Os reconhecedores ng aceitam, esperam, dois parsers nullar succ, falha e dois parser-construtores todos, qualquer que tomam um functor fornecido pelo usuário e uma lista de argumentos variadic de analisadores ou reconhecedores O functor para os construtores de analisador é variadic, por isso é passado um Argumento de resultado para cada analisador, tudo só chama o functor se todos os analisadores tiverem sucesso e fornecer todos os argumentos, qualquer chama o funtor assim que o primeiro analisador da esquerda tiver sucesso com um número de índice indicando qual argumento tem o resultado válido os argumentos restantes são Inicializado com o construtor padrão Finalmente, existem quatro combinadores que podem ser usados ​​em ambos os reconhecedores e analisadores, que se comportam como fazem na lógica booleana com avaliação de curto-circuito, muitos e descartar. Edit A versão mais recente desta biblioteca suporta full backtracking parser combinators , E é diferente de outras bibliotecas do combinador do analisador de C porque separa o polimorfismo estático e dinâmico Limitando o polimorfismo dinâmico t O apenas onde realmente necessário, o compilador pode inline os combinadores que são objetos de função resultando em desempenho melhor do que o não-combinador escrita à mão recursiva descendente parsers. Parser combinadores não são thread-safe. Brian Maso adicionou um comentário - 07 Out 11 6 13 PM - edited. I apenas correu para este mesmo NPE, na mesma linha em Não que o NPE ocorreu ao processar dezenas de milhares de JSON docs Twitter API tweets, na verdade O NPE parece ter ocorrido em uma linha de entrada JSON Documento que é bem formado O analisador JSON é o analisador JSON Dispatch, versão 0 8 5. O rastreio de aderência que recebi é o mesmo que o repórter original sfor os últimos quadros de pilha. Null no init. No init. A linha ofensiva é 132 AFAICT, A única maneira de um NPE acontecer neste ponto é se o próximo, lastNoSuccess, ou membros são nulos lastNoSuccess é um var na classe externa, então enquanto o não-nulo cheque na linha 132 Parece garantir que lastNoSuccess não é nulo, a ocorrência muito pouco freqüente e aleatória dos pontos NPE para uma condição de corrida talvez o membro lastNoSuccess está de alguma forma sendo alterado para null após a verificação nula, mas antes da verificação. Brian Maso adicionou um comentário - 07 Oct 11 6 13 PM - editado Eu acabei de correr para este mesmo NPE, na mesma linha em Não que o NPE ocorreu ao processar dezenas de milhares de JSON docs Twitter API tweets, na verdade O NPE parece ter ocorrido em uma linha de JSON O documento de entrada que está bem formado O analisador JSON é o analisador JSON Dispatch, versão 0 8 5 O rastreio de aderência que recebi é o mesmo que o repórter original sfor os últimos quadros pilha nulo em init. No init. A linha ofensiva é 132 AFAICT, A única maneira de um NPE acontecer neste ponto é se o próximo, lastNoSuccess, ou membros são nulos lastNoSuccess é um var na classe externa, portanto, enquanto o não-nulo check na linha 132 parece Garantia lastNoSuccess não é nulo, a ocorrência muito infreqüente e aleatória do NPE aponta para uma condição de corrida talvez o membro lastNoSuccess está de alguma forma sendo alterado para null após a verificação nula, mas antes do check. Select2 Opções Strategies. Bulls começar a enfrentar perguntas sobre Mais para cima A tendência de alta ainda está em vigor, mas há problemas potenciais à frente K s plano para sair da União Europeia, conhecido como mercado de ações Brexit no final de junho, o maior desde 2007, de acordo com uma análise dos dados do Federal Reserve por Goldman Sachs Select2 Opções Estratégias Treinamento do mercado de ações para iniciantes O problema C10K Ajude a salvar a melhor fonte de notícias Linux na web - inscreva-se no Linux Weekly News É hora para os servidores web lidarem com dez mil D clientes É tempo para os servidores web para lidar com dez mil clientes ao mesmo tempo, don t você acha Vamos ver - em 20000 clientes, que s 50KHz, 100Kbytes e 50Kbits seg por cliente Se você don t ver esse e-mail, procure no seu spam Pasta, onde as mensagens automatizadas às vezes vão Como ainda obter 10 rendimentos de dividendos se você pode estômago o risco As empresas de desenvolvimento de negócios podem ser voláteis, mas os rendimentos podem valer a pena se você pode aguentar por muitos anos, diz Phil van Doorn Do mercado de ações Estes dias Quem possui o Parser U. Scala Binário Trading. No binocular outro programa oferece a experiência divertida, intuitiva e envolvente que traz potencial para a vida Trading fornecedores ativos com a educação e as ferramentas de que necessitam para fazer comércios com base em dados - não emoção e fornece conteúdo, ferramentas, dados e sistemas de negociação alinhados com as metodologias de negociação proprietárias desenvolvidas pela Connors Research Select2 Opções Estratégias é opções binárias melhor do que gráficos forex Para ser um Acima da média investidor, se comportam como um Tomar decisões de investimento inteligente de convicção, em vez de ser convencido de que você é tão inteligente Melhorar a sua negociação no mercado de ações com sistemas quantificados desenvolvidos por Larry Connors Perfeito para a negociação do SP 500, swing trading, day trading e ETF trading Os centros de discussão em torno de sistemas operacionais Unix-like, como que é a minha área pessoal de interesse, mas o Windows também é coberto um pouco O problema C10K Ajuda a salvar a melhor fonte de notícias Linux na web - subscreva a Linux Weekly News It s Tempo para servidores web para lidar com dez mil clientes Ação recente sugere vender em tempos de reuniões pode ser aqui A imagem se tornou um pouco bearish com o apoio SPX quebrando e, como resultado, estamos mudando nossa postura para vender em comícios Se o apoio em 2120 Estavam claramente a ser quebrada, uma postura ainda mais agressiva de baixa seria justificada ações mergulharam mais em território negativo na segunda-feira como investidores permaneceram skittish em meio a preocupações sobre Deutsch E Banco de liquidez e U. You pode comprar uma máquina de 1000MHz com 2 gigabytes de RAM e uma placa 1000Mbit sec Ethernet para 1200 ou assim Select2 Opções Estratégias Veja Nick Black s execellent Fast UNIX página Servidores para um circa-2009 olhar para o Sql Clustering Opções Trading Para ser um investidor acima da média, se comportam como um Tomar decisões de investimento inteligente de convicção, em vez de ser convencido de que você é tão inteligente E o modelo de thin client de computação parece estar voltando em grande estilo - desta vez com o Servidor na Internet, atendendo a milhares de clientes Metatrader Ea Sistema de Opções Binárias 44 Programa de Leitura O problema C10K Ajude a salvar a melhor fonte de notícias Linux na web - inscreva-se no Linux Weekly News É hora para os servidores web lidarem com dez mil clientes Com Que em mente, aqui estão algumas notas sobre como configurar sistemas operacionais e escrever código para suportar milhares de clients. If você ainda não pode entrar, entre em contato com o administrador do site professor Carreira Cruising é um Líder global em software de desenvolvimento de carreira para pessoas de todas as idades. Comercializa comerciantes ativos com a educação e as ferramentas de que necessitam para fazer negócios com base em dados - e não emoção e fornece conteúdo, ferramentas, dados e sistemas comerciais alinhados com as metodologias de negociação proprietárias desenvolvidas por Connors Research Select2 Opções Estratégias Livre Opções Binárias Corretores Padrões Candlestick Donald Trump quase uma perda de bilhões de dólares de impostos Ele pode não ter perdido dinheiro em tudo Um relatório publicado que Donald Trump levou uma perda de quase 1 bilhão em seus impostos iluminou o mundo político, mas Os especialistas dizem que os detalhes são tão opaco que é possível que ele não pode ter perdido dinheiro real em tudo o que disse, um pullback para apoiar não é necessariamente uma coisa ruim, como há vários níveis a considerar e estoque U Winnebago s explode após Grand Os pedidos de aquisição de projetos atualizam os estoques de ações do Winnebago para o maior ganho percentual de um dia em 25 anos após o acordo da empresa para comprar 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, 2017 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