Onde posso encontrar padrão gramática BNF ou YACC para a linguagem C ++?

StackOverflow https://stackoverflow.com/questions/613479

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu estou tentando trabalhar em um tipo de gerador de código a ajuda de testes de unidade de um legado C / C ++ projeto misturado. Eu não encontrar qualquer tipo de ferramenta independente pode gerar código de stub de declaração. Então eu decidir uma construção, não deve ser tão difícil.

Por favor, alguém pode me apontar um link gramática padrão, melhor descrito pela linguagem yacc.

Espero não estar reinventando rodas, por favor me ajudar nesse caso.

Atenciosamente, Kevin

Foi útil?

Solução

A partir da C ++ FAQ Lite :

38,11 Existe uma gramática yacc-capazes C ++?

A gramática yacc principal que você vai querer é de Ed Willink. Ed acredita que sua gramática é totalmente compatível com o ISO / ANSI C ++ padrão, no entanto ele não o justificar: "a gramática tem não ", diz ele, 'foi usado com raiva'. Você pode obter a gramática sem rotinas de ação ou a gramática com rotinas de ação fictícios . Vocês também pode obter o correspondente lexer. Para aqueles que são interessado em saber como ele consegue um analisador livre de contexto (por empurrando todos as ambiguidades além de um pequeno número de reparos a ser feito mais tarde, após análise está completo), você pode querer ler capítulo 4 do sua tese .

Há também uma muito antiga gramática yacc que não suporta modelos, exceções, nem namespaces; além disso, desvia a linguagem principal na algumas formas sutis. Você pode obter esse gramática aqui ou aqui .

Outras dicas

Eu recentemente encontrou alguns arquivos de gramática para C ++ (C ++ 1998: ISO / IEC 14882: 1998 e C ++ 2008: ISO / IEC SC22 / WG21 N2723 = 08-0233 ) na grammarware website . As gramáticas são representados em Enahnced BNF, DMS BNF, BGF, SDF e Rascal notação. É uma pena, porém, que o C ++ gramáticas não parecem ficar atualizado (sem C ++ 2003 ou C ++ 11).

link de Jared é a coisa mais próxima de uma gramática livre de contexto que você pode obter. Certas coisas precisam ser adiada para mais tarde, mas isso é por alguns argumentos melhores do que a gramática sensível ao contexto de C ++.

Para piorar as coisas, C ++ 1x vai complexificar significativamente a gramática. Para chegar tão longe como uma análise perfeita de C ++, um analisador precisará implementar o suficiente do padrão de fazer corretamente a resolução de sobrecarga, incluindo dedução argumento modelo, que por sua vez vai exigir o mecanismo de conceitos, lambdas, e na verdade quase todo o linguagem, exceto para as especificações de pesquisa de nome e de exceção de dois estágios que, se bem me lembro, não precisa de implementação real para analisar um programa com sucesso.

Na verdade, você é meio caminho para um compilador se você pode analisar C ++.

Para uma outra abordagem, você poderia considerar piggy-backing em um compilador existente.

GCC-XML vai "compilação" C ++ em arquivos XML com um monte de informação útil; pode ser suficiente para seus propósitos.

Infelizmente, GCC-XML é de apenas 1/4-mantido, e coloca-lo para o trabalho pode ser ... interessante. Boa sorte, se você seguir esse caminho.

esta recentemente. Eu não tentei isso, então não tenho certeza se ele funciona. você poderia dar mais informações sobre a ferramenta que você está tentando desenvolver? Eu baixei essa gramática porque eu estou trabalhando em uma ferramenta de instrumentação para que eu possa adicionar informações de cobertura para o meu teste de unidade quadro .

Depois de re-ler o seu comentário ...

esta ferramenta caber exatamente suas necessidades.

O nosso DMS Software Reengineering Toolkit pode ser obtida com um robusto, cheio de recursos analisador C ++. Vejo http://www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.html Isto constrói ASTs e tabelas de símbolos, e pode inferir o tipo de qualquer expressão. DMS permite que se efectuem análises e transformações arbitrárias no código C ++.

Um transformação "simples" é instrumentar o código para cobertura de teste coleta dados; oferecemos isso como uma ferramenta COTS. Veja este documento para entender como DMS faz isso: http://www.semanticdesigns.com/Company/Publications/TestCoverage.pdf

EDIT setembro 2013 (Essa resposta foi ficando um velho bit): das DMS C ++ parser / resolução de nomes / controle alças de análise de fluxo total C ++ 11, na ISO-, GNU- e Microsoft variantes. Ele também irá analisar (e manter) código de fonte que contém a maioria das condicionais de pré-processamento. Ele tem uma gramática explícita condução do processo de análise, ao contrário GCC ou Clang.

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