PackCC - PackCC

PackCC
Developer (s) Arihiro Yoshida
Geschreven in C
Besturingssysteem Cross-platform
Type parsergenerator
Licentie MIT-licentie
Website SourceForge .net / p / packcc / wiki / Home /

PackCC is een parser generator voor C . De belangrijkste kenmerken zijn als volgt:

  • Genereert een parser geschreven C uit een grammatica beschreven in a PEG ,
  • Geeft een parser grote efficiëntie door packrat parsing ,
  • Ondersteunt directe en indirecte links-recursieve grammatica regels,
  • Genereert een thread-safe en reentrant parser,
  • Bestaat uit slechts een enkel compact bronbestand.

De grammatica van een uitgang parser kan worden beschreven in PEG (parseren Expression grammatica). De PEG is een top-down parsing taal , en is vergelijkbaar met de reguliere expressie grammatica. Vergeleken met een bottom-up parsing taal, zoals Yacc iemands, het PEG veel meer intuïtief en kan niet dubbelzinnig zijn. De PEG vereist geen tokenization om een afzonderlijke stap, en tokenization regels kunnen worden geschreven op dezelfde manier als elke andere grammaticaregels.

De gegenereerde parser kan ingangen zeer efficiënt ontleden door packrat parsing. De packrat parsing is de recursive descent parsing algoritme dat wordt versneld met behulp van memoization . Via packrat parsing, kan een input worden ontleed in lineaire tijd. Zonder dat, maar de resulterende parser kon exponentieel time performance in het ergste geval vertonen als gevolg van de onbegrensde look-ahead vermogen.

In tegenstelling tot gewone packrat parsers kunnen PackCC directe en indirecte steun links-recursieve grammaticaregels. Dit maakt grammaticaregels veel intuïtiever.

De gegenereerde code wordt verfraaid en het gemak-of-begrip mogelijk te maken. Eigenlijk, het maakt gebruik van veel goto statements, maar de controle flows zijn veel meer traceerbaar dan goto spaghetti stormen gegenereerd door een andere parser generatoren.

PackCC zelf is onder de MIT licentie, maar de gegenereerde code kan onder geen enkele licentie worden verspreid of kan worden gebruikt in proprietary software.

Input file voorbeeld

Een rekenmachine. Merk op dat links-recursieve grammatica regels worden opgenomen.

%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;
}

Notes

Externe links