Pergunta

Eu escrevi recentemente um analisador em Python utilizando Ply (é uma reimplementação python de yacc). Quando eu estava quase terminando com o analisador eu descobri que a gramática eu preciso analisar me obriga a fazer alguma olhar para cima durante a análise para informar o lexer. Sem fazer um olhar-se a informar o lexer eu não posso analisar corretamente as cordas na língua.

Dado que eu posso controlar o estado do léxico das regras gramaticais Acho que vou estar resolvendo meu caso de uso utilizando um olhar para cima da tabela no módulo de analisador, mas pode tornar-se muito difícil de manter / teste. Então, eu quero saber sobre algumas das outras opções.

Em Haskell eu usaria Parsec, uma biblioteca de funções parsing (conhecido como combinadores). Existe uma implementação de Python da Parsec? Ou talvez alguma outra biblioteca de qualidade plena produção de analisar a funcionalidade para que eu possa construir um analisador sensível ao contexto em Python?

EDIT: Todas as minhas tentativas de análise livre de contexto falharam. Por esta razão, eu não espero que ANTLR para ser útil aqui.

Foi útil?

Solução

Uma opção que você pode considerar, se um analisador LL é ok para você, é dar ANTLR uma tentativa, ele pode gerar python também (na verdade, é LL (*), como eles nome dele, * representa a quantidade de lookahead ele pode lidar com).

Outras dicas

Eu acredito que pyparsing baseia-se nos mesmos princípios que parsec.

PySec é outro analisador monádico, eu não sei muito sobre ele, mas vale a pena olhar para aqui

Há ANTLR, que é LL (*), há pyparsing, que é mais objeto amigável e é como uma espécie de DSL, e então há Análise que é como Menir do OCaml.

nada impede que você para desviar o seu analisador do caminho "livre de contexto" usando camadas. Você pode passar informações para o lexer durante a análise, e desta forma conseguir total flexibilidade. Tenho certeza que você pode analisar o que quiser com PLY desta forma.

Para um hands-on exemplo, considerar - é um analisador para ANSI C escrito em Python com PLY. Ele resolve o C typedef clássico - problema identificador (que faz a gramática de C não sensível ao contexto) por preencher uma tabela de símbolos no analisador que está sendo usado no lexer para nomes de símbolo determinação tanto como tipos ou não

.

ANTLR é grande e tem o benefício adicional de trabalhar em vários idiomas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top