Re[5]: Способно ли метапрограммирование заменить отдельные я
От: Eye of Hell Россия eyeofhell.habr.ru
Дата: 03.02.11 13:14
Оценка:

Не согласен. Взять тот же Qt — это своего рода язык, который надо отдельно изучать. Я знаю С++, но покажи мне программу на Qt — с ходу не разберусь. А почему? Qt не знаю.


Вы не поверите — но даже те жалкие крохи с сигналами и foreach в Qt доставляют огромные проблемы огромному количеству программистов. А теперь представьте себе, что будет если налево и направо использовать полноценные DSL? .
Re[3]: Способно ли метапрограммирование заменить отдельные я
От: olegkr  
Дата: 03.02.11 14:55
Оценка:
Здравствуйте, Chrome, Вы писали:

C>Вы ведь не отказываете индусам в праве писать собственные классы или библиотеки?

Библиотеки точно отказываю, публичные интерфейсы надо писать самому, а то они такого напишут.

C>Почему бы не заставить своих коллег использовать только определенные в них классы и методы?

Ну да, и запретить индусам метапрограммировать. Проблема только в том, что обычно манагеры не парятся и тупо сливают проект в Индию, как хотите, так и делайте. Ну они и "делают". Потом сидишь и плачешь.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[12]: Способно ли метапрограммирование заменить отдельные
От: IT Россия linq2db.com
Дата: 03.02.11 15:00
Оценка: +1
Здравствуйте, gandjustas, Вы писали:

G>>>В идеале хорошо бы иметь возможность часть вычислений перенести из runtime в compiletime, не выписывая сложные конструкции в виде макросов. Пусть все выглядит как вызовы функций. Давать каждому менять синтаксис не стоит.

IT>>Макросы могут принимать вид синтаксического расширения, функций и атрибутов. Например, можно написать макрос-аттрибут уровня сборки, который будет запрещать создавать синтаксические макросы

G>Давайте отделять мух от котлет. Несмотря на то что в nemerle "синтаксические расширения, функции и атрибуты" реализованы одним механизмом макросов это совсем не значит что только так и стоит делать.

G>Яркий пример — code contracts в .NET, реализованы IL-реврайтером и не привязаны к языку. Причем Code Contracts состоят как из "функций", так и из "атрибутов".
G>Единственное что привязано к языку в указанной выше тройке — синтаксические расширения. Вот именно они вызывают наибольшие сомнения.

Тебя не поймёшь. Тебе хочется, чтобы всё выглядело как вызовы функций? Получай. Ан нет. Синтаксические расширения всё равно мешаются.
Если нам не помогут, то мы тоже никого не пощадим.
Re[6]: Способно ли метапрограммирование заменить отдельные я
От: Silver_S Ниоткуда  
Дата: 03.02.11 15:30
Оценка: +1
Здравствуйте, Eye of Hell, Вы писали:

EOH>Вы не поверите — но даже те жалкие крохи с сигналами и foreach в Qt доставляют огромные проблемы огромному количеству программистов. А теперь представьте себе, что будет если налево и направо использовать полноценные DSL? .


А аналогичные проекты но на MFC,WTL, или голом WinAPI, те же самые программисты быстрее пишут, поддерживают, баги находят (производительность выше)?
Хотя и в MFC есть метапрограммирование(жуткие макросы), да и WTL ... С голым WinAPI,C++ наверно надо сравнивать.
Я не в курсе что там в QT. Переборщили со средствами сокращения кода?
Re[6]: Способно ли метапрограммирование заменить отдельные я
От: WolfHound  
Дата: 03.02.11 17:14
Оценка: 6 (1)
Здравствуйте, Eye of Hell, Вы писали:

EOH>

Если синтаксис действительно настолько крут, что настолько уменьшает количество кода, то затраты на обучение ему (совсем не такие большие как кажутся) окупаются скоростью разработки и качеством результата.



EOH>Увы, практика показывает что код больше читается / поддерживается, нежели пишется.

Вот именно.
Тебе что проще читать вот это:
      // illegal identifiers:
      keyword = ("abstract"     / "as"          / "base"        / "bool"        / "break"
                / "byte"        / "case"        / "catch"       / "char"        / "checked"
                / "class"       / "const"       / "continue"    / "decimal"     / "default"
                / "delegate"    / "do"          / "double"      / "else"        / "enum"
                / "event"       / "explicit"    / "extern"      / "false"       / "finally"
                / "fixed"       / "float"       / "for"         / "foreach"     / "goto"
                / "if"          / "implicit"    / "in"          / "int"         / "interface"
                / "internal"    / "is"          / "lock"        / "long"        / "namespace"
                / "new"         / "null"        / "object"      / "operator"    / "out"
                / "override"    / "params"      / "private"     / "protected"   / "public"
                / "readonly"    / "ref"         / "return"      / "sbyte"       / "sealed"
                / "short"       / "sizeof"      / "stackalloc"  / "static"      / "string"
                / "struct"      / "switch"      / "this"        / "throw"       / "true"
                / "try"         / "typeof"      / "uint"        / "ulong"       / "unchecked"
                / "unsafe"      / "ushort"      / "using"       / "virtual"     / "void"
                / "volatile"    / "while"       ) !identifierPartCharacters;

      letterCharacter       = [Lu, Ll, Lt, Lm, Lo, Nl];
      combiningCharacter    = [Mn, Mc];
      decimalDigitCharacter = [Nd];
      connectingCharacter   = [Pc];
      formattingCharacter   = [Cf];

      identifierStartCharacter  = letterCharacter / "_";
      identifierPartCharacters  = letterCharacter / decimalDigitCharacter / connectingCharacter / combiningCharacter / formattingCharacter;
      identifierBody            = identifierStartCharacter identifierPartCharacters*;
      identifier            : Identifier  = !keyword "@"? identifierBody s;

Или вот это (Я не в состоянии это ни прочитать ни написать):
  Скрытый текст
