PackCC - PackCC

PackCC
Utvikler (s) Arihiro Yoshida
Skrevet i C
Operativsystem Kryssplattform
Type Persergenerator
Tillatelse MIT-lisens
nettsted sourceforge .net / p / packcc / wiki / Hjem /

PackCC er en parser generator for C . Dets viktigste funksjoner er som følger:

  • Genererer en parser i skrevet C fra en grammatikk beskrevet i en PEG ,
  • Gir en analysator stor effektivitet ved å pakke parsing ,
  • Støtter direkte og indirekte venstrerekursive grammatikkregler,
  • Genererer en tråd-sikker og reentrant parser,
  • Består av bare en enkelt kompakt kildefil.

Grammatikken til en utgangsparser kan beskrives i en PEG (Parsing Expression Grammar). PEG er et parsing-språk fra toppen og ned , og ligner på det ordinære uttrykket grammatikk. Sammenlignet med et analysespråk fra bunnen og opp, som Yaccs , er PEG mye mer intuitivt og kan ikke være tvetydig. PEG krever ikke at tokenisering er et eget trinn, og tokeniseringsregler kan skrives på samme måte som andre grammatiske regler.

Den genererte analyseren kan analysere inngangene veldig effektivt ved å pakke parsing. Packrat-parsing er den rekursive analysen for utforkjøring for nedstigning som akselereres ved hjelp av memoization . Ved å bruke packrat-parsing kan en hvilken som helst innføring analyseres på lineær tid. Uten den kan imidlertid den resulterende analysatoren vise eksponentiell tidsytelse i verste fall på grunn av den ubegrensede fremtidsevnen.

I motsetning til vanlige packrat-parsere, kan PackCC støtte direkte og indirekte venstre-rekursive grammatikkregler. Dette gjør grammatiske regler mye mer intuitive.

Den genererte koden er forskjøvet og så enkel å forstå som mulig. Egentlig bruker den mange goto-uttalelser, men kontrollstrømmene er mye mer sporbare enn goto spaghetti stormer generert av noen andre parsergeneratorer.

PackCC selv er under MIT-lisens, men den genererte koden kan distribueres under hvilken som helst lisens eller kan brukes i proprietær programvare.

Eksempel på inndatafil

En stasjonær kalkulator. Merk at venstre-rekursive grammatikkregler er inkludert.

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

Merknader

Eksterne linker