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.
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.
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 .
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.
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 ...
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?
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.