Там вместо '?' должны быть юниодные символы. Все никак руки не дойдут преттипринтер починить...
private __GENERATED_PEG__RULE__identifier__(pos : int, text : string) : int
{
  unchecked 
  {
    mutable (c : char);
    _  = c;
    
    {
      def pos = 
      {
        def newPos = __GENERATED_PEG__RULE__keyword__(pos, text);
        if (newPos < 0) pos; else -1
      };
      if (pos >= 0) 
      {
        def pos = 
        {
          mutable okPos = -1;
          mutable curPos = pos;
          l4979:
            DEFAULT;
          okPos = curPos;
          when (curPos >= text.Length) goto l4982 [1];;
          c = text[curPos];
          ++curPos;
          when (c == '@') goto l4981 [1];;
          goto l4982 [1];;
          l4981:
            DEFAULT;
          okPos = curPos;
          l4982:
            DEFAULT;
          okPos
        };
        if (pos >= 0) 
        {
          def pos = __GENERATED_PEG__RULE__identifierBody__(pos, text);
          if (pos >= 0) __GENERATED_PEG__RULE__s__(pos, text); else -1
        }; else -1
      }; else -1
    }
  }
}

private __GENERATED_PEG__RULE__identifierBody__(pos : int, text : string) : int
{
  unchecked 
  {
    mutable (c : char);
    _  = c;
    
    {
      def pos = 
      {
        mutable okPos = -1;
        mutable curPos = pos;
        l4985:
          DEFAULT;
        when (curPos >= text.Length) goto l4988 [1];;
        c = text[curPos];
        ++curPos;
        when (if (c >= 'A') 
        {
          if (c >= '?') 
          {
            if (c >= '?') 
            {
              if (c >= '?') 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= 'a') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= 'z'
                        }
                      }; else 
                      {
                        if (c >= 'A') 
                        {
                          c <= 'Z'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }
                }
              }; else 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }
                }
              }
            }; else 
            {
              if (c >= '?') 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }
                }
              }; else 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }; else 
          {
            if (c >= '?') 
            {
              if (c >= '?') 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }
                }
              }; else 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }
                }
              }
            }; else 
            {
              if (c >= '?') 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }
                }
              }; else 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          if (c >= '?') 
                          {
                            c <= '?'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= 'o') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= 'O') 
                        {
                          c <= 'o'
                        }; else 
                        {
                          if (c >= 'A') 
                          {
                            c <= 'O'
                          }; else 
                          {
                            c <= '?'
                          }
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= 'µ') 
                        {
                          c <= 'µ'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= 'a') 
                        {
                          c <= 'z'
                        }; else 
                        {
                          if (c >= '_') 
                          {
                            c <= '_'
                          }; else 
                          {
                            c <= 'Z'
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }; else 
        {
          false
        }) goto l4987 [1];;
        goto l4988 [1];;
        l4987:
          DEFAULT;
        okPos = curPos;
        l4988:
          DEFAULT;
        okPos
      };
      if (pos >= 0) 
      {
        def rep (pos : int)  
        {
          def newPos = __GENERATED_PEG__RULE__identifierPartCharacters__(pos, text);
          if (newPos >= 0) 
          {
            ();
            rep(newPos)
          }; else pos
        } : _ ;
        rep(pos)
      }; else -1
    }
  }
}

private __GENERATED_PEG__RULE__identifierPartCharacters__(pos : int, text : string) : int
{
  unchecked 
  {
    mutable (c : char);
    _  = c;
    
    {
      mutable okPos = -1;
      mutable curPos = pos;
      l4991:
        DEFAULT;
      when (curPos >= text.Length) goto l4994 [1];;
      c = text[curPos];
      ++curPos;
      when (if (c >= '0') 
      {
        if (c >= '?') 
        {
          if (c >= '?') 
          {
            if (c >= '?') 
            {
              if (c >= '?') 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= 'A') 
                    {
                      if (c >= 'a') 
                      {
                        c <= 'z'
                      }; else 
                      {
                        if (c >= '_') 
                        {
                          c <= '_'
                        }; else 
                        {
                          c <= 'Z'
                        }
                      }
                    }; else 
                    {
                      if (c >= '0') 
                      {
                        c <= '9'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }
              }; else 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }
              }
            }; else 
            {
              if (c >= '?') 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }
              }; else 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }
              }
            }
          }; else 
          {
            if (c >= '?') 
            {
              if (c >= '?') 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }
              }; else 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }
              }
            }; else 
            {
              if (c >= '?') 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }
              }; else 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }; else 
        {
          if (c >= '?') 
          {
            if (c >= '?') 
            {
              if (c >= '?') 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }
              }; else 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }
              }
            }; else 
            {
              if (c >= '?') 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }
              }; else 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }
              }
            }
          }; else 
          {
            if (c >= '?') 
            {
              if (c >= '?') 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }
              }; else 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }
              }
            }; else 
            {
              if (c >= '?') 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }
              }; else 
              {
                if (c >= '?') 
                {
                  if (c >= '?') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }
                  }
                }; else 
                {
                  if (c >= 'A') 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= '?') 
                        {
                          c <= '?'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= 'o') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= 'O') 
                        {
                          c <= 'o'
                        }; else 
                        {
                          c <= 'O'
                        }
                      }
                    }
                  }; else 
                  {
                    if (c >= '?') 
                    {
                      if (c >= '?') 
                      {
                        c <= '?'
                      }; else 
                      {
                        if (c >= 'µ') 
                        {
                          c <= 'µ'
                        }; else 
                        {
                          c <= '?'
                        }
                      }
                    }; else 
                    {
                      if (c >= '_') 
                      {
                        if (c >= 'a') 
                        {
                          c <= 'z'
                        }; else 
                        {
                          c <= '_'
                        }
                      }; else 
                      {
                        if (c >= 'A') 
                        {
                          c <= 'Z'
                        }; else 
                        {
                          c <= '9'
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }; else 
      {
        false
      }) goto l4993 [1];;
      goto l4994 [1];;
      l4993:
        DEFAULT;
      okPos = curPos;
      l4994:
        DEFAULT;
      okPos
    }
  }
}

