[PEG] простая грамматика долго компилируется.
От: catbert  
Дата: 21.01.11 18:47
Оценка:
Наверное я неправильно что-то делаю с операторами, но следующая, можно сказать, тривиальная грамматика на моем ноуте компилируется три минуты:

    [PegGrammar(program, grammar {
    
        // character processing
        any                         = ['\u0000'..'\uFFFF'];
        newLine : void              = "\r\n" / '\n' / '\r' / '\u2028' / '\u2029' / '\u0085';
        comment                     = '#' (!newLine any)* newLine;
        space   : void              = ' ' / '\t' / '\u000B' / '\u000C' / comment;
        letter                      = ([Lu, Ll, Lt, Lm, Lo, Nl] / '_');
        digit                       = ['0'..'9'];
        
        
        // identifiers
        identifierPart              = letter / digit;
        identifierBody              = letter identifierPart*;
        identifier                  = identifierBody s;
        placeholder                 = '_' s;
        
        // spaces
        [InlineAllSubrules]
        s : void                    = space*;
        S : void                    = !identifierPart s;
        

        // string literal
        escapeSequence              = @"\""";
        simpleCharacter             = !( "\"" / "\\") any;
        character                   = escapeSequence / simpleCharacter;
        stringLiteral               = '"' character '"';

        // texty literals
        naLiteral                   = "~" S;
        trueLiteral                 = "true" S;
        falseLiteral                = "false" S;
        boolean                     = trueLiteral / falseLiteral; 
        
        // number literal
        naturalNumber               = digit+;
        integerNumber               = ('-' s)? naturalNumber s;
        decimalNumber               = integerNumber ("." naturalNumber)? ("e" naturalNumber)? s;
        
        
        // date literal
        datePart                    = ':'s naturalNumber s;
        date                        = naturalNumber s datePart+;
        
        
        // brackets
        parenL                      = '('s;
        parenR                      = ')'s;
        braceL                      = '['s;
        braceR                      = ']'s;
        bracketL                    = '{'s;
        bracketR                    = '}'s;
        
        
        // operators
        addOp                       = '+'s;
        subOp                       = '-'s;
        /**** и так далее ****/
        
        // punctuation
        comma                       = ','s;
        semicolon                   = ';'s;
        
        
        // names
        simpleName                  = identifier;
        complexName                 = simpleName? (nsOp simpleName)+;
        name                        = placeholder / simpleName / complexName;
        
        // values
        literalValue                = data / stringLiteral / boolean / listLiteral / date;
        value                       = name / literalValue;
        
        // expression lists
        commaList                   = expression (comma expression)*;
        semiList                    = expression (semicolon expression)*;
        
        // expressions        
        priorityExpression          = parenL expression parenR;
        ex0                         = priorityExpression //priorityExpression
                                    / value;
        
        callExpression              = ex0 parenL commaList parenR;
        indexExpression             = ex0 braceL commaList braceR;
        ex1                         = callExpression 
                                    / indexExpression 
                                    / ex0;
        
        memberExpression            = ex1 dotOp name;
        ex2                         = memberExpression
                                    / ex1;
        
        mapExpression               = ex2 mapOp ex3;
        reduceExpression            = ex2 reduceOp value reduceOp ex3 
                                    / ex2 reduceOp ex3;
        filterExpression            = ex2 filterOp ex3;
        pipeExpression              = ex2 pipeOp ex3;
        ex3                         = mapExpression 
                                    / reduceExpression 
                                    / filterExpression 
                                    / pipeExpression
                                    / ex2;
        
        powExpression               = ex3 powOp ex4;
        ex4                         = powExpression
                                    / ex3;
        
        mulExpression               = ex4 mulOp ex5;
        divExpression               = ex4 divOp ex5;
        ex5                         = mulExpression 
                                    / divExpression
                                    / ex4;
        
        addExpression               = ex5 addOp ex6;
        subExpression               = ex5 subOp ex6;
        ex6                         = addExpression 
                                    / subExpression
                                    / ex5;
        
        lessExpression              = ex6 lsOp ex7;
        lessEqualExpression         = ex6 lseOp ex7;
        greaterExpression           = ex6 gtOp ex7;
        greaterEqualExpression      = ex6 gteOp ex7;
        equalExpression             = ex6 eqOp ex7;
        ex7                         = equalExpression 
                                    / lessExpression 
                                    / lessEqualExpression 
                                    / greaterExpression 
                                    / greaterEqualExpression
                                    / ex6;
        
        orExpression                = ex7 orOp ex8;
        xorExpression               = ex7 xorOp ex8;
        andExpression               = ex7 andOp ex8;
        ex8                         = orExpression 
                                    / xorExpression 
                                    / andExpression
                                    / ex7;
        
        expression                  = ex8;
        
        
        // program structure
        statement : int             = expression;
        program : int               = statement+;
    })]


На этом же железе весь Немерле (DevBuildQuick) компилируется 5 минут. Я что-то неправильно делаю, или так и должно быть?

