[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) на те же три минуты.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.