private __GENERATED_PEG__RULE__keyword__(pos : int, text : string) : int
{
  unchecked 
  {
    mutable (c : char);
    _  = c;
    
    {
      def pos = 
      {
        mutable okPos = -1;
        mutable curPos = pos;
        l4997:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l4998 [1];;
        when (c == 'b') goto l4999 [1];;
        when (c == 'c') goto l5000 [1];;
        when (c == 'd') goto l5001 [1];;
        when (c == 'e') goto l5002 [1];;
        when (c == 'f') goto l5003 [1];;
        when (c == 'g') goto l5151 [1];;
        when (c == 'i') goto l5005 [1];;
        when (c == 'l') goto l5146 [1];;
        when (c == 'n') goto l5006 [1];;
        when (c == 'o') goto l5007 [1];;
        when (c == 'p') goto l5008 [1];;
        when (c == 'r') goto l5159 [1];;
        when (c == 's') goto l5010 [1];;
        when (c == 't') goto l5011 [1];;
        when (c == 'u') goto l5012 [1];;
        when (c == 'v') goto l5058 [1];;
        when (c == 'w') goto l5080 [1];;
        goto l5170 [1];;
        l4998:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'b') goto l5033 [1];;
        when (c == 's') goto l5169 [1];;
        goto l5170 [1];;
        l4999:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5073 [1];;
        when (c == 'o') goto l5004 [1];;
        when (c == 'r') goto l5057 [1];;
        when (c == 'y') goto l5086 [1];;
        goto l5170 [1];;
        l5000:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5076 [1];;
        when (c == 'h') goto l5051 [1];;
        when (c == 'l') goto l5085 [1];;
        when (c == 'o') goto l5067 [1];;
        goto l5170 [1];;
        l5001:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'e') goto l5049 [1];;
        when (c == 'o') goto l5055 [1];;
        goto l5170 [1];;
        l5002:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'l') goto l5073 [1];;
        when (c == 'n') goto l5087 [1];;
        when (c == 'v') goto l5118 [1];;
        when (c == 'x') goto l5048 [1];;
        goto l5170 [1];;
        l5003:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5129 [1];;
        when (c == 'i') goto l5047 [1];;
        when (c == 'l') goto l5056 [1];;
        when (c == 'o') goto l5098 [1];;
        goto l5170 [1];;
        l5004:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'o') goto l5016 [1];;
        goto l5170 [1];;
        l5005:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'm') goto l5032 [1];;
        when (c == 'n') goto l5053 [1];;
        when (c == 'f' || c == 's') goto l5169 [1];;
        goto l5170 [1];;
        l5006:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5093 [1];;
        when (c == 'e') goto l5034 [1];;
        when (c == 'u') goto l5136 [1];;
        goto l5170 [1];;
        l5007:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'b') goto l5044 [1];;
        when (c == 'p') goto l5147 [1];;
        when (c == 'u') goto l5021 [1];;
        when (c == 'v') goto l5141 [1];;
        goto l5170 [1];;
        l5008:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5167 [1];;
        when (c == 'r') goto l5013 [1];;
        when (c == 'u') goto l5163 [1];;
        goto l5170 [1];;
        l5009:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'e') goto l5169 [1];;
        goto l5170 [1];;
        l5010:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'b') goto l5074 [1];;
        when (c == 'e') goto l5156 [1];;
        when (c == 'h') goto l5134 [1];;
        when (c == 'i') goto l5036 [1];;
        when (c == 't') goto l5037 [1];;
        when (c == 'w') goto l5119 [1];;
        goto l5170 [1];;
        l5011:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'h') goto l5030 [1];;
        when (c == 'r') goto l5031 [1];;
        when (c == 'y') goto l5091 [1];;
        goto l5170 [1];;
        l5012:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'i') goto l5088 [1];;
        when (c == 'l') goto l5166 [1];;
        when (c == 'n') goto l5024 [1];;
        when (c == 's') goto l5025 [1];;
        goto l5170 [1];;
        l5013:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'i') goto l5042 [1];;
        when (c == 'o') goto l5132 [1];;
        goto l5170 [1];;
        l5014:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'h') goto l5169 [1];;
        goto l5170 [1];;
        l5015:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'i') goto l5023 [1];;
        goto l5170 [1];;
        l5016:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'l') goto l5169 [1];;
        goto l5170 [1];;
        l5017:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'r') goto l5020 [1];;
        goto l5170 [1];;
        l5018:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'i') goto l5019 [1];;
        when (c == 'l') goto l5160 [1];;
        goto l5170 [1];;
        l5019:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'd') goto l5169 [1];;
        goto l5170 [1];;
        l5020:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5028 [1];;
        goto l5170 [1];;
        l5021:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 't') goto l5169 [1];;
        goto l5170 [1];;
        l5022:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'u') goto l5009 [1];;
        goto l5170 [1];;
        l5023:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'n') goto l5022 [1];;
        goto l5170 [1];;
        l5024:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'c') goto l5059 [1];;
        when (c == 's') goto l5158 [1];;
        goto l5170 [1];;
        l5025:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'h') goto l5134 [1];;
        when (c == 'i') goto l5124 [1];;
        goto l5170 [1];;
        l5026:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'g') goto l5111 [1];;
        goto l5170 [1];;
        l5027:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'f') goto l5169 [1];;
        goto l5170 [1];;
        l5028:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'c') goto l5021 [1];;
        goto l5170 [1];;
        l5029:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'k') goto l5169 [1];;
        goto l5170 [1];;
        l5030:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'i') goto l5092 [1];;
        when (c == 'r') goto l5140 [1];;
        goto l5170 [1];;
        l5031:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'u') goto l5009 [1];;
        when (c == 'y') goto l5169 [1];;
        goto l5170 [1];;
        l5032:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'p') goto l5097 [1];;
        goto l5170 [1];;
        l5033:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 's') goto l5065 [1];;
        goto l5170 [1];;
        l5034:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'w') goto l5169 [1];;
        goto l5170 [1];;
        l5035:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'y') goto l5169 [1];;
        goto l5170 [1];;
        l5036:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'z') goto l5155 [1];;
        goto l5170 [1];;
        l5037:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5038 [1];;
        when (c == 'r') goto l5039 [1];;
        goto l5170 [1];;
        l5038:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'c') goto l5090 [1];;
        when (c == 't') goto l5164 [1];;
        goto l5170 [1];;
        l5039:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'i') goto l5124 [1];;
        when (c == 'u') goto l5028 [1];;
        goto l5170 [1];;
        l5040:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5084 [1];;
        when (c == 'f') goto l5169 [1];;
        when (c == 't') goto l5101 [1];;
        goto l5170 [1];;
        l5041:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'b') goto l5082 [1];;
        goto l5170 [1];;
        l5042:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'v') goto l5111 [1];;
        goto l5170 [1];;
        l5043:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'm') goto l5099 [1];;
        goto l5170 [1];;
        l5044:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'j') goto l5135 [1];;
        goto l5170 [1];;
        l5045:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'c') goto l5029 [1];;
        when (c == 'n') goto l5068 [1];;
        goto l5170 [1];;
        l5046:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'f') goto l5168 [1];;
        when (c == 'n') goto l5099 [1];;
        goto l5170 [1];;
        l5047:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'n') goto l5131 [1];;
        when (c == 'x') goto l5079 [1];;
        goto l5170 [1];;
        l5048:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'p') goto l5097 [1];;
        when (c == 't') goto l5107 [1];;
        goto l5170 [1];;
        l5049:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'c') goto l5060 [1];;
        when (c == 'f') goto l5122 [1];;
        when (c == 'l') goto l5095 [1];;
        goto l5170 [1];;
        l5050:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 's') goto l5021 [1];;
        when (c == 't') goto l5015 [1];;
        goto l5170 [1];;
        l5051:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5062 [1];;
        when (c == 'e') goto l5089 [1];;
        goto l5170 [1];;
        l5053:
          DEFAULT;
        okPos = curPos;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 't') goto l5077 [1];;
        goto l5170 [1];;
        l5054:
          DEFAULT;
        okPos = curPos;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'e') goto l5162 [1];;
        goto l5170 [1];;
        l5055:
          DEFAULT;
        okPos = curPos;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'u') goto l5041 [1];;
        goto l5170 [1];;
        l5056:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'o') goto l5138 [1];;
        goto l5170 [1];;
        l5057:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'e') goto l5064 [1];;
        goto l5170 [1];;
        l5058:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'i') goto l5143 [1];;
        when (c == 'o') goto l5018 [1];;
        goto l5170 [1];;
        l5059:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'h') goto l5157 [1];;
        goto l5170 [1];;
        l5060:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'i') goto l5043 [1];;
        goto l5170 [1];;
        l5061:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'l') goto l5021 [1];;
        goto l5170 [1];;
        l5062:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'r') goto l5169 [1];;
        goto l5170 [1];;
        l5063:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'd') goto l5009 [1];;
        goto l5170 [1];;
        l5064:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5029 [1];;
        goto l5170 [1];;
        l5065:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 't') goto l5017 [1];;
        goto l5170 [1];;
        l5066:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'u') goto l5061 [1];;
        goto l5170 [1];;
        l5067:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'n') goto l5050 [1];;
        goto l5170 [1];;
        l5068:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'g') goto l5169 [1];;
        goto l5170 [1];;
        l5069:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'f') goto l5009 [1];;
        goto l5170 [1];;
        l5070:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'c') goto l5014 [1];;
        goto l5170 [1];;
        l5071:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'k') goto l5079 [1];;
        goto l5170 [1];;
        l5072:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'p') goto l5168 [1];;
        goto l5170 [1];;
        l5073:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 's') goto l5009 [1];;
        goto l5170 [1];;
        l5074:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'y') goto l5086 [1];;
        goto l5170 [1];;
        l5075:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'm') goto l5169 [1];;
        goto l5170 [1];;
        l5076:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 's') goto l5009 [1];;
        when (c == 't') goto l5070 [1];;
        goto l5170 [1];;
        l5077:
          DEFAULT;
        okPos = curPos;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'e') goto l5110 [1];;
        goto l5170 [1];;
        l5078:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'o') goto l5169 [1];;
        goto l5170 [1];;
        l5079:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'e') goto l5019 [1];;
        goto l5170 [1];;
        l5080:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'h') goto l5128 [1];;
        goto l5170 [1];;
        l5081:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'i') goto l5021 [1];;
        goto l5170 [1];;
        l5082:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'l') goto l5009 [1];;
        goto l5170 [1];;
        l5083:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'r') goto l5102 [1];;
        goto l5170 [1];;
        l5084:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'd') goto l5106 [1];;
        goto l5170 [1];;
        l5085:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5104 [1];;
        goto l5170 [1];;
        l5086:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 't') goto l5009 [1];;
        goto l5170 [1];;
        l5087:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'u') goto l5075 [1];;
        goto l5170 [1];;
        l5088:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'n') goto l5021 [1];;
        goto l5170 [1];;
        l5089:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'c') goto l5071 [1];;
        goto l5170 [1];;
        l5090:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'k') goto l5154 [1];;
        goto l5170 [1];;
        l5091:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'p') goto l5155 [1];;
        goto l5170 [1];;
        l5092:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 's') goto l5169 [1];;
        goto l5170 [1];;
        l5093:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'm') goto l5127 [1];;
        goto l5170 [1];;
        l5094:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'o') goto l5062 [1];;
        goto l5170 [1];;
        l5095:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'e') goto l5026 [1];;
        goto l5170 [1];;
        l5096:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'i') goto l5103 [1];;
        goto l5170 [1];;
        l5097:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'l') goto l5096 [1];;
        goto l5170 [1];;
        l5098:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'r') goto l5054 [1];;
        goto l5170 [1];;
        l5099:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5016 [1];;
        goto l5170 [1];;
        l5100:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 't') goto l5078 [1];;
        goto l5170 [1];;
        l5101:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'u') goto l5083 [1];;
        goto l5170 [1];;
        l5102:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'n') goto l5169 [1];;
        goto l5170 [1];;
        l5103:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'c') goto l5081 [1];;
        goto l5170 [1];;
        l5104:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 's') goto l5092 [1];;
        goto l5170 [1];;
        l5105:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'm') goto l5092 [1];;
        goto l5170 [1];;
        l5106:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'o') goto l5114 [1];;
        goto l5170 [1];;
        l5107:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'e') goto l5083 [1];;
        goto l5170 [1];;
        l5108:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'i') goto l5063 [1];;
        goto l5170 [1];;
        l5109:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'l') goto l5035 [1];;
        goto l5170 [1];;
        l5110:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'r') goto l5046 [1];;
        goto l5170 [1];;
        l5111:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5086 [1];;
        goto l5170 [1];;
        l5112:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 't') goto l5094 [1];;
        goto l5170 [1];;
        l5113:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'u') goto l5099 [1];;
        goto l5170 [1];;
        l5114:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'n') goto l5109 [1];;
        goto l5170 [1];;
        l5115:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'c') goto l5009 [1];;
        goto l5170 [1];;
        l5116:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 's') goto l5072 [1];;
        goto l5170 [1];;
        l5117:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'o') goto l5027 [1];;
        goto l5170 [1];;
        l5118:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'e') goto l5088 [1];;
        goto l5170 [1];;
        l5119:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'i') goto l5139 [1];;
        goto l5170 [1];;
        l5120:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'l') goto l5109 [1];;
        goto l5170 [1];;
        l5121:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'r') goto l5108 [1];;
        goto l5170 [1];;
        l5122:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5066 [1];;
        goto l5170 [1];;
        l5123:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 't') goto l5079 [1];;
        goto l5170 [1];;
        l5124:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'n') goto l5068 [1];;
        goto l5170 [1];;
        l5125:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'c') goto l5123 [1];;
        goto l5170 [1];;
        l5126:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'o') goto l5133 [1];;
        goto l5170 [1];;
        l5127:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'e') goto l5116 [1];;
        goto l5170 [1];;
        l5128:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'i') goto l5082 [1];;
        goto l5170 [1];;
        l5129:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'l') goto l5073 [1];;
        goto l5170 [1];;
        l5130:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'r') goto l5121 [1];;
        goto l5170 [1];;
        l5131:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5120 [1];;
        goto l5170 [1];;
        l5132:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 't') goto l5152 [1];;
        goto l5170 [1];;
        l5133:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'c') goto l5169 [1];;
        goto l5170 [1];;
        l5134:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'o') goto l5137 [1];;
        goto l5170 [1];;
        l5135:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'e') goto l5028 [1];;
        goto l5170 [1];;
        l5136:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'l') goto l5016 [1];;
        goto l5170 [1];;
        l5137:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'r') goto l5021 [1];;
        goto l5170 [1];;
        l5138:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5021 [1];;
        goto l5170 [1];;
        l5139:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 't') goto l5070 [1];;
        goto l5170 [1];;
        l5140:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'o') goto l5034 [1];;
        goto l5170 [1];;
        l5141:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'e') goto l5130 [1];;
        goto l5170 [1];;
        l5142:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'l') goto l5079 [1];;
        goto l5170 [1];;
        l5143:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'r') goto l5145 [1];;
        goto l5170 [1];;
        l5144:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5112 [1];;
        goto l5170 [1];;
        l5145:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 't') goto l5113 [1];;
        goto l5170 [1];;
        l5146:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'o') goto l5045 [1];;
        goto l5170 [1];;
        l5147:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'e') goto l5161 [1];;
        goto l5170 [1];;
        l5148:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'l') goto l5126 [1];;
        goto l5170 [1];;
        l5149:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5105 [1];;
        goto l5170 [1];;
        l5150:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 't') goto l5128 [1];;
        goto l5170 [1];;
        l5151:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'o') goto l5100 [1];;
        goto l5170 [1];;
        l5152:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'e') goto l5125 [1];;
        goto l5170 [1];;
        l5153:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'l') goto l5148 [1];;
        goto l5170 [1];;
        l5154:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5153 [1];;
        goto l5170 [1];;
        l5155:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'e') goto l5117 [1];;
        goto l5170 [1];;
        l5156:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5142 [1];;
        goto l5170 [1];;
        l5157:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'e') goto l5089 [1];;
        goto l5170 [1];;
        l5158:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5069 [1];;
        goto l5170 [1];;
        l5159:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'e') goto l5040 [1];;
        goto l5170 [1];;
        l5160:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5150 [1];;
        goto l5170 [1];;
        l5161:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'r') goto l5144 [1];;
        goto l5170 [1];;
        l5162:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5070 [1];;
        goto l5170 [1];;
        l5163:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'b') goto l5165 [1];;
        goto l5170 [1];;
        l5164:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'i') goto l5133 [1];;
        goto l5170 [1];;
        l5165:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'l') goto l5164 [1];;
        goto l5170 [1];;
        l5166:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'o') goto l5124 [1];;
        goto l5170 [1];;
        l5167:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'r') goto l5149 [1];;
        goto l5170 [1];;
        l5168:
          DEFAULT;
        when (curPos >= text.Length) goto l5170 [1];;
        c = text[curPos];
        ++curPos;
        when (c == 'a') goto l5115 [1];;
        goto l5170 [1];;
        l5169:
          DEFAULT;
        okPos = curPos;
        l5170:
          DEFAULT;
        okPos
      };
      if (pos >= 0) 
      {
        def newPos = __GENERATED_PEG__RULE__identifierPartCharacters__(pos, text);
        if (newPos < 0) pos; else -1
      }; else -1
    }
  }
}


