Python é uma linguagem de scripting nice. Ele ainda dá acesso ao seu próprio analisador e compilador. Ele também lhe dá acesso a diferentes outros analisadores para fins especiais, como XML e cordas modelos.
Mas às vezes você pode querer ter seu próprio analisador. Isto é o que é para pyPEG.
Para obter uma visão rápida sobre o que está acontecendo, por favor leia este artigo sobre como analisar uma linguagem arbitrária para XML com pyPEG no meu blog.
O que é PEG?
PEG significa Parsing Expression gramática. É algo parecido com a idéia de Expressões Regulares para o contexto de linguagens livres; uma explicação muito clara que você vai encontrar no artigo da Wikipedia sobre PEG.
Com PEGs você pode descrever os mesmos idiomas como com BNF (e eles são ainda similar).
O que é um analisador de intérprete?
Analisadores comuns não estão utilizando as estacas e top-down de análise, mas LR (n) ou LL (n) e análise bottom-up. Isso resulta na idéia de implementar geradores de analisador.
Porque com LR (n) ou LL (n) analisadores você precisa calcular um DFA primeiro, geralmente você deixa o gerador de analisador fazer isso por você. O resultado é um analisador para a sua implementação gramática BNF, que foi a entrada. Pode-se chamar um gerador de analisador um compilador da FBN para a implementação parser.
Um analisador-Interpreter funciona como intérprete em vez de ser um compilador tal. Basta dar a sua gramática como entrada, e ele analisa a linguagem descrita fora do texto. Não será gerado nenhum programa.
Usando pyPEG
Isso significa que: usando pyPEG é muito fácil;-) Se você conhece expressões regulares, já que você vai aprender a usar pyPEG rapidamente.
Uma pequena amostra
Um exemplo: pense em uma linguagem simples como esta:
função FAK (n) {
& Nbsp; if (n == 0) {// 0! 1 é, por definição
& Nbsp; retornar 1;
& Nbsp;} else {
& Nbsp; retorno n * FAK (n - 1);
& Nbsp;};
}
A pyPEG para que a linguagem se parece com o seguinte código (ver também o script de exemplo):
comentário def (): return [re.compile (r "//.*"), re.compile ("/*.*?*/", re.S)]
def literal (): re.compile retorno (".? *" r'd * .d * | | d + ')
símbolo def (): retorno re.compile (r "w +")
operador def (): retorno re.compile (r "+ | - | * | / | ==")
operação def (): símbolo de retorno, operador, [literal, chamadadefuncao]
expressão def (): return [literal, operação, chamadadefuncao]
expressionlist def (): return expressão, -1, (",", expressão)
returnstatement def (): palavra-chave de retorno ("retorno"), expressão
ifstatement def (): palavra-chave de retorno ("se"), "(", expressão, ")", bloco, palavra-chave ("else"), bloco
declaração def (): return [ifstatement, returnstatement], ";"
bloco def (): return "{", -2, comunicado, "}"
de Parâmetros def (): return "(", símbolo, -1, (",", símbolo), ")"
chamadadefuncao def (): símbolo voltar ", (", expressionlist, ")"
função def (): palavra-chave de retorno ("função"), símbolo, de Parâmetros, bloco
def simpleLanguage (): função de retorno
O que é novo nesta versão:
- Esta é uma liberação de limpeza. O código de parse () e compor () foi corrigido.
O que é novo na versão 1.4:.
- Esta versão corrige alguns bugs com packrat parsing
O que é novo na versão 1.3:
- Substituir a tupla para nomes em pyAST pela Symbol (lista ) classe, o que é bastante compatível, mas suporta código mais descritivo em backends compilador, também.
O que é novo na versão 1.2:.
- Bugs com Unicode em tratamento de erros foram corrigidos
O que é novo na versão 1.1:.
- foi adicionado suporte a Unicode
O que é novo na versão 0.46:.
- pyPEG.print_trace como True
- Convertendo pyPEG para Python 3.x agora funciona perfeitamente usando 2to3
- As regras gramaticais que são aplicadas pode ser opcionalmente rastreada, definindo
- pyPEG produzirá este rastreio para stderr.
O que é novo na versão 0.45:.
- Bugfixes
O que é novo na versão 0.44:
- pyPEG agora decora cada objeto pyAST com nome de arquivo de origem e linha número.
Requisitos :
- Python
Comentários não encontrado