сложности использования neopeg парсера
От: _Claus_  
Дата: 27.03.12 22:58
Оценка:
решил попробовать парсер для простенького разбора.

в стандартном репозитории получил сбои-эксепшены на уровне компилятора и интеграции.

потом скачал с https://github.com/rampelstinskin/ParserGenerator/
вдруг заработает
но кроме того, что поменялась нотация описания грамматики (ушло время пока я понял, сообщения компилятора были о погоде)
получаю всякую всячину типа

C:\MyProjects\NLogic\MacroTest40\MacroTest\RuleParser.n(89,16): error : Class must be abstract.
C:\MyProjects\NLogic\MacroTest40\MacroTest\RuleParser.n(18,3): error : Grammar not parsed.
..

при этом еще, каким то образом начинаю получать ошибки в несвязанном макрокоде.

в связи со всем этим вопрос: то, что написано здесь
Автор(ы): Чистяков Владислав Юрьевич
Дата: 07.06.2011
Макрос PegGrammar – это макрос Nemerle, позволяющий добавлять в приложения парсеры, описываемые в нотации PEG.

надо полагать потеряло актуальность? может исправить его так, чтобы хоть калькулятор можно было бы написать.
моя грамматика, сделанная на основе json parser несколько сложнее. возможно ли ее запустить как либо?


[ParserGrammar(Options = EmitDebugSources, start,
    grammar
    {
      newLine                     = "\r\n" / '\n' / '\r' / '\u2028' / '\u2029' / '\u0085';
      singleLineComment           = "//" (!('\n' / '\r') [Any])* newLine?;
      delimitedComment            = "/*" (!"*/" [Any])* "*/";
      comment                     = singleLineComment / delimitedComment;
      space                       = ' ' / '\t' / '\u000B' / '\u000C' / newLine / comment;
      letter                      = ([Lu, Ll, Lt, Lm, Lo, Nl] / '_' / '$');
      decimalDigit                = ['0'..'9'];
      hexDigit                    = ['0'..'9', 'A'..'F', 'a'..'f'];
      octalDigit                  = ['0'..'7'];

      [InlineAllSubrules]
      s : void = space*;
      S : void = !identifierPart s;

      identifierPart              = letter / decimalDigit / space;
      identifierBody              = letter identifierPart*;
      identifier      : string    = identifierBody s;

      unicodeEscapeSequence     : char = "\\u" hexDigit hexDigit hexDigit hexDigit;
      simpleEscapeSequence      : char = "\\'" / "\\\"" / "\\\\" / "\\0" / "\\a" / "\\b" / "\\f" / "\\n" / "\\r" / "\\t" / "\\v";

      singleRegularStringLiteralCharacter  : char   = !( "\"" / "\\") [Any];
      regularStringLiteralPart             : char   = simpleEscapeSequence
                                                      / unicodeEscapeSequence
                                                      / singleRegularStringLiteralCharacter;

      doubleQuotedLiteral : string = "\"" regularStringLiteralPart* "\"" s;

      exponentPart    : string  = ("E" / "e") ("-" / "+")? decimalDigit+;
      decimalNumber   : string  = ('-' s)? decimalDigit+ ("." decimalDigit+)? exponentPart? s;

      trueValue  : Нечто = "И"S;
      falseValue : Нечто = "Л"S;
      nullValue  : Нечто = "П"S;

      jstring : Нечто = doubleQuotedLiteral;

      jnumber : Нечто = decimalNumber;

      jvalue : Нечто = jstring
                            / jnumber
                            / trueValue
                            / falseValue
                            / nullValue;
      
      jfield  : string * Нечто  = (identifier)? "%"s decimalDigit;
      
      expr  : Нечто = identifier (("."/".+"/".-")s  identifier)* ; 
      
      expr : Нечто = '('s expr ')'s;              
      
      muldiv : Нечто = expr (('*'/'/')s  expr)*;  
      
      sumsub : Нечто = muldiv (('+'/'-')s  muldiv)*;
                                          
      statement : Нечто = expr (">" / ">="/ "<" / "<="/ "="/ "!=")s  expr;
      
      definition : Нечто = "{"s (statement ";"s)* statement? "}"s;
      
      sobject = identifier jfield;
            
      jarray  : Нечто           = "["s (sobject ","s)* sobject? "]"s;            
      
      json    : Нечто           = (jarray / sobject / definition) s;

      start   : Нечто = s json;
    }
  )]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.