PackCC - PackCC - Wikipedia

PackCC
ӘзірлеушілерАрихиро Йошида
ЖазылғанC
Операциялық жүйеКросс-платформа
ТүріТалдаушы генератор
ЛицензияMIT лицензиясы
Веб-сайтgithub.com/ арифия/ packcc

PackCC Бұл талдаушы генератор үшін C. Оның негізгі ерекшеліктері:

Шығарғыш талдаушының грамматикасын PEG-де (Parsing Expression Grammar) сипаттауға болады. PEG - а жоғарыдан төмен қарай талдау тілі, және ұқсас тұрақты өрнек грамматика. Сияқты төменнен жоғары қарай талдау тілімен салыстырғанда Як Біреуі, PEG әлдеқайда интуитивті және бір мағыналы бола алмайды. PEG қажет емес токенизация жеке қадам болу үшін, және токенизация ережелері кез-келген басқа грамматикалық ережелер сияқты жазылуы мүмкін.

Құрылған талдаушы кірістерді пакеттерді талдау арқылы өте тиімді түрде талдай алады. Пакратты талдау болып табылады түсірудің рекурсивті талдауы қолдану арқылы жеделдетілетін алгоритм есте сақтау. Пакеттік талдауды қолдану арқылы кез-келген кірісті сызықтық уақытта талдауға болады. Алайда, онсыз, нәтижесіз талдаушы ең нашар жағдайда экспоненциалды уақытты көрсете алады, өйткені бұл шексіз алдын-ала қарау мүмкіндігіне байланысты.

Жалпы пакрат талдаушылардан айырмашылығы, PackCC тікелей және жанама қолдай алады сол-рекурсивті грамматикалық ережелер.[1] Бұл грамматикалық ережелерді интуитивті етеді.

Жасалған код әдемілендірілген және мүмкіндігінше түсінуге ыңғайлы. Шын мәнінде, бұл көптеген goto операторларын қолданады, бірақ басқару ағындары гото-спагетти дауылына қарағанда әлдеқайда көп байқалады, олар кейбір басқа генераторлар генераторлары жасаған.

PackCC өзі MIT лицензиясында, бірақ жасалған код кез-келген лицензия бойынша таратылуы немесе жеке бағдарламалық жасақтамада қолданылуы мүмкін.

Кіріс файлының мысалы

Жұмыс үстелі калькуляторы. Сол-рекурсивті грамматикалық ережелер енгізілгенін ескеріңіз.

%префикс «кальций»мәлімдеме <- _ e:өрнек _ EOL { printf(«жауап =% d n", e); }           / ( !EOL . )* EOL      { printf(«қате n"); }өрнек <- e:мерзім { $$ = e; }мерзім <- л:мерзім _ '+' _ р:фактор { $$ = л + р; }      / л:мерзім _ '-' _ р:фактор { $$ = л - р; }      / e:фактор                { $$ = e; }фактор <- л:фактор _ '*' _ р:унарий { $$ = л * р; }        / л:фактор _ '/' _ р:унарий { $$ = л / р; }        / e:унарий                  { $$ = e; }унарий <- '+' _ e:унарий { $$ = +e; }       / '-' _ e:унарий { $$ = -e; }       / e:бастапқы     { $$ = e; }бастапқы <- < [0-9]+ >               { $$ = атои($1); }         / '(' _ e:өрнек _ ')' { $$ = e; }_      <- [ \т]*EOL    <- ' n' / '\р\n' / ' r' / ';'%%int негізгі() {    calc_context_t *ctx = есептеу_жасау(ЖОҚ);    уақыт (кальций_парс(ctx, ЖОҚ));    calc_destroy(ctx);    қайту 0;}

Ескертулер

  1. ^ «Packrat Parsers сол рекурсияны қолдай алады» авторлары А.Варт, Дж.Р.Дугласс және Т.Миллштейн

Сыртқы сілтемелер