Pegjs: [Façanha. Req.] Revertendo o processo de análise

Criado em 17 mai. 2018  ·  13Comentários  ·  Fonte: pegjs/pegjs

Tipo de problema

  • Relatório de Bug: Não
  • Solicitação de recurso: Sim
  • Questão: Sim
  • Não é um problema: Não

Pré-requisitos

  • Você consegue reproduzir o problema ?: Sim
  • Você pesquisou os problemas do repositório ?: Sim
  • Você verificou os fóruns ?: Quais fóruns?
  • Você fez uma pesquisa na web (google, yahoo, etc) ?: Sim!

Descrição

Reverter o progresso da análise seria incrível.

Comportamento esperado:

Transformando um objeto de volta no formato que foi analisado.

Comportamento real:

Posso apenas analisar o formato, não transformar o objeto de volta no formato analisado.

discussion feature task

Comentários muito úteis

Oi. Não compreendo o objetivo e o contexto (porquê) do seu pedido. Uma amostra concreta pode ajudar.

A análise reconhece uma string como parte de uma linguagem e, opcionalmente, constrói um AST ou avalia (interpreta) uma expressão na forma: parse(text) --> result
Esta função _parse () _, em geral, não tem garantia de ser uma função bijetiva. Portanto, não há garantia de que você possa reverter a análise, pois você pode descartar detalhes durante a análise, por exemplo.

Dado um AST, você pode gerar expressões em texto que corresponda a um idioma. Isso é feito como parte da geração de código e você pode usar mecanismos de modelo para transformar ASTs em código-fonte. Mas essa tarefa está fora do escopo de uma biblioteca de análise.

Todos 13 comentários

Oi. Não compreendo o objetivo e o contexto (porquê) do seu pedido. Uma amostra concreta pode ajudar.

A análise reconhece uma string como parte de uma linguagem e, opcionalmente, constrói um AST ou avalia (interpreta) uma expressão na forma: parse(text) --> result
Esta função _parse () _, em geral, não tem garantia de ser uma função bijetiva. Portanto, não há garantia de que você possa reverter a análise, pois você pode descartar detalhes durante a análise, por exemplo.

Dado um AST, você pode gerar expressões em texto que corresponda a um idioma. Isso é feito como parte da geração de código e você pode usar mecanismos de modelo para transformar ASTs em código-fonte. Mas essa tarefa está fora do escopo de uma biblioteca de análise.

Embora pessoalmente entenda a sensação de querer que o software seja capaz de gerar o que pode analisar, como resumiu @pjmolina , isso está fora do escopo desta biblioteca (gerador de analisador), então irei encerrar isso.

Eu sugiro que você apenas faça seu próprio gerador de código, ao usar um existente para a linguagem que você está analisando (você terá que se certificar de que o AST está correto).

Este ingresso faz muito sentido. Qual outra biblioteca você esperaria converter ASTs em código-fonte, dada a gramática na sintaxe PEG.js. Sim, atualmente não há como fazer isso. A maior parte do AST é gerado em ações e é impossível revertê-las. Mas quando há sintaxe para a geração AST da qual falamos em um problema diferente, de repente ela não só faz sentido, mas é possível implementar.

StringTemplate , por exemplo, é uma das muitas ferramentas que você pode usar para essa tarefa: code-gen a partir de ASTs.

Não acho que StringTemplate lê gramáticas na sintaxe PEG.js.

Contexto:

Para voltar ao texto original , um AST ( A bstract S yntax T ree) não seria suficiente. Por exemplo, dada uma gramática de JavaScript, essas duas declarações
normalmente teria o mesmo AST, embora sua sintaxe seja um pouco diferente,

// statement 1
var x = 5

// statement 2 - with semicolon
var x = 5;

Para poder voltar ao texto original , as ações do analisador devem ser uma função injetiva .

Sugestões:

Eu, pessoalmente, não vejo como tal recurso pode fazer parte de uma biblioteca de análise
que depende das ações dos usuários incorporados para criar a estrutura de saída.

Talvez no futuro se os pegjs tivessem algum tipo de criação automática de Parse Tree
isso seria viável.

Construa o seu próprio

Assumindo que dentro das ações incorporadas do pegjs, a informação completa da posição está disponível
você pode inserir suas próprias ações incorporadas personalizadas para construir um CST / ParseTree
e apenas transformá-lo em um AST na fase de pós-análise.
Depois de ter um CST, recriar a entrada original é bastante trivial ...

Avalie uma biblioteca de análise com a criação automática de CST / Parse Tree

Você pode encontrar vários candidatos aqui:
https://tomassetti.me/parsing-in-javascript/

Decidi dar uma outra olhada nisso, mas terá que ser pós-v1 antes de poder ser implementado porque esse será o ponto em que a API será estável e posso lançar um pacote que oferece uma estrutura AST comum básica ( por exemplo, @pegjs/ast ?). Este pacote pode ser usado por desenvolvedores de analisador para derivar seu próprio AST e, se necessário, pode ser usado para traduzi-lo de volta para o código-fonte por outra ferramenta (estou pensando em @pegjs/reverse )

@futagoza como vai com isso?

@ Coffee2CodeNL pegjs v1 ainda não foi lançado.

Pegue este analisador de transformação SVG em PEGJS, por exemplo: https://github.com/nidu/svg-transform-parser
Seria fantástico poder reverter o processo e transformar o AST de volta em uma string,
portanto, as transformações SVG podem ser facilmente modificadas, não apenas analisadas.
Uma ferramenta semelhante é o Augeas .

Alguém pode recomendar algumas ferramentas para gerar código de AST?

@lzane Qual AST?

@ polkovnikov-ph algum AST personalizado gerado pelo PEG

Existe alguma ferramenta que lê a gramática PEG pode fazer o trabalho de geração de código?

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

kwesibrunee picture kwesibrunee  ·  33Comentários

audinue picture audinue  ·  13Comentários

ceymard picture ceymard  ·  29Comentários

pepa65 picture pepa65  ·  24Comentários

lontivero picture lontivero  ·  25Comentários