Pergunta

Qual é a melhor maneira de criar um analisador em C ++ de um arquivo com a gramática?

Foi útil?

Solução

Você também pode querer ter um olhar para estes links:

Outras dicas

Ele depende muito da gramática. I tendem a como analisador sintático descendente recursivo, que normalmente são escritos à mão (embora seja possível gerar um de uma descrição da gramática).

Se você estiver indo para usar um gerador de analisador, há realmente duas boas escolhas: byacc e Antlr. Se você quer algo que é (razoavelmente) compatível com yacc, byacc é (de longe) a melhor escolha. Se você está começando desde o início, com nenhum código existente nem a experiência que os favores usando algo compatível com o yacc, então Antlr é quase certamente a sua melhor aposta.

Desde que foi mencionado, eu também vou falar um pouco sobre Bison. Eu gostaria de evitar Bison como a peste que é. conselho de Brooks para "Plano de jogar algo fora" se aplica aqui. Robert Corbett (o autor de byacc) escreveu Bison como a sua primeira tentativa de um gerador de analisador. Infelizmente, ele deu a GNU em vez de jogá-la fora. Em um caso clássico de comercialização batendo excelência técnica, Bison é amplamente utilizado (e até mesmo recomendado, por aqueles que não sabem melhor) enquanto byacc permanece relativamente obscuro.

Edit: Eu odeio fazer isso, mas uma vez que também foi mencionado, eu também vou comentar sobre Boost.spirit. Embora isso possa ser o exemplo mais legal de modelo de meta programação ao redor, ele tem um par de problemas que me levam a recomendar contra a tentativa de colocá-lo para uso sério.

  1. vezes compilar com ele pode ficar insuportável - 10 minutos é comum, e uma gramática maior / mais complexa pode demorar ainda mais (supondo que ele não trava o compilador).
  2. Se você cometer nenhum erro em tudo, ele pode e frequentemente irá produzir mensagens de erro insanamente longas que são praticamente impossíveis de decifrar. Mensagens de erro de código de modelo-pesados ??são notoriamente ruim de qualquer maneira, e Espírito salienta o sistema mais do que quase qualquer outra coisa.

Acredite em mim: o fato de que você pode escrever algo como espírito em tudo fica bem na fronteira entre impressionante e surpreendente - mas eu ainda usá-lo apenas se eu com certeza foi a gramática eu estava lidando com era (e faria permanecer sempre) muito pequeno e simples.

Flex e bisonte . Lex & Yacc primos que fazem take c ++ existência em conta.

Você olhou para Lex e Yacc ? Para citar a seção 5 do documento vinculado:

A minha maneira preferida para fazer um C ++ analisador é ter Lex gerar um C liso arquivo, e para deixar YACC gerar C ++ código. Quando você, em seguida, ligar o seu aplicação, você pode funcionar em alguns problemas porque o código C ++ pela padrão não será capaz de encontrar C funções, a menos que você já disse que essas funções são extern "C".

Eu usei bisonte , encontrou os exemplos apenas para a direita para o meu nível. Foi capaz de criar uma calculadora simples com ele, é claro que pode fazer muito mais.

A calculadora levou 1 + 2 * 3, por exemplo, e construiu uma árvore de sintaxe. A documentação não descrevem como construir a árvore no entanto e que me levou um pouco de tempo para trabalhar fora.

Se eu fosse novamente eu olhar para 'antlr' como parecia bom e bem suportado.

Martin.

A melhor maneira de criar um analisador é usar lex e yacc.

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