Qual é o tipo mais poderoso de analisador?

28

Como projeto paralelo, estou escrevendo uma linguagem usando Python. Comecei usando um clone flex / bison chamado Ply, mas estou enfrentando os limites no poder do que posso expressar com esse estilo de gramática, e não estou interessado em invadir minha linguagem por causa de uma incompatibilidade de impedância com a ferramenta. Portanto, não tenho aversão a escrever meus próprios.

Então, qual é o tipo mais poderoso de analisador? Citações em artigos (assim como artigos mais introdutórios) seriam bem-vindas.

(Eu sei que 'poderoso' não está definido com precisão, mas vamos nos soltar um pouco e ver onde as respostas vão)

Paul Biggar
fonte
1
Voto negativo: não nível de pesquisa.
Warren Schudy 23/10/10
3
@ Warren: verifiquei o FAQ antes de perguntar - isso não parece ser um requisito.
Paul Biggar
1
na verdade, existem duas perguntas frequentes, uma para o site geral e outra para o CStheory. O CStheory um indica que perguntas que podem ser respondidas por exemplo lendo a Wikipedia são fora de tópico; consulte "Que tipo de perguntas são básicas demais?" em meta.cstheory.stackexchange.com/questions/225/… .
Warren Schudy
1
@ Warren: Essa é a FAQ que eu li. Eu tinha lido a wikipedia, mas achava que isso precisava de insight real.
Paul Biggar
1
Você quer dizer analisadores em produção ou teóricos, ou seja, aqueles que cobrem tipos gramaticais diferentes de CFG?
Raphael

Respostas:

33

Uma gramática é geralmente definida como uma gramática livre de contexto - uma definição precisa é dada na página da Wikipedia, mas funciona da mesma forma que no PLY, que é baseado no Bison , que por sua vez é baseado no yacc .

Diz aqui que PLY usa um analisador LALR . Este é essencialmente um analisador LR onde as tabelas de pesquisa são condensadas, possivelmente introduzindo conflitos de análise, reduzindo parte da expressividade de uma gramática LR (ou seja, uma gramática livre de contexto que um analisador LR pode analisar). Se você deseja conhecer as limitações desse ramo específico de analisadores e de outros analisadores, é apresentada aqui uma visão geral de todos os tipos de técnicas de análise (LL, LR e outras) .

Para responder sua pergunta: existem algoritmos de análise capazes de analisar qualquer linguagem sem contexto, mesmo que a linguagem seja ambígua (ou seja, há mais de uma maneira de interpretar a entrada):

O(n3|G|)n|G|

O(n3)O(n2)

Aqui você encontra um artigo discutindo uma implementação prática (uma adaptação) do algoritmo de Earley. Eles concluem: "Dada a generalidade da análise de Earley em comparação com a análise LALR (1) ((que é aproximadamente o que PLY faz)), e considerando que mesmo o pior momento dos PEP ((sua implementação do algoritmo de Earley)) não seria percebido por um usuário, este é um excelente resultado ".

O último tipo de analisador é o analisador GLR . Esta é uma versão generalizada da análise de LR, capaz de analisar qualquer linguagem sem contexto.

Uma implementação madura do GLR é ASF + SDF . O Bison também pode gerar um analisador GLR, embora suas implementações sejam ligeiramente diferentes do algoritmo GLR 'padrão'. O algoritmo Elkhound é um algoritmo híbrido GLR / LALR. Ele usa LALR quando possível e GLR quando necessário, para ser rápido e capaz de analisar qualquer gramática.

Além das gramáticas livres de contexto, existem gramáticas sensíveis ao contexto , mas geralmente são difíceis de analisar e não acrescentam muita expressividade: você pode fazer mais com elas, mas para a maioria dos aplicativos os usos extras não são relevantes, a menos que você esteja analisando uma linguagem natural.

Como etapa final, existem gramáticas irrestritas . Nesse ponto, a gramática está completa em Turing, portanto, não há limites quanto ao tempo necessário para analisar um idioma específico, o que é indesejável para a maioria dos aplicativos de análise. A energia extra quase nunca é necessária. Se você deseja usar todo esse poder, existe a máquina de idiomas disponível.