EOH>Я не считаю, что введение нового языка программирования ради сокращения кода при написании стоит того, чтобы увольнение / найм людей постоянно давали проблемы.
Вот скажи мне чем ДСЛ отличается от библиотеки?

EOH>Посмотрите в сетевой стек FreeBSD — там как раз собственны DSL на базе C. Это НЕВОЗМОЖНО ни читать, ни поддерживать.

ДСЛ на базе С это бред сивой кобылы. С для содания ДСЛ не предназначен.

EOH> Хотя писалось, наверное, быстро. Лично я не хочу тратить лишние 2-3 недели на то, чтобы разработчик ознакомился с дополнительным парком велосипедов. Мне и существующих хватает.

Там какая разница будет он библиотеки учить или новый синтакс?

EOH>Согласен. Но сделать хороший DSL — трудно. Поэтому лучше не злоупотреблять. Генерить биндинги — это клево. Но вот писать на собственном синтаксисе ядро программы — это может очень болезненно отразиться в будущем.

А ты пробовал? Или умозрительные заключения?

EOH>

Разве никто не здесь не допускает возможности того, что сложность реализации "синтаксиса" эквивалентна написанию библиотеки, а удобство использования в определенных случаях может быть значительно выше?


EOH>Именно поэтому я ратую за использование стандартных библиотек. Вот такой я ретроград ^_^.
Почему "по этому"? Ведь свой синтаксис не редко бывает куда лучше библитеки.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: Способно ли метапрограммирование заменить отдельные я
От: Ziaw Россия  
Дата: 03.02.11 20:07
Оценка:
Здравствуйте, Chrome, Вы писали:

