PackCC - PackCC
| Desenvolvedor (s) | Arihiro Yoshida |
|---|---|
| Escrito em | C |
| Sistema operacional | Multi-plataforma |
| Tipo | gerador de analisador |
| Licença | MIT License |
| Local na rede Internet | sourceforge |
PackCC é um gerador de analisador para C . Suas principais características são as seguintes:
- Gera um analisador em C escrita a partir de uma gramática descrito em um PEG ,
- Dá um analisador grande eficiência por análise packrat ,
- Suporta diretos e indiretos esquerda recursiva regras gramaticais,
- Gera um thread-safe e reentrada parser,
- Consiste em apenas um único arquivo de origem compacto.
A gramática de um analisador de saída pode ser descrito em A (Expressão de análise gramatical) PEG. O PEG é uma linguagem de análise top-down e é semelhante à expressão regular gramática. Comparado com uma linguagem de análise de baixo para cima, como Yacc um 's, o PEG é muito mais intuitivo e não pode ser ambíguo. É que o PEG não exigem tokenization ser um passo separado, e as regras tokenization pode ser escrita da mesma forma como quaisquer outras regras gramaticais.
O analisador gerado pode analisar entradas de forma muito eficiente por análise packrat. A análise packrat é a descida análise recursiva algoritmo que é acelerado usando memoization . Usando packrat análise, qualquer entrada pode ser analisado em tempo linear. Sem ele, no entanto, o analisador resultante poderia apresentar um desempenho tempo exponencial no pior caso, devido à capacidade de olhar em frente ilimitado.
Ao contrário de analisadores packrat comuns, PackCC pode suportar diretos e indiretos esquerda recursiva regras gramaticais. Isso faz com que as regras gramaticais muito mais intuitivo.
O código gerado é embelezado e, como facilidade de compreensão possível. Na verdade, ele usa muita instruções goto, mas os fluxos de controle são muito mais rastreável de tempestades espaguete Goto gerados por alguns outros geradores de analisador.
-se PackCC está sob licença MIT, mas o código gerado pode ser distribuído sob qualquer licença ou pode ser usado em software proprietário.
exemplo arquivo de entrada
A calculadora de mesa. Note-se que as regras gramaticais esquerda-recursiva estão incluídos.
%prefix "calc"
statement <- _ e:expression _ EOL { printf("answer=%d\n", e); }
/ ( !EOL . )* EOL { printf("error\n"); }
expression <- e:term { $$ = e; }
term <- l:term _ '+' _ r:factor { $$ = l + r; }
/ l:term _ '-' _ r:factor { $$ = l - r; }
/ e:factor { $$ = e; }
factor <- l:factor _ '*' _ r:unary { $$ = l * r; }
/ l:factor _ '/' _ r:unary { $$ = l / r; }
/ e:unary { $$ = e; }
unary <- '+' _ e:unary { $$ = +e; }
/ '-' _ e:unary { $$ = -e; }
/ e:primary { $$ = e; }
primary <- < [0-9]+ > { $$ = atoi($1); }
/ '(' _ e:expression _ ')' { $$ = e; }
_ <- [ \t]*
EOL <- '\n' / '\r\n' / '\r' / ';'
%%
int main() {
calc_context_t *ctx = calc_create(NULL);
while (calc_parse(ctx, NULL));
calc_destroy(ctx);
return 0;
}