Pycparser
https://github.com/albertz/pycparser
Um analisador C e intérprete escrito em Python. Também inclui um gerador automático de interface ctypes.
É mais frouxo que a gramática C, ou seja, deve apoiar um superconjunto do idioma C em geral.
Parte do suporte pode um pouco incompleto ou errado neste momento, porque eu realmente não segui estritamente as especificações do idioma, mas melhorei o analisador por iteração no código-fonte do mundo real.
Projetos semelhantes
Geradores de interface analisadores / ctypes :
- Pycparser de Eli Bendersky. Analisador completo C99 em Python puro. Depende do Python Lex-Yacc (Ply). (Ainda não o testei. Parece ser o projeto mais completo e mais profissional. Se você não deseja um intérprete C, esse é provavelmente o projeto que você deve usar.)
- Pyclibrary (garfo github). É bastante lento e não funcionou tão bem para mim.
- ctypesgen. Também usa Lex+Yacc.
- CodeGen. Usa GCC-XML. Veja abaixo as desvantagens de tal abordagem.
Interpretadores:
- Cinterpreter. Python.
- Cint. Não em Python. Provavelmente o mais famoso.
- Cap. Não em Python. Não é realmente livre.
- Depurador da UPS. Não em Python.
- Picoc. Não em Python. "Um intérprete C muito pequeno."
- Bic. Não em Python.
Por que este projeto?
- Seja mais flexível. Agora é muito mais fácil com um analisador escrito à mão fazer operações em certos níveis do tubo de análise.
- Eu queria ter algum código independente que também possa ser executado facilmente no lado do usuário final. Portanto, o usuário final pode apenas atualizar o LIB e seus cabeçalhos e, em seguida, algum aplicativo usando este Python Lib usará automaticamente o LIB atualizado. Isso não é possível se você gerou a interface Ctypes estaticamente (por meio de uma ferramenta baseada em GCC-XML).
- Eu queria implementar o PYSDL e não queria traduzir os cabeçalhos SDL manualmente. Além disso, eu não queria usar as ferramentas existentes para fazer isso para evitar manter ainda mais o trabalho em algum momento posterior. Veja o projeto para obter mais informações.
- Essa funcionalidade pode ser usada da mesma forma para muitas outras bibliotecas C.
- Um desafio para mim. Apenas por diversão. :)
Exemplos
- Pysdl. Também usa o invólucro automático do ctypes e o mapeia para um módulo Python.
- Pycpython. Interprete o cpython em Python.
- Pylua. Interprete Lua em Python.
Consulte também os testes/test_interpreter. {C, py} 'hello world' Exemplo.
Experimente também ./demos/interactive_interpreter.py --debug .
Estado atual
- Muitos programas C simples devem ser analisados e interpretar corretamente agora.
- Tenho certeza de que o ponteiro da função typedefs é tratado incorretamente. Por exemplo,
typedef void f(); e typedef void (*f)(); são os mesmos agora. Consulte cpre3_parse_typedef e faça alguns testes se quiser corrigir isso. - Muitas funções da biblioteca C padrão ainda estão faltando.
- Pode haver alguns bugs. :)
- O C ++ ainda não é suportado. :)
- O estilo de código não está em conformidade com o PEP8 e as convenções padrão do Python em muitos lugares, pois é bastante antigo. Além disso, provavelmente deve ser reestruturado, pois cresceu demais em arquivos únicos. Estou lentamente consertando isso.
Como funciona o intérprete
Isso provavelmente é um pouco incomum. Enrolamos as funções mais importantes da biblioteca padrão C Standard diretamente no LIBC nativo, via ctypes . Traduzimos o código C analisado para um Python AST equivalente (via ast ), o que faz uso pesado dos ctypes . Em seguida, apenas executamos esse código Python gerado. Mas também podemos despejá -lo. Assim, podemos compilar o código C com um programa Python equivalente.

--- Albert Zeyer, http://www.az2000.de