C>2 человеко месяца — не выглядит сколь нибудь серьезным ресурсом.


Не два человеко месяца, а два месяца свободного времени hardcase которое он мог уделить парсеру.

C>меня собственно и заинтересовало — неужели реально с такой скоростью клепать языки?


На самом деле нет. Так легко получилось потому, что nemerle является надмножеством шарпа. Поэтому достаточно было сделать парсер, который выдает AST nemerle почти один в один. F# в принципе тоже должен лечь на nemerle, только кому это надо? Тем более неинтересно изобретать свое подмножество nemerle.

Для клепания своего языка сначала нужно очень очень много работать надо его дизайном и синтаксисом. На самом деле рулят не новые языки, а встроенные DSL, код на которых читается так, как хочется, чтобы он читался.
Re[4]: Способно ли метапрограммирование заменить отдельные я
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.02.11 02:29
Оценка:
Здравствуйте, Eye of Hell, Вы писали:

EOH>Владислав, вы меня пугаете O_O. Ну давайте померяемся, мне не жалко. У меня больше 10 лет в коммерческой разработке, из крупных проектов в которых участвовал — например, Radmin. Делал много кодегенерации и DSL: XSLT, TT, lisp, python. Последние несколько лет — Ruby. того достаточно, чтобы считать меня знакомым с проблемой практически?


