PackCC - PackCC - Wikipedia
Vývojáři | Arihiro Yoshida |
---|---|
Napsáno | C |
Operační systém | Cross-platform |
Typ | Analyzátor generátoru |
Licence | Licence MIT |
webová stránka | github |
PackCC je generátor analyzátoru pro C. Jeho hlavní rysy jsou následující:
- Generuje analyzátor v písemném C z gramatiky popsané v a KOLÍK,
- Poskytuje analyzátoru velkou účinnost packrat parsing,
- Podporuje přímé a nepřímé levo rekurzivní gramatická pravidla,
- Generuje a bezpečné pro vlákna a reentrant analyzátor,
- Skládá se z jediného kompaktního zdrojového souboru.
Gramatiku výstupního syntaktického analyzátoru lze popsat v PEG (Parsing Expression Grammar). PEG je a jazyk analýzy shora dolů, a je podobný regulární výraz gramatika. Ve srovnání s jazykem analýzy zdola nahoru Yacc Jedním z nich je PEG, který je mnohem intuitivnější a nemůže být nejednoznačný. PEG nevyžaduje tokenizace být samostatným krokem a pravidla tokenizace lze psát stejným způsobem jako kterákoli jiná pravidla gramatiky.
Vygenerovaný analyzátor dokáže analyzovat vstupy velmi efektivně pomocí analýzy packrat. Packrat parsing je analýza rekurzivního sestupu algoritmus, který je zrychlen pomocí memorování. Pomocí syntaktické analýzy packratu lze jakýkoli vstup analyzovat v lineárním čase. Bez něj by však výsledný syntaktický analyzátor mohl v nejhorším případě vykazovat exponenciální časový výkon kvůli neomezené schopnosti výhledu.
Na rozdíl od běžných analyzátorů packrat může PackCC podporovat přímé i nepřímé levo rekurzivní gramatická pravidla.[1] Díky tomu jsou gramatická pravidla mnohem intuitivnější.
Vygenerovaný kód je zkrášlen a co nejsnadněji srozumitelný. Ve skutečnosti používá mnoho příkazů goto, ale řídicí toky jsou mnohem vysledovatelnější než bouře goto spaghetti generované některými jinými generátory syntaktických analyzátorů.
Samotný PackCC podléhá licenci MIT, ale vygenerovaný kód lze distribuovat pod libovolnou licencí nebo jej lze použít v proprietárním softwaru.
Příklad vstupního souboru
Stolní kalkulačka. Všimněte si, že jsou zahrnuta levo rekurzivní pravidla gramatiky.
%předpona "kalkulačka"prohlášení <- _ E:výraz _ EOL { printf("odpověď =% d n", E); } / ( !EOL . )* EOL { printf("chyba n"); }výraz <- E:období { $$ = E; }období <- l:období _ '+' _ r:faktor { $$ = l + r; } / l:období _ '-' _ r:faktor { $$ = l - r; } / E:faktor { $$ = E; }faktor <- l:faktor _ '*' _ r:unární { $$ = l * r; } / l:faktor _ '/' _ r:unární { $$ = l / r; } / E:unární { $$ = E; }unární <- '+' _ E:unární { $$ = +E; } / '-' _ E:unární { $$ = -E; } / E:hlavní { $$ = E; }hlavní <- < [0-9]+ > { $$ = atoi($1); } / '(' _ E:výraz _ ')' { $$ = E; }_ <- [ \t]*EOL <- ' n' / '\r\n' / ' / ';'%%int hlavní() { calc_context_t *ctx = calc_create(NULA); zatímco (calc_parse(ctx, NULA)); calc_destroy(ctx); vrátit se 0;}
Poznámky
- ^ „Packrat Parsers může podporovat levou rekurzi“ autori A. Warth, J. R. Douglass a T. Millstein