Este é um analisador PHP em estágio inicial projetado, desde o início, para cenários de uso de IDE (consulte Metas de Design para obter mais detalhes). Ainda há muito trabalho a ser feito, então, neste ponto, este repositório serve principalmente como um experimento e o início de uma conversa.
Esta é a ramificação v0.1, que altera as estruturas de dados para suportar a sintaxe adicionada após a linha de lançamento inicial 0.0.x.
Depois de configurar sua máquina, você pode usar o analisador para gerar e trabalhar com a Árvore de Sintaxe Abstrata (AST) por meio de uma API amigável.
<?php// Carregar automaticamente as classes necessárias requer __DIR__ . "/vendor/autoload.php";use MicrosoftPhpParser{DiagnosticsProvider, Node, Parser, PositionUtilities};// Instanciar novo analisador instance$parser = new Parser();// Retornar e imprimir um AST a partir do conteúdo da string$astNode = $parser ->parseSourceFile('<?php /* comentário */ echo "hi!"');var_dump($astNode);// Obtém e imprime erros do AST Node. O analisador lida com erros normalmente,// para que possa ser usado em cenários de uso de IDE (onde o código geralmente está incompleto).$errors = DiagnosticsProvider::getDiagnostics($astNode);var_dump($errors);// Percorre todos os descendentes de nós de $astNodeforeach ($astNode->getDescendantNodes() as $descendant) {if ($descendant instanceof NodeStringLiteral) {// Imprime o texto do nó (sem espaços em branco ou comentários)var_dump($descendant->getText());// Todos os nós vinculam de volta aos seus pais, então é fácil navegar na árvore.$grandParent = $descendant- >getParent()->getParent();var_dump($grandParent->getNodeKindName());// O AST é totalmente representativo e ida e volta à fonte original.// Isso permite que os consumidores criem ferramentas confiáveis de formatação e refatoração.var_dump($grandParent->getLeadingCommentAndWhitespaceText()); }// Além de recuperar todos os filhos ou descendentes de um Node, // Os nós expõem propriedades específicas do Node type.if ($descendant instanceof NodeExpressionEchoExpression) {$echoKeywordStartPosition = $descendant->echoKeyword->getStartPosition();// Para reduzir o consumo de memória, as posições são representadas como um único inteiro // índice no documento, mas suas posições de linhas e caracteres são facilmente recuperado.$lineCharacterPosition = PositionUtilities::getLineCharacterPositionFromPosition($echoKeywordStartPosition,$descendant->getFileContents() );echo "linha: $lineCharacterPosition->linha, caractere: $lineCharacterPosition->caractere"; } }
Observação: a API ainda não está finalizada, portanto, registre problemas e informe-nos quais funcionalidades você deseja expor e veremos o que podemos fazer! Além disso, registre quaisquer bugs com comportamento inesperado na árvore de análise. Ainda estamos nos estágios iniciais e qualquer feedback que você tiver será muito apreciado.
Design tolerante a erros – em cenários IDE, o código é, por definição, incompleto. Caso um código inválido seja inserido, o analisador ainda deverá ser capaz de recuperar e produzir uma árvore válida + completa, bem como diagnósticos relevantes.
Rápido e leve (deve ser capaz de analisar vários MB de código-fonte por segundo, para deixar espaço para outros recursos).
Estruturas de dados com uso eficiente de memória
Permitir análise incremental no futuro
Adere às especificações da linguagem PHP, suporta gramáticas PHP5 e PHP7
O AST gerado fornece propriedades (totalmente representativas, etc.) necessárias para operações semânticas e transformacionais, que também precisam ter bom desempenho.
Totalmente representativo e de ida e volta ao texto a partir do qual foi analisado (todos os espaços em branco e "curiosidades" de comentários estão incluídos na árvore de análise)
É possível percorrer facilmente a árvore através de nós pai/filho
Tempo de resposta da interface do usuário <100 ms, portanto, cada operação do servidor de linguagem deve ser <50 ms para deixar espaço para todas as outras coisas acontecendo em paralelo.
Simples e de fácil manutenção ao longo do tempo - os analisadores tendem a ficar muito confusos e muito rápidos, portanto a legibilidade e a capacidade de depuração são de alta prioridade.
Testável - o analisador deve produzir árvores de análise comprovadamente válidas. Conseguimos isso definindo e testando continuamente um conjunto de invariantes sobre a árvore.
API amigável e descritiva para facilitar o desenvolvimento de outras pessoas.
Escrito em PHP - torne o mais fácil possível para a comunidade PHP consumir e contribuir.
Para garantir um nível suficiente de correção em cada etapa do processo, o analisador está sendo desenvolvido usando a seguinte abordagem incremental:
Fase 1: Escreva um lexer que não suporte gramática PHP, mas suporte EOF e tokens desconhecidos. Escreva testes para todos os invariantes.
Fase 2: Suporte à gramática lexical PHP, muitos testes
Fase 3: Escreva um analisador que não suporte a gramática PHP, mas produza uma árvore de nós de erro. Escreva testes para todos os invariantes.
Fase 4: Suporte à gramática sintática PHP, muitos testes
Fase 5 (em andamento): Validação e otimização no mundo real
Correção: validar se não há erros produzidos nas bases de código de amostra, comparar com outros analisadores (investigar qualquer instância de desacordo), teste fuzz
Desempenho: perfil, benchmark em relação a grandes aplicações PHP
Fase 6: Finalizar a API para facilitar ao máximo o consumo das pessoas.
Algumas das construções gramaticais do PHP (ou seja, expressão de rendimento e strings de modelo) ainda não são suportadas e também existem outros bugs diversos. No entanto, como o analisador é tolerante a erros, esses erros são tratados normalmente e a árvore resultante fica completa. Para ter uma noção mais holística de onde estamos, você pode executar o conjunto de testes de "validação" (consulte Diretrizes de contribuição para obter mais informações sobre a execução de testes). Ou simplesmente dê uma olhada nos resultados dos testes de validação atuais.
Embora ainda não tenhamos iniciado a fase de otimização do desempenho, temos visto resultados promissores até agora e temos muito mais espaço para melhorias. Veja como funciona para obter detalhes sobre nossa abordagem atual e execute os testes de desempenho em sua própria máquina para ver por si mesmo.
Metas de Design – aprenda sobre as metas de design do projeto (recursos, métricas de desempenho e muito mais).
Documentação – aprenda como fazer referência ao analisador do seu projeto e como realizar operações no AST para responder perguntas sobre o seu código.
Ferramenta Syntax Visualizer - tenha uma ideia mais tangível do AST. Seja criativo - veja se você consegue quebrá-lo!
Situação atual e abordagem – quanto da gramática é suportada? Desempenho? Memória? Estabilidade da API?
Como funciona - aprenda sobre a arquitetura, decisões de design e compensações.
Lexer e analisador
Estratégia de tolerância a erros
Análise Incremental
Perguntas abertas
Estratégia de Validação
Contribuir! - aprenda como se envolver, confira algumas dicas para commits educacionais que ajudarão você a aprimorar a base de código (mesmo que você nunca tenha trabalhado em um analisador antes) e fluxos de trabalho recomendados que facilitam a iteração.
Este projeto adotou o Código de Conduta de Código Aberto da Microsoft. Para obter mais informações, consulte as Perguntas frequentes sobre o Código de Conduta ou entre em contato com [email protected] com perguntas ou comentários adicionais.