Достаточно, если опыт программирования на Лиспе был серьезным. Остальные средства могут соформировать не верные представления, так как синтаксических макросов в них нет и манипуляция кодом идет на уровне строк. А это действительно создает проблемы.

EOH>Если угостите кофе — могу зайти в гости, убедитесь в моей квалификации лично .


Если есть желание зайти, познакомиться, то я не буду против.

EOH>Поддержка DSL — плевое дело, пока рядом есть автор. А вот если автор йок, то с DSL очень большие проблемы.


А вот с этим я согласиться никак не могу. Точнее я не согласен, что это проблема ДСЛ-ей.
Конечно если кто-то в одиночку написал большой кусок кода и свалил, то проблемы с поддержкой неизбежны (особенно, если код хреновый и документации на него нет).
Но в случае библиотеки функций или классов будет тоже самое. Даже будет все хуже, так как объем кода который надо будет поддерживать будет больше, ведь это будет не только код библиотеки, но и распухший и кривой прикладной код.

EOH>

> Соответственно, это не так популярно потому как компании хотят защититься от эффекта падающего кирпича.
EOH>Можно описание этого эффекта?


EOH>Это когда на голову ведущему разработчику падает кирпич с летальными последствиями .


Во-во. Следствие выведенное из мифа.

EOH>Есть некая разница между широко распространенным DSL типа rake и тем, что мы сделали сами, нэ?


Не. Никакой, если их приходится поддерживать самостоятельно.

EOH>Если Вы считаете, что в DSL прямо вот так легко разобраться — возьмити любой проект Ruby on Rails и загляните внутрь. Будете приятно удивлены лаконичности кода и полным непонимаем как "это" работает "внутри". И это еще популярный DSL. А если кто такое сам напишет?


Во-во. Берем язык с недометапрограммированием и делаем на его базе далеко идущие выводы.
Я вот могу взять за основу аналог — Nemerle on Rails. В его коде я разберусь без труда (хотя и не причастен к его разработке) и смогу поддерживать и развивать его.

Так что возможность поддерживать чужой код зависит не от того является ли он реализацией ДСЛ-я, а от того насколько качественно он спроектирован и реализован, и от того какими средствами он создан.

Я вот вижу совершенно конкретные факты. Люди без огромного опыта в Nemerle правят макросы написанные за долго до того как они познакомились с языком. Может быть они от природы талантливее, но думаю что дело в другом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Способно ли метапрограммирование заменить отдельные я
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.02.11 04:03
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Если для функции есть intellisense, F1, Goto Definition, то для новых конструкций языка всего этого нет.


Теоретик! Скачал бы поглядел что обсуждаешь. Обнаружил бы много интересного. Например, тот же интеллисенс для макросов.

G>Кроме того затрудняется командная разработка. Конфликты имен функций\классов решаются неймспейсами. Как разрешать конфликт расширений синтаксиса?


Не поверишь! Нэймспэйсами!

Синтаксис подключается пространствами имен. Так что несовместимые синтаксические макросы можно использовать в разных модулях. Кроме того любой макрос можно использовать без синтаксиса. Тогда его применение в коде будет выглядеть как вызов функции или как кастом-атрибут.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Способно ли метапрограммирование заменить отдельные
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.02.11 04:09
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>>>А кто мешает в рантайме переписывать?

WH>>И машинный код сгенерировать,... и получишь ты макросы немерла вид в профиль.
G>Когда в руках молоток — все вокруг кажется гвоздями.

Ага. А когда и молотка не видел, то остается только выдумывать страшилки о разрушительной силе молотков .
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Предлагаю обсудить в таком ключе
От: Ziaw Россия  
Дата: 04.02.11 07:30
Оценка:
Здравствуйте, Wolverrum, Вы писали:

W>Здравствуйте, Chrome, Вы писали:


W>Давайте условимся,

W>что из нижеперечисленных продуктов:
W>- Lisp
Достаточно взлетел, как язык для обкатки концепций и идей других языков.
W>- JetBrains MPS
Внешний DSL это не то, что вообще могло взлететь.
W>- Template Haskell
Не в курсе.
W>- Nemerle

Не взлетел, но язык еще очень молод. Последние годы постепенно взлетают питон и руби, которым 30 и 17 лет. Надо быть отмороженным оптимистом, надеясь завоевать рынок с языком 7 лет от роду.

Nemerle в принципе можно сравнить с boo, который того же возраста, гораздо слабее но вполне применяем для своей ниши.

Nemerle, в отличии от boo разрабатывался неанглоязычными командами (поляки и русские). Поэтому очень мало англоязычных ресурсов по нему, отсюда гораздо меньшая известность.

Есть и еще серьезная причина, nemerle некоторое время был фактически заброшен, главные разработчики ушли в майрософт и гугл, в их университете подхватить язык оказалось некому. Для всего мира это выглядело как смерть проекта. Некоторое время он действительно балансировал между жизнью и смертью, но теперь у него снова есть команда и комьюнити. Большое, человеческое, спасибо за это Владу.

Фактически язык только только вышел из лаборатории, его главная заслуга в исторической перспективе — он дает возможность написать nemerle2 за приемлемое время. Ну и комьюнити постепенно набирается, язык-то уже можно щупать без шаманства. Если наберется критическая масса — инфы в интернете станет навалом, тогда рост комьюнити уже не остановить.
Re[7]: Способно ли метапрограммирование заменить отдельные я
От: Eye of Hell Россия eyeofhell.habr.ru
Дата: 04.02.11 10:46
Оценка: +1

Тебе что проще читать вот это:
<задание грамматики через PEG>
Или вот это (Я не в состоянии это ни прочитать ни написать):
<парсер грамматики, сгенерированный lex/yacc>


Какое отношение это имеет к обсуждаемому вопросу?

>>Я не считаю, что введение нового языка программирования ради сокращения кода при написании стоит того, чтобы увольнение / найм людей постоянно давали проблемы.
Вот скажи мне чем ДСЛ отличается от библиотеки?