Por fim, implementar seu próprio analisador-gerador não é um assunto trivial, principalmente para que ele seja rápido. Pessoalmente, acabei de criar minha própria versão do flex (o gerador de lexer) e, embora isso parecesse um exercício de problemas algorítmicos relativamente simples, ficou bastante complexo acertar, principalmente quando tentei dar suporte ao Unicode. Considere usar uma implementação já existente em vez de escrever sua própria.

Alex ten Brink
fonte
1
Excelente resposta !! Alguma idéia de como os PEGs se encaixam?
Paul Biggar
2
Os PEGs são 'diferentes' dos CFGs: existem CFGs que não são PEGs e vice-versa. Eu o indico aqui: stackoverflow.com/questions/1857022/… .
Alex10 Brink
Isso também pode ser interessante: blogs.ethz.ch/copton/2009/07/08/parsing-expression-grammars .
Alex10 Brink
1
Na verdade, os geradores de analisadores mais comuns (yacc, Antlr, bison) permitem conceitos não CF por predicados ou código arbitrário que verifica se uma regra pode ser aplicada ou resp. decidir precedência. Isso pode ser usado para implementar semântica estática principalmente porque a sintaxe básica permanece essencialmente livre de contexto.
Raphael
1
Idiomas recursivos são precisamente os idiomas que podem ser decididos sempre interrompendo as máquinas de Turing. Portanto, qualquer linguagem sensível ao contexto também é recursiva, mas como as línguas sensíveis ao contexto são decidíveis em tempo exponencial, existem linguagens recursivas que não são sensíveis ao contexto. Gramáticas irrestritas são ainda mais poderosas: o problema da interrupção pode ser descrito por uma gramática irrestrita, mas não é uma linguagem recursiva.
Alex10 Brink
15

Um artigo do ICFP 2010 deste ano, Total Parser Combinators , descreve uma biblioteca combinadora de analisadores de terminação comprovável e também estabelece que nessa biblioteca "os combinadores de analisadores são tão expressivos quanto possível", uma vez que é garantido que o analisador será encerrado. Infelizmente, não me lembro da explicação que o autor deu para o que "o mais expressivo possível" significa, mas certamente parece relevante para sua pergunta sobre "poder".

Rob Simmons
fonte
1
Eu tenho um carro que não polui, na verdade ele também não se move ... Então a pergunta é: que tipo de linguagem é analisada por esta biblioteca? Não significa que este trabalho não seja interessante, é claro.
babou
2

Se você deseja ir além das gramáticas sem contexto para analisar linguagens de programação, mas ainda analisar em tempo polinomial, pode recorrer à análise de gramáticas de expressão ou gramáticas booleanas - as últimas também estão disponíveis nos sabores LL e LR (veja aqui ). Na teoria formal da linguagem, também são estudadas as poderosas linguagens Church-Rosser reconhecíveis em tempo linear , mas não conheço nenhum gerador de analisador implementado para elas.

No processamento de linguagem natural, os gostos são diferentes, por exemplo, lidar com ambiguidade (também: ambiguidade inerente) e a ordem das palavras livres desempenha um papel muito importante. Aqui, as palavras-chave com linguagem sensível ao contexto e os autômatos de reinicialização podem ajudar você a começar a ler.

Hermann Gruber
fonte
1
Considerando a maneira como a pergunta foi feita e a reclamação de que a FC é muito restritiva, sua resposta é claramente a melhor. Assim vai ...
babou
0

Ferramentas do gerador de analisador:

ANTLR é muito bom. Como alternativa, você pode dar uma olhada no JavaCC


fonte
Eu não sou um cientista da computação (apesar do que meu diploma diz;), então minhas palavras podem pesar levemente aqui. Eu concordo com Sazzad - o ANTLR é uma ferramenta muito poderosa. É muito completo e ainda não encontrei problemas com o gerador de analisador (LL (k), se bem me lembro). Por outro lado, eu ainda tenho que implementar um compilador por uma gramática um pouco complexo ...
Jörgen Sigvardsson
5
Acho que você está perdendo o objetivo da pergunta, e talvez todo o site. É sobre analisar a teoria, não sobre implementações e ferramentas.
Paul Biggar