Cамое неприятное — что с интеграцией работать невозможно: она периодически подвисает (building types tree) на те же три минуты.
Re: [PEG] простая грамматика долго компилируется.
От: hardcase Пират http://nemerle.org
Дата: 21.01.11 18:58
Оценка:
Здравствуйте, catbert, Вы писали:

C>Наверное я неправильно что-то делаю с операторами, но следующая, можно сказать, тривиальная грамматика на моем ноуте компилируется три минуты:


3 — это фигня. C#овская грамматика на моем одноядерном ноуте минут надцать компилируется.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: [PEG] простая грамматика долго компилируется.
От: BogdanMart Украина  
Дата: 21.01.11 19:09
Оценка:
Здравствуйте, hardcase, Вы писали:

H>3 — это фигня. C#овская грамматика на моем одноядерном ноуте минут надцать компилируется.


ого, так это капец, немного... хотя парсит, конечно, быстро потом...
Re[2]: [PEG] простая грамматика долго компилируется.
От: catbert  
Дата: 21.01.11 19:25
Оценка:
Здравствуйте, hardcase, Вы писали:

H>3 — это фигня. C#овская грамматика на моем одноядерном ноуте минут надцать компилируется.


А интеграция тоже тормозит?
Re[3]: [PEG] простая грамматика долго компилируется.
От: hardcase Пират http://nemerle.org
Дата: 21.01.11 19:36
Оценка:
Здравствуйте, catbert, Вы писали:

C>А интеграция тоже тормозит?


Сама интеграция не особо. Я на том ноуте только в пакетном режиме собирал проекты.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: [PEG] простая грамматика долго компилируется.
От: WolfHound  
Дата: 21.01.11 21:00
Оценка:
Здравствуйте, catbert, Вы писали:

C>Наверное я неправильно что-то делаю с операторами, но следующая, можно сказать, тривиальная грамматика на моем ноуте компилируется три минуты:

Тормозит поиск левой рекурсии именя Влада. Он сейчас с ним разбирается.
Пока можно закомментировать вот это строчку
GrammarTyper.Check(parsedGrammar);

в файле Macro.n проекта Nemerle.Peg.Macros
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: [PEG] простая грамматика долго компилируется.
От: catbert  
Дата: 22.01.11 19:17
Оценка: 4 (2) :)
Здравствуйте, hardcase, Вы писали:

H>3 — это фигня. C#овская грамматика на моем одноядерном ноуте минут надцать компилируется.


Какой тогда смысл использовать PEG-парсер для Немерле 2?
Re: [PEG] простая грамматика долго компилируется.
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.01.11 17:59
Оценка: 28 (3)
Здравствуйте, catbert, Вы писали:

C>Наверное я неправильно что-то делаю с операторами, но следующая, можно сказать, тривиальная грамматика на моем ноуте компилируется три минуты:


Исправил баг в алгоритме выявления левой рекурсии. До этого эта грамматика компилировалась на моем ноуте ~2 минут. После исправления ~9 секунд.

Алгоритм выявления левой рекурсии теперь практически времени не отъедает. Так что если текущая версия все равно является медленной, то оптимизировать уже надо основные алгоритмы PegGrammar.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: [PEG] простая грамматика долго компилируется.
От: catbert  
Дата: 30.01.11 19:34
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Исправил баг в алгоритме выявления левой рекурсии. До этого эта грамматика компилировалась на моем ноуте ~2 минут. После исправления ~9 секунд.


Отличная новость! Сейчас попробую. Я почти уверен, что это поможет, потому что проблемы начались сразу же когда я убрал левую рекурсию из грамматики.
Re[3]: [PEG] простая грамматика долго компилируется.
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.01.11 01:15
Оценка:
Здравствуйте, catbert, Вы писали:

H>>3 — это фигня. C#овская грамматика на моем одноядерном ноуте минут надцать компилируется.


C>Какой тогда смысл использовать PEG-парсер для Немерле 2?


На моей машине (2.4 ГГц Core 2 Duo) компиляция проекта парсера C# занимает ~40 секунд (в Debug-режиме). Это с исправленным багом. Что не так уж и медленно, если учесть, что это полная грамматика языка (т.е. сопоставимо с полным набором макросов немерле).

Кроме того не надо забывать о том, что макросы компилируются по отдельности, а значит разработка одного макроса не будет приводить к сильным задержкам при компиляции. Скомпилированные же макросы работают весьма шустро.

Кроме того основное время при компиляции проектов с PegGrammar занимает сама компиляция сгенерированного кода. Так что, если мы ускорим саму компиляцию, то и компиляция макросов (а так же проектов с PegGrammar-ом) будет происходить быстрее.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: [PEG] простая грамматика долго компилируется.
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.01.11 01:19
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>На моей машине (2.4 ГГц Core 2 Duo) компиляция проекта парсера C# занимает ~40 секунд (в Debug-режиме). Это с исправленным багом. Что не так уж и медленно, если учесть, что это полная грамматика языка (т.е. сопоставимо с полным набором макросов немерле).


В релизе даже быстрее — 20 секунд.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.