DSL — он специфичен для проекта. Библиотека — готовая и хорошо документированная. Boost, например.

>> Хотя писалось, наверное, быстро. Лично я не хочу тратить лишние 2-3 недели на то, чтобы разработчик ознакомился с дополнительным парком велосипедов. Мне и существующих хватает.
Там какая разница будет он библиотеки учить или новый синтакс?


А надо стандартные библиотеки использовать. Qt, boost, openssl и прочее. Которое программист либо уже знает либо бысро изучет по книжке/статье в блоге. Про свой DSL книжки и статьи писать — тяжко.

>>Согласен. Но сделать хороший DSL — трудно. Поэтому лучше не злоупотреблять. Генерить биндинги — это клево. Но вот писать на собственном синтаксисе ядро программы — это может очень болезненно отразиться в будущем.
А ты пробовал? Или умозрительные заключения?


См. в этой же ветке. Пробовал и не один год. И то и другое.

>>Именно поэтому я ратую за использование стандартных библиотек. Вот такой я ретроград ^_^.
Почему "по этому"? Ведь свой синтаксис не редко бывает куда лучше библитеки.


Потому что холодильник . См. на что я отвечал.
Re[7]: Способно ли метапрограммирование заменить отдельные я
От: Eye of Hell Россия eyeofhell.habr.ru
Дата: 04.02.11 10:50
Оценка:

>> Я знаю С++, но покажи мне программу на Qt — с ходу не разберусь. А почему? Qt не знаю.
> Вы не поверите — но даже те жалкие крохи с сигналами и foreach в Qt доставляют
> огромные проблемы огромному количеству программистов. А теперь представьте себе,
> что будет если налево и направо использовать полноценные DSL? .

А аналогичные проекты но на MFC,WTL, или голом WinAPI, те же самые программисты быстрее пишут, поддерживают, баги находят (производительность выше)?


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

Хотя и в MFC есть метапрограммирование(жуткие макросы), да и WTL ... С голым WinAPI,C++ наверно надо сравнивать.


И человек, который знает MFC сможет их понять. Соответственно, мне достаточно в вакансии указать "знание MFC". А если у меня для того же собственный DSL — представьте себе затраты на ознакомление с ним программистов.

Я не в курсе что там в QT. Переборщили со средствами сокращения кода?


Нет, просто ввели пару архитектурных концепций: асинхронные мультикаст делегаты и иерархию дочерних объектов.
Re[5]: Способно ли метапрограммирование заменить отдельные я
От: FR  
Дата: 04.02.11 11:04
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Достаточно, если опыт программирования на Лиспе был серьезным. Остальные средства могут соформировать не верные представления, так как синтаксических макросов в них нет и манипуляция кодом идет на уровне строк. А это действительно создает проблемы.


В питоне и руби метаклассы и декораторы (питон) никак ни манипулирование строками.
Re[5]: Способно ли метапрограммирование заменить отдельные я
От: Eye of Hell Россия eyeofhell.habr.ru
Дата: 04.02.11 11:11
Оценка:

Достаточно, если опыт программирования на Лиспе был серьезным. Остальные средства могут соформировать не верные представления, так как синтаксических макросов в них нет и манипуляция кодом идет на уровне строк. А это действительно создает проблемы.


То есть как DSL делается на Ruby вам не нравится только потому, что LISP кроме всего прочего может модифицировать свой код? Ruby, между прочим, специально для DSL затачивалось и там есть много качественного синтаксического сахара.

Если угостите кофе — могу зайти в гости, убедитесь в моей квалификации лично .
>>Если есть желание зайти, познакомиться, то я не буду против.


grigory.v.p@gmail.com

>>Поддержка DSL — плевое дело, пока рядом есть автор. А вот если автор йок, то с DSL очень большие проблемы.
VD>А вот с этим я согласиться никак не могу. Точнее я не согласен, что это проблема ДСЛ-ей.
VD>Конечно если кто-то в одиночку написал большой кусок кода и свалил, то проблемы с поддержкой
VD>неизбежны (особенно, если код хреновый и документации на него нет).


Но в случае библиотеки функций или классов будет тоже самое.


Нет, если мы используем стандартные библиотеки типа boost, qt, gtk, openssl, pango итд. По ним есть книги, статьи, куча блогов. Знание библиотеки можно прописать в вакансии.

Даже будет все хуже, так как объем кода который надо будет поддерживать будет больше, ведь это будет не только код библиотеки, но и распухший и кривой прикладной код.


Код библиотеки поддерживать не надо, если она стандартная. Я — за стандартные библиотеки и против велосипедов ^_^.

Это когда на голову ведущему разработчику падает кирпич с летальными последствиями .
VD>Во-во. Следствие выведенное из мифа.


А я рассматриваю все в реальнй жизни. Реальные проекты — это не идеально документированные системы, на 100% покрытые юнит тестами и выглядящие как набор тасков и связанных с ними хорошо документированных коммитов. В реальной жизни все не так хорошо. И если уходит архитектор, который использовал Qt — то человек, знающий Qt разберется в его кода. А если человек сделал свой DSL — то это йок.

EOH>>Есть некая разница между широко распространенным DSL типа rake и тем, что мы сделали сами, нэ?
VD>Не. Никакой, если их приходится поддерживать самостоятельно.


В том-то и дело, что нам не надо поддерживать самостоятельно популярную библиотеку — за нас это делают другие.

EOH>>Если Вы считаете, что в DSL прямо вот так легко разобраться — возьмити любой проект Ruby on Rails и загляните внутрь. Будете приятно удивлены лаконичности кода и полным непонимаем как "это" работает "внутри". И это еще популярный DSL. А если кто такое сам напишет?
VD>Во-во. Берем язык с недометапрограммированием и делаем на его базе далеко идущие выводы.
VD>Я вот могу взять за основу аналог — Nemerle on Rails. В его коде я разберусь без труда (хотя и не причастен к его разработке) и смогу поддерживать и развивать его.


Я беру его как образец популярного использования концепции DSL. И чем Вам в руби программирование не мета?

VD>Я вот вижу совершенно конкретные факты. Люди без огромного опыта в Nemerle правят макросы написанные за долго до того как они познакомились с языком. Может быть они от природы талантливее, но думаю что дело в другом.


Немерле пока не смотрел. Но мы же говорим про DSL вообще, а не про особо удачную реализацию концепции метапрограммирования? В реальной жизни DSL чаще делают на t4, чем на немерле, увы
Re[8]: Способно ли метапрограммирование заменить отдельные я
От: Real 3L0 Россия http://prikhodko.blogspot.com
Дата: 04.02.11 12:27
Оценка:
Здравствуйте, Eye of Hell, Вы писали:

EOH>И человек, который знает MFC сможет их понять. Соответственно, мне достаточно в вакансии указать "знание MFC". А если у меня для того же собственный DSL — представьте себе затраты на ознакомление с ним программистов.


Поддерживаю.
В конторе используется продукт, с помощью которого производится разработка. Продукт использует собственный язык, основанный на Яве.
Продукт очень известный в узких кругах. Были доступны обучающие материалы. Есть комьюнити, форумы и прочее, следовательно, можно было узнать о "лучших практиках" и т.п.
Следовательно, если человек не крутился в этих кругах, то максимум, что он может знать — только Яву.
Большинство новичков приходилось обучать языку. Пусть и непродолжительное время.
Но какой-то процент новичков уже был знаком с языком.

В случае же "языка для проекта" новичков надо будет учить всегда и обязательно.
Вселенная бесконечна как вширь, так и вглубь.
Re[8]: Способно ли метапрограммирование заменить отдельные я
От: WolfHound  
Дата: 04.02.11 14:01
Оценка:
Здравствуйте, Eye of Hell, Вы писали:

EOH>Какое отношение это имеет к обсуждаемому вопросу?

Наипрямейшее.
Грамматика ПЕГ это ДСЛ. В случае с немерле это встроенный ДСЛ. Nemerle.Peg называется.
Тот код что был сгенерирован пришлось бы писать руками.
Поддерживать сгенерированный код не реально.
При этом люди умудряются править исходники самого Nemerle.Peg.

EOH>DSL — он специфичен для проекта. Библиотека — готовая и хорошо документированная. Boost, например.

Ты что ни разу не видел библиотек специфичных для проекта?
Или ты хочешь сказать что не может быть ДСЛ готового и хорошо документированного?
http://www.rsdn.ru/article/nemerle/PegGrammar.xml
Автор(ы): Чистяков Владислав Юрьевич
Дата: 07.06.2011
Макрос PegGrammar – это макрос Nemerle, позволяющий добавлять в приложения парсеры, описываемые в нотации PEG.


EOH>А надо стандартные библиотеки использовать. Qt, boost, openssl и прочее. Которое программист либо уже знает либо бысро изучет по книжке/статье в блоге. Про свой DSL книжки и статьи писать — тяжко.

Так а если нет стандартной библиотеки которая делает то что нужно?
Или есть но все доступные варианты говно? Скажем я так и не смог найти библиотеку для обработки растровых изображений которая бы не портила изображения.
Пришлось писать самому.

EOH>См. в этой же ветке. Пробовал и не один год. И то и другое.

Может ты както не правильно пробовал? Или использовал не правильные инструменты?
Просто я никаких проблем не вижу.

EOH>

>>Именно поэтому я ратую за использование стандартных библиотек. Вот такой я ретроград ^_^.
EOH>Почему "по этому"? Ведь свой синтаксис не редко бывает куда лучше библитеки.

EOH>Потому что холодильник . См. на что я отвечал.
Я то как раз посмотрел. А ты?

Разве никто не здесь не допускает возможности того, что сложность реализации "синтаксиса" эквивалентна написанию библиотеки, а удобство использования в определенных случаях может быть значительно выше?

Тут говорится о том что затраты на разработку библиотеки и новый синтакс примерно равны, а приемущества синтаксиса значительны.
Так по чемуже ты за использование библиотек?
Вот только не надо гнать про "стандартные библиотеки".
Ибо:
1)Могут быть стандартные ДСЛ (см выше).
2)Стандартных библиотек может и не быть.

Кстати. Пожалуйста используй метод цитирования принятый на RSDN. Это я тебя как модератор прошу.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[9]: Способно ли метапрограммирование заменить отдельные я
От: WolfHound  
Дата: 04.02.11 14:03
Оценка: +1
Здравствуйте, Real 3L0, Вы писали:

R3>В случае же "языка для проекта" новичков надо будет учить всегда и обязательно.

А что архитектуре проекта новичков обучать не нужно? А специфичные для проекта библиотеки они тоже знают?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[10]: Способно ли метапрограммирование заменить отдельные
От: Real 3L0 Россия http://prikhodko.blogspot.com
Дата: 04.02.11 15:14
Оценка:
Здравствуйте, WolfHound, Вы писали:

R3>>В случае же "языка для проекта" новичков надо будет учить всегда и обязательно.

WH>А что архитектуре проекта новичков обучать не нужно?

Это — в любом проекте: что на самописном языке, что на общеизвестном.

WH> А специфичные для проекта библиотеки они тоже знают?


Самописный язык 100% избавляет от специфичных библиотек? Т.е. при написании языка заодно напишете все существующие и необходимые специфичные библиотеки?
Вселенная бесконечна как вширь, так и вглубь.
Re[10]: Способно ли метапрограммирование заменить отдельные
От: Eye of Hell Россия eyeofhell.habr.ru
Дата: 04.02.11 15:18
Оценка:

А что архитектуре проекта новичков обучать не нужно? А специфичные для проекта библиотеки они тоже знают?


Нужно. И этого я тоже стараюсь избегать использую стандартные дизайн, архитектуру и уменьшая количество специфичных библиотек. В разумных пределах конечно. Чего я хочу, это избежать ситуацию когда программист открывает файл проекта и единственная реакция: "А-а-а-а-а-а-а-а! Что ЭТО?!?" .
Re[11]: Способно ли метапрограммирование заменить отдельные
От: WolfHound  
Дата: 04.02.11 15:22
Оценка: 47 (1) +3
Здравствуйте, Real 3L0, Вы писали:

R3>Самописный язык 100% избавляет от специфичных библиотек? Т.е. при написании языка заодно напишете все существующие и необходимые специфичные библиотеки?

Нет. Но уменьшает их колличество и разобраться в ДСЛ _проще_ чем в библиотеке которая делат тоже самое (причем делает это она значительно хуже и намного многословнее).
Я говорю конечно про разумных людей которые заводят ДСЛ только тогда когда он дает серьезные преимущества перед библиотекой.

Короче мой поинт в том что высказанное здесь мнение что ДСЛ поднимают порог вхождения новых людей в проект не верно.
Разумно примененный ДСЛ снижает порог вхождения по сравнению с другими методами решения задачи.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.