Re[15]: Тюринг-полные ли шаблоны C++?
От: m e  
Дата: 09.02.12 21:43
Оценка:
WH>Собственно вешание макро-атрибутов на класс это самый распространенный способ использования макросов которые что-то добавляют в типы.

насчет модели (в прошлом посте) -- скажем по 2-3 строчки про остальные 10 не столь распостраненных способов
(+ примерчик), и мне уже че-то будет ясно

или такой текст уже есть? тогда ссылку
Re[4]: Тюринг-полные ли шаблоны C++?
От: m e  
Дата: 09.02.12 22:41
Оценка:
в этой ветке я во всяком случае дальше собираюсь интересоваться только немерле

с++ я буду вспоминать только в том случае, если кто-то несправедливо скажет "а так в с++ нельзя" -- тогда приведу пример как можно

и на самом деле я был *неточен* -- да, меня интересуют недостатки с++, но недостатки с++ лучше всего мне расскажут пишущие плюсисты

хотя, конечно, если ты подробно ознакомился со стандартом с++11, тебя можно будет слушать о недостатках с++... но мне кажется ты не станешь знакомиться (и правильно

так что лучше про немерле
Re[14]: Тюринг-полные ли шаблоны C++?
От: FR  
Дата: 10.02.12 04:58
Оценка:
Здравствуйте, m e, Вы писали:

ME>при этом d-шный вариант выглядит приличнее, за исключением строки в миксине


Про D'шный вариант я чуть наврал, твое исходное

class T {
  int a;
  int b;
  int c;
  static if( hasMember!(X, "y") ) {
    int z;  
  }
}


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

Ну и миксины вполне могут быть и не строковыми, а например и такими:

mixin template DeclareZ()
{
    int z;
}

class T {
  int a;
  int b;
  int c;
  static if( hasMember!(X, "y") ) {
    mixin DeclareZ;  
  }
}
Re[16]: Тюринг-полные ли шаблоны C++?
От: WolfHound  
Дата: 10.02.12 09:41
Оценка:
Здравствуйте, m e, Вы писали:

WH>>Ты попробуй найти класс по имени и туда что-то добавить.

WH>>Не можешь?
ME>навскидку не помню, можно ли перегрузить оператор -> снаружи класса
Даже если можно (сам забыл) то это ничего не меняет.
В класс ты ничего не добавишь.

>> Макросы Record, StructuralEquality, StructuralHashCode сразу получают TypeBuilder NToken'а. После чего достают из него поля. И генерируют на их основе нужные методы.

ME>1. тут идет дописывание, а не постройка с 0
А где я говорил обратное?

ME>2. про это я уже писал -- шаблоны, несмотря на тьюринг-полноту, просто не могут получить нужные данные

Они вообще мало что могут.
Это одна из причин по которой я бросил С++.

ME>"это" это https://github.com/rampelstinskin/ParserGenerator/blob/master/Test/Main.n ?

ME>ты давай опять словами, а то идея по коду не полностью восстанавливается
Это генератор парсеров основанный на новом алгоритме.
Кроме всего прочего умеет генерировать АСТ.
Вот использование этого АСТ
| CalcParser.Expr.Rounds(_, ast, _) => $"( $(printAst(ast)) )"
| CalcParser.Expr.Seq(_, asts, _)   => $<#{ ..$(asts; " ; "; printAst(_)) }#>
| CalcParser.Expr.Num(num)          => $"$num"
| CalcParser.Expr.Neg(_, v)         => $"[ - $(printAst(v)) ]"
| CalcParser.Expr.PrefixDec(_, v)   => $"[ -- $(printAst(v)) ]"
| CalcParser.Expr.PostfixDec(v, _)  => $"[ $(printAst(v)) -- ]"
| CalcParser.Expr.Add(l, _, r)      => $"[ $(printAst(l)) + $(printAst(r)) ]"
| CalcParser.Expr.Sub(l, _, r)      => $"[ $(printAst(l)) - $(printAst(r)) ]"
| CalcParser.Expr.Mul(l, _, r)      => $"[ $(printAst(l)) * $(printAst(r)) ]"
| CalcParser.Expr.Div(l, _, r)      => $"[ $(printAst(l)) / $(printAst(r)) ]"
| CalcParser.Expr.Mod(l, _, r)      => $"[ $(printAst(l)) % $(printAst(r)) ]"
| CalcParser.Expr.Pow(l, _, r)      => $"[ $(printAst(l)) ^ $(printAst(r)) ]"

| IncParser.Expr.Plus(_, v)         => $"[ + $(printAst(v)) ]"
| IncParser.Expr.PrefixInc(_, v)    => $"[ ++ $(printAst(v)) ]"
| IncParser.Expr.PostfixInc(v, _)   => $"[ $(printAst(v)) ++ ]"


ME>то, что я восстановил -- с точностью до тормозов лишнего виртуального вызова функции -- без проблем

И чем же ты собрался АСТ генерировать?
Да и тормозов у тебя будет намного больше, чем ты думаешь.
Посмотри на то, какая портянка получается. Получено ILSpy'ем.
И это проект еще не доделан. Когда закончу эта портянка, наверное, раза в два раздуется.
Обрати внимание сколько там классов.
  Скрытый текст
using Nemerle.Builtins;
using Nemerle.Collections;
using Nemerle.Core;
using Nemerle.Internal;
using Nemerle.Parser;
using Nemerle.Parser.Internal;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.CompilerServices;
internal abstract class CalcParser
{
    public sealed class GrammarImpl : CalcParser, IGrammar
    {
        public sealed class GrammarDescriptorImpl : GrammarDescriptor
        {
            public class _#postfix#_add_ : RuleDescriptor
            {
                private static readonly CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_add_ _staticDescriptor;
                public override string Name
                {
                    get
                    {
                        return "add";
                    }
                }
                public override GrammarDescriptor Grammar
                {
                    get
                    {
                        return CalcParser.GrammarImpl.StaticDescriptor;
                    }
                }
                public static RuleDescriptor StaticDescriptor
                {
                    get
                    {
                        return CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_add_._staticDescriptor;
                    }
                }
                static _#postfix#_add_()
                {
                    CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_add_._staticDescriptor = new CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_add_();
                }
                public CalcParser.Expr.Add ResultType()
                {
                    return null;
                }
                private _#postfix#_add_()
                {
                }
            }
            public class _#simple#__any_ : RuleDescriptor
            {
                private static readonly CalcParser.GrammarImpl.GrammarDescriptorImpl._#simple#__any_ _staticDescriptor;
                public override string Name
                {
                    get
                    {
                        return "any";
                    }
                }
                public override GrammarDescriptor Grammar
                {
                    get
                    {
                        return CalcParser.GrammarImpl.StaticDescriptor;
                    }
                }
                public static RuleDescriptor StaticDescriptor
                {
                    get
                    {
                        return CalcParser.GrammarImpl.GrammarDescriptorImpl._#simple#__any_._staticDescriptor;
                    }
                }
                static _#simple#__any_()
                {
                    CalcParser.GrammarImpl.GrammarDescriptorImpl._#simple#__any_._staticDescriptor = new CalcParser.GrammarImpl.GrammarDescriptorImpl._#simple#__any_();
                }
                private _#simple#__any_()
                {
                }
            }
            public class _#postfix#_div_ : RuleDescriptor
            {
                private static readonly CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_div_ _staticDescriptor;
                public override string Name
                {
                    get
                    {
                        return "div";
                    }
                }
                public override GrammarDescriptor Grammar
                {
                    get
                    {
                        return CalcParser.GrammarImpl.StaticDescriptor;
                    }
                }
                public static RuleDescriptor StaticDescriptor
                {
                    get
                    {
                        return CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_div_._staticDescriptor;
                    }
                }
                static _#postfix#_div_()
                {
                    CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_div_._staticDescriptor = new CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_div_();
                }
                public CalcParser.Expr.Div ResultType()
                {
                    return null;
                }
                private _#postfix#_div_()
                {
                }
            }
            public class _#point#___expr_ : RuleDescriptor
            {
                private static readonly CalcParser.GrammarImpl.GrammarDescriptorImpl._#point#___expr_ _staticDescriptor;
                public override string Name
                {
                    get
                    {
                        return "expr";
                    }
                }
                public override GrammarDescriptor Grammar
                {
                    get
                    {
                        return CalcParser.GrammarImpl.StaticDescriptor;
                    }
                }
                public static RuleDescriptor StaticDescriptor
                {
                    get
                    {
                        return CalcParser.GrammarImpl.GrammarDescriptorImpl._#point#___expr_._staticDescriptor;
                    }
                }
                static _#point#___expr_()
                {
                    CalcParser.GrammarImpl.GrammarDescriptorImpl._#point#___expr_._staticDescriptor = new CalcParser.GrammarImpl.GrammarDescriptorImpl._#point#___expr_();
                }
                public ExprAst ResultType()
                {
                    return null;
                }
                private _#point#___expr_()
                {
                }
            }
            public class _#postfix#_mod_ : RuleDescriptor
            {
                private static readonly CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_mod_ _staticDescriptor;
                public override string Name
                {
                    get
                    {
                        return "mod";
                    }
                }
                public override GrammarDescriptor Grammar
                {
                    get
                    {
                        return CalcParser.GrammarImpl.StaticDescriptor;
                    }
                }
                public static RuleDescriptor StaticDescriptor
                {
                    get
                    {
                        return CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_mod_._staticDescriptor;
                    }
                }
                static _#postfix#_mod_()
                {
                    CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_mod_._staticDescriptor = new CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_mod_();
                }
                public CalcParser.Expr.Mod ResultType()
                {
                    return null;
                }
                private _#postfix#_mod_()
                {
                }
            }
            public class _#postfix#_mul_ : RuleDescriptor
            {
                private static readonly CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_mul_ _staticDescriptor;
                public override string Name
                {
                    get
                    {
                        return "mul";
                    }
                }
                public override GrammarDescriptor Grammar
                {
                    get
                    {
                        return CalcParser.GrammarImpl.StaticDescriptor;
                    }
                }
                public static RuleDescriptor StaticDescriptor
                {
                    get
                    {
                        return CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_mul_._staticDescriptor;
                    }
                }
                static _#postfix#_mul_()
                {
                    CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_mul_._staticDescriptor = new CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_mul_();
                }
                public CalcParser.Expr.Mul ResultType()
                {
                    return null;
                }
                private _#postfix#_mul_()
                {
                }
            }
            public class _#prefix#__neg_ : RuleDescriptor
            {
                private static readonly CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__neg_ _staticDescriptor;
                public override string Name
                {
                    get
                    {
                        return "neg";
                    }
                }
                public override GrammarDescriptor Grammar
                {
                    get
                    {
                        return CalcParser.GrammarImpl.StaticDescriptor;
                    }
                }
                public static RuleDescriptor StaticDescriptor
                {
                    get
                    {
                        return CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__neg_._staticDescriptor;
                    }
                }
                static _#prefix#__neg_()
                {
                    CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__neg_._staticDescriptor = new CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__neg_();
                }
                public CalcParser.Expr.Neg ResultType()
                {
                    return null;
                }
                private _#prefix#__neg_()
                {
                }
            }
            public class _#prefix#__num_ : RuleDescriptor
            {
                private static readonly CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__num_ _staticDescriptor;
                public override string Name
                {
                    get
                    {
                        return "num";
                    }
                }
                public override GrammarDescriptor Grammar
                {
                    get
                    {
                        return CalcParser.GrammarImpl.StaticDescriptor;
                    }
                }
                public static RuleDescriptor StaticDescriptor
                {
                    get
                    {
                        return CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__num_._staticDescriptor;
                    }
                }
                static _#prefix#__num_()
                {
                    CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__num_._staticDescriptor = new CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__num_();
                }
                public CalcParser.Expr.Num ResultType()
                {
                    return null;
                }
                private _#prefix#__num_()
                {
                }
            }
            public class _#postfix#_postfixDec_ : RuleDescriptor
            {
                private static readonly CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_postfixDec_ _staticDescriptor;
                public override string Name
                {
                    get
                    {
                        return "postfixDec";
                    }
                }
                public override GrammarDescriptor Grammar
                {
                    get
                    {
                        return CalcParser.GrammarImpl.StaticDescriptor;
                    }
                }
                public static RuleDescriptor StaticDescriptor
                {
                    get
                    {
                        return CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_postfixDec_._staticDescriptor;
                    }
                }
                static _#postfix#_postfixDec_()
                {
                    CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_postfixDec_._staticDescriptor = new CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_postfixDec_();
                }
                public CalcParser.Expr.PostfixDec ResultType()
                {
                    return null;
                }
                private _#postfix#_postfixDec_()
                {
                }
            }
            public class _#postfix#_pow_ : RuleDescriptor
            {
                private static readonly CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_pow_ _staticDescriptor;
                public override string Name
                {
                    get
                    {
                        return "pow";
                    }
                }
                public override GrammarDescriptor Grammar
                {
                    get
                    {
                        return CalcParser.GrammarImpl.StaticDescriptor;
                    }
                }
                public static RuleDescriptor StaticDescriptor
                {
                    get
                    {
                        return CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_pow_._staticDescriptor;
                    }
                }
                static _#postfix#_pow_()
                {
                    CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_pow_._staticDescriptor = new CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_pow_();
                }
                public CalcParser.Expr.Pow ResultType()
                {
                    return null;
                }
                private _#postfix#_pow_()
                {
                }
            }
            public class _#prefix#__prefixDec_ : RuleDescriptor
            {
                private static readonly CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__prefixDec_ _staticDescriptor;
                public override string Name
                {
                    get
                    {
                        return "prefixDec";
                    }
                }
                public override GrammarDescriptor Grammar
                {
                    get
                    {
                        return CalcParser.GrammarImpl.StaticDescriptor;
                    }
                }
                public static RuleDescriptor StaticDescriptor
                {
                    get
                    {
                        return CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__prefixDec_._staticDescriptor;
                    }
                }
                static _#prefix#__prefixDec_()
                {
                    CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__prefixDec_._staticDescriptor = new CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__prefixDec_();
                }
                public CalcParser.Expr.PrefixDec ResultType()
                {
                    return null;
                }
                private _#prefix#__prefixDec_()
                {
                }
            }
            public class _#prefix#__rounds_ : RuleDescriptor
            {
                private static readonly CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__rounds_ _staticDescriptor;
                public override string Name
                {
                    get
                    {
                        return "rounds";
                    }
                }
                public override GrammarDescriptor Grammar
                {
                    get
                    {
                        return CalcParser.GrammarImpl.StaticDescriptor;
                    }
                }
                public static RuleDescriptor StaticDescriptor
                {
                    get
                    {
                        return CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__rounds_._staticDescriptor;
                    }
                }
                static _#prefix#__rounds_()
                {
                    CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__rounds_._staticDescriptor = new CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__rounds_();
                }
                public CalcParser.Expr.Rounds ResultType()
                {
                    return null;
                }
                private _#prefix#__rounds_()
                {
                }
            }
            public class _#simple#__s_ : RuleDescriptor
            {
                private static readonly CalcParser.GrammarImpl.GrammarDescriptorImpl._#simple#__s_ _staticDescriptor;
                public override string Name
                {
                    get
                    {
                        return "s";
                    }
                }
                public override GrammarDescriptor Grammar
                {
                    get
                    {
                        return CalcParser.GrammarImpl.StaticDescriptor;
                    }
                }
                public static RuleDescriptor StaticDescriptor
                {
                    get
                    {
                        return CalcParser.GrammarImpl.GrammarDescriptorImpl._#simple#__s_._staticDescriptor;
                    }
                }
                static _#simple#__s_()
                {
                    CalcParser.GrammarImpl.GrammarDescriptorImpl._#simple#__s_._staticDescriptor = new CalcParser.GrammarImpl.GrammarDescriptorImpl._#simple#__s_();
                }
                public void ResultType()
                {
                }
                private _#simple#__s_()
                {
                }
            }
            public class _#prefix#__seq_ : RuleDescriptor
            {
                private static readonly CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__seq_ _staticDescriptor;
                public override string Name
                {
                    get
                    {
                        return "seq";
                    }
                }
                public override GrammarDescriptor Grammar
                {
                    get
                    {
                        return CalcParser.GrammarImpl.StaticDescriptor;
                    }
                }
                public static RuleDescriptor StaticDescriptor
                {
                    get
                    {
                        return CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__seq_._staticDescriptor;
                    }
                }
                static _#prefix#__seq_()
                {
                    CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__seq_._staticDescriptor = new CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__seq_();
                }
                public CalcParser.Expr.Seq ResultType()
                {
                    return null;
                }
                private _#prefix#__seq_()
                {
                }
            }
            public class _#simple#__start_ : RuleDescriptor
            {
                private static readonly CalcParser.GrammarImpl.GrammarDescriptorImpl._#simple#__start_ _staticDescriptor;
                public override string Name
                {
                    get
                    {
                        return "start";
                    }
                }
                public override GrammarDescriptor Grammar
                {
                    get
                    {
                        return CalcParser.GrammarImpl.StaticDescriptor;
                    }
                }
                public static RuleDescriptor StaticDescriptor
                {
                    get
                    {
                        return CalcParser.GrammarImpl.GrammarDescriptorImpl._#simple#__start_._staticDescriptor;
                    }
                }
                static _#simple#__start_()
                {
                    CalcParser.GrammarImpl.GrammarDescriptorImpl._#simple#__start_._staticDescriptor = new CalcParser.GrammarImpl.GrammarDescriptorImpl._#simple#__start_();
                }
                public ExprAst ResultType()
                {
                    return null;
                }
                private _#simple#__start_()
                {
                }
            }
            public class _#postfix#_sub_ : RuleDescriptor
            {
                private static readonly CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_sub_ _staticDescriptor;
                public override string Name
                {
                    get
                    {
                        return "sub";
                    }
                }
                public override GrammarDescriptor Grammar
                {
                    get
                    {
                        return CalcParser.GrammarImpl.StaticDescriptor;
                    }
                }
                public static RuleDescriptor StaticDescriptor
                {
                    get
                    {
                        return CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_sub_._staticDescriptor;
                    }
                }
                static _#postfix#_sub_()
                {
                    CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_sub_._staticDescriptor = new CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_sub_();
                }
                public CalcParser.Expr.Sub ResultType()
                {
                    return null;
                }
                private _#postfix#_sub_()
                {
                }
            }
            public override GrammarDescriptor[] Dependencies
            {
                get
                {
                    return new GrammarDescriptor[]
                    {
                        NumParser.GrammarImpl.StaticDescriptor, 
                        IncParser.GrammarImpl.StaticDescriptor
                    };
                }
            }
            public override string Name
            {
                get
                {
                    return "CalcParser";
                }
            }
            public override string FullName
            {
                get
                {
                    return "CalcParser";
                }
            }
            public override IGrammar NewGrammar(Parser parser)
            {
                return new CalcParser.GrammarImpl(parser);
            }
            public override ParsingErrors NewParsingErrors()
            {
                return new CalcParser.GrammarImpl.ParsingErrorsImpl();
            }
        }
        private sealed class ParsingErrorsImpl : ParsingErrors
        {
            public int _#_sub_;
            public int _#_start_;
            public int _#_seq_;
            public int _#_s_;
            public int _#_rounds_;
            public int _#_prefixDec_;
            public int _#_pow_;
            public int _#_postfixDec_;
            public int _#_num_;
            public int _#_neg_;
            public int _#_mul_;
            public int _#_mod_;
            public int _#_expr_;
            public int _#_div_;
            public int _#_any_;
            public int _#_add_;
            public override void Clear()
            {
                this._#_add_ = -1;
                this._#_any_ = -1;
                this._#_div_ = -1;
                this._#_expr_ = -1;
                this._#_mod_ = -1;
                this._#_mul_ = -1;
                this._#_neg_ = -1;
                this._#_num_ = -1;
                this._#_postfixDec_ = -1;
                this._#_pow_ = -1;
                this._#_prefixDec_ = -1;
                this._#_rounds_ = -1;
                this._#_s_ = -1;
                this._#_seq_ = -1;
                this._#_start_ = -1;
                this._#_sub_ = -1;
            }
            public override void GetErrors(ref int pos, List<RuleDescriptor> descriptors)
            {
                int arg_04_0 = pos;
                if (pos < this._#_add_)
                {
                    pos = this._#_add_;
                    descriptors.Clear();
                }
                if (pos == this._#_add_)
                {
                    descriptors.Add(CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_add_.StaticDescriptor);
                }
                if (pos < this._#_any_)
                {
                    pos = this._#_any_;
                    descriptors.Clear();
                }
                if (pos == this._#_any_)
                {
                    descriptors.Add(CalcParser.GrammarImpl.GrammarDescriptorImpl._#simple#__any_.StaticDescriptor);
                }
                if (pos < this._#_div_)
                {
                    pos = this._#_div_;
                    descriptors.Clear();
                }
                if (pos == this._#_div_)
                {
                    descriptors.Add(CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_div_.StaticDescriptor);
                }
                if (pos < this._#_expr_)
                {
                    pos = this._#_expr_;
                    descriptors.Clear();
                }
                if (pos == this._#_expr_)
                {
                    descriptors.Add(CalcParser.GrammarImpl.GrammarDescriptorImpl._#point#___expr_.StaticDescriptor);
                }
                if (pos < this._#_mod_)
                {
                    pos = this._#_mod_;
                    descriptors.Clear();
                }
                if (pos == this._#_mod_)
                {
                    descriptors.Add(CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_mod_.StaticDescriptor);
                }
                if (pos < this._#_mul_)
                {
                    pos = this._#_mul_;
                    descriptors.Clear();
                }
                if (pos == this._#_mul_)
                {
                    descriptors.Add(CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_mul_.StaticDescriptor);
                }
                if (pos < this._#_neg_)
                {
                    pos = this._#_neg_;
                    descriptors.Clear();
                }
                if (pos == this._#_neg_)
                {
                    descriptors.Add(CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__neg_.StaticDescriptor);
                }
                if (pos < this._#_num_)
                {
                    pos = this._#_num_;
                    descriptors.Clear();
                }
                if (pos == this._#_num_)
                {
                    descriptors.Add(CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__num_.StaticDescriptor);
                }
                if (pos < this._#_postfixDec_)
                {
                    pos = this._#_postfixDec_;
                    descriptors.Clear();
                }
                if (pos == this._#_postfixDec_)
                {
                    descriptors.Add(CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_postfixDec_.StaticDescriptor);
                }
                if (pos < this._#_pow_)
                {
                    pos = this._#_pow_;
                    descriptors.Clear();
                }
                if (pos == this._#_pow_)
                {
                    descriptors.Add(CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_pow_.StaticDescriptor);
                }
                if (pos < this._#_prefixDec_)
                {
                    pos = this._#_prefixDec_;
                    descriptors.Clear();
                }
                if (pos == this._#_prefixDec_)
                {
                    descriptors.Add(CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__prefixDec_.StaticDescriptor);
                }
                if (pos < this._#_rounds_)
                {
                    pos = this._#_rounds_;
                    descriptors.Clear();
                }
                if (pos == this._#_rounds_)
                {
                    descriptors.Add(CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__rounds_.StaticDescriptor);
                }
                if (pos < this._#_s_)
                {
                    pos = this._#_s_;
                    descriptors.Clear();
                }
                if (pos == this._#_s_)
                {
                    descriptors.Add(CalcParser.GrammarImpl.GrammarDescriptorImpl._#simple#__s_.StaticDescriptor);
                }
                if (pos < this._#_seq_)
                {
                    pos = this._#_seq_;
                    descriptors.Clear();
                }
                if (pos == this._#_seq_)
                {
                    descriptors.Add(CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__seq_.StaticDescriptor);
                }
                if (pos < this._#_start_)
                {
                    pos = this._#_start_;
                    descriptors.Clear();
                }
                if (pos == this._#_start_)
                {
                    descriptors.Add(CalcParser.GrammarImpl.GrammarDescriptorImpl._#simple#__start_.StaticDescriptor);
                }
                if (pos < this._#_sub_)
                {
                    pos = this._#_sub_;
                    descriptors.Clear();
                }
                if (pos == this._#_sub_)
                {
                    descriptors.Add(CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_sub_.StaticDescriptor);
                }
            }
            public ParsingErrorsImpl()
            {
                this.Clear();
            }
        }
        private sealed class GrammarStateImpl : IGrammarState
        {
            private readonly ExtensionPostfixBase<ExprAst>[] _#_expr_PostfixRules_;
            private readonly ExtensionPrefixBase<ExprAst>[] _#_expr_PrefixRules__;
            [DebuggerBrowsable(DebuggerBrowsableState.Never), CompilerGenerated]
            private readonly CalcParser.GrammarImpl _N_Grammar_4132;
            public CalcParser.GrammarImpl Grammar
            {
                [CompilerGenerated]
                get
                {
                    return this._N_Grammar_4132;
                }
            }
            public void LoadThisState()
            {
                this.Grammar._#_expr_PrefixRules__ = this._#_expr_PrefixRules__;
                this.Grammar._#_expr_PostfixRules_ = this._#_expr_PostfixRules_;
            }
            public GrammarStateImpl(CalcParser.GrammarImpl grammar)
            {
                this._N_Grammar_4132 = grammar;
                this._#_expr_PrefixRules__ = this._N_Grammar_4132._#_expr_PrefixRules__;
                this._#_expr_PostfixRules_ = this._N_Grammar_4132._#_expr_PostfixRules_;
            }
            public GrammarStateImpl()
            {
            }
            IGrammar IGrammarState.get_Grammar()
            {
                return this.Grammar;
            }
        }
        public class _#postfix#_sub_ : ExtensionPostfixBase<ExprAst>
        {
            private readonly CalcParser.GrammarImpl _grammar;
            public override RuleDescriptor Descriptor
            {
                get
                {
                    return CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_sub_.StaticDescriptor;
                }
            }
            public override int Parse(int startPos, int pos, string text, int[] bestOffsets, ref ExprAst result)
            {
                bool isBest = false;
                NToken token_2 = default(NToken);
                ExprAst token_3 = null;
                ExprAst prefixResult = result;
                ExprAst token_4 = prefixResult;
                bool _N_cache_8663 = pos >= 0;
                bool arg_AA_0;
                if (_N_cache_8663)
                {
                    if (true)
                    {
                        if (isBest)
                        {
                            arg_AA_0 = true;
                        }
                        else
                        {
                            isBest = (bestOffsets[0] < pos);
                            arg_AA_0 = (isBest || bestOffsets[0] == pos);
                        }
                        goto IL_9F;
                    }
                }
                arg_AA_0 = false;
                IL_9F:
                int arg_36F_0;
                if (arg_AA_0)
                {
                    int arg_108_0;
                    if (pos < text.Length)
                    {
                        char c = text[pos];
                        arg_108_0 = ((c != '-') ? -1 : (pos + 1));
                    }
                    else
                    {
                        arg_108_0 = -1;
                    }
                    int newPos = arg_108_0;
                    if (newPos >= 0)
                    {
                        token_2 = new NToken(pos, newPos);
                    }
                    int pos2 = newPos;
                    bool _N_cache_8664 = pos2 >= 0;
                    bool arg_197_0;
                    if (_N_cache_8664)
                    {
                        if (true)
                        {
                            if (isBest)
                            {
                                arg_197_0 = true;
                            }
                            else
                            {
                                isBest = (bestOffsets[1] < pos2);
                                arg_197_0 = (isBest || bestOffsets[1] == pos2);
                            }
                            goto IL_18C;
                        }
                    }
                    arg_197_0 = false;
                    IL_18C:
                    if (arg_197_0)
                    {
                        int ofs = pos2;
                        int pos3 = this._grammar._#_s_(pos2, text);
                        bool _N_cache_8665 = pos3 >= 0;
                        bool arg_224_0;
                        if (_N_cache_8665)
                        {
                            if (true)
                            {
                                if (isBest)
                                {
                                    arg_224_0 = true;
                                }
                                else
                                {
                                    isBest = (bestOffsets[2] < pos3);
                                    arg_224_0 = (isBest || bestOffsets[2] == pos3);
                                }
                                goto IL_219;
                            }
                        }
                        arg_224_0 = false;
                        IL_219:
                        if (arg_224_0)
                        {
                            int ofs2 = pos3;
                            int pos4 = this._grammar._#_expr_(pos3, text, 10, ref token_3);
                            bool _N_cache_8666 = pos4 >= 0;
                            bool arg_2B5_0;
                            if (_N_cache_8666)
                            {
                                if (true)
                                {
                                    if (isBest)
                                    {
                                        arg_2B5_0 = true;
                                    }
                                    else
                                    {
                                        isBest = (bestOffsets[3] < pos4);
                                        arg_2B5_0 = (isBest || bestOffsets[3] == pos4);
                                    }
                                    goto IL_2AA;
                                }
                            }
                            arg_2B5_0 = false;
                            IL_2AA:
                            if (arg_2B5_0)
                            {
                                int ofs3 = pos4;
                                if (isBest)
                                {
                                    bestOffsets[0] = pos;
                                    bestOffsets[1] = ofs;
                                    bestOffsets[2] = ofs2;
                                    bestOffsets[3] = ofs3;
                                    int i = 4;
                                    while (i < bestOffsets.Length && bestOffsets[i] >= 0)
                                    {
                                        bestOffsets[i] = -1;
                                        i++;
                                    }
                                    arg_36F_0 = pos4;
                                }
                                else
                                {
                                    arg_36F_0 = -1;
                                }
                            }
                            else
                            {
                                arg_36F_0 = -1;
                            }
                        }
                        else
                        {
                            arg_36F_0 = -1;
                        }
                    }
                    else
                    {
                        arg_36F_0 = -1;
                    }
                }
                else
                {
                    arg_36F_0 = -1;
                }
                int newPos2 = arg_36F_0;
                if (newPos2 > 0)
                {
                    result = new CalcParser.Expr.Sub(token_4, token_2, token_3);
                    result.Location = new Location(this._grammar._parsingSource, token_4.StartPos, token_3.EndPos);
                }
                else
                {
                    if (this._grammar._parsingErrors._#_sub_ < pos)
                    {
                        this._grammar._parsingErrors._#_sub_ = pos;
                    }
                }
                return newPos2;
            }
            public _#postfix#_sub_(IGrammar grammar) : base(10, '\0', '?')
            {
                this._grammar = (CalcParser.GrammarImpl)grammar;
            }
        }
        public class _#prefix#__seq_ : ExtensionPrefixBase<ExprAst>
        {
            private readonly CalcParser.GrammarImpl _grammar;
            public override RuleDescriptor Descriptor
            {
                get
                {
                    return CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__seq_.StaticDescriptor;
                }
            }
            public override int Parse(int pos, string text, int[] bestOffsets, ref ExprAst result)
            {
                bool isBest = false;
                NToken token_ = default(NToken);
                list<ExprAst> token_2 = null;
                NToken token_3 = default(NToken);
                int arg_88_0;
                if (pos < text.Length)
                {
                    char c = text[pos];
                    arg_88_0 = ((c != '{') ? -1 : (pos + 1));
                }
                else
                {
                    arg_88_0 = -1;
                }
                int newPos = arg_88_0;
                if (newPos >= 0)
                {
                    token_ = new NToken(pos, newPos);
                }
                int pos2 = newPos;
                bool _N_cache_8962 = pos2 >= 0;
                bool arg_113_0;
                if (_N_cache_8962)
                {
                    if (true)
                    {
                        if (isBest)
                        {
                            arg_113_0 = true;
                        }
                        else
                        {
                            isBest = (bestOffsets[0] < pos2);
                            arg_113_0 = (isBest || bestOffsets[0] == pos2);
                        }
                        goto IL_108;
                    }
                }
                arg_113_0 = false;
                IL_108:
                int arg_4C6_0;
                if (arg_113_0)
                {
                    int ofs0 = pos2;
                    int pos3 = this._grammar._#_s_(pos2, text);
                    bool _N_cache_8963 = pos3 >= 0;
                    bool arg_19E_0;
                    if (_N_cache_8963)
                    {
                        if (true)
                        {
                            if (isBest)
                            {
                                arg_19E_0 = true;
                            }
                            else
                            {
                                isBest = (bestOffsets[1] < pos3);
                                arg_19E_0 = (isBest || bestOffsets[1] == pos3);
                            }
                            goto IL_193;
                        }
                    }
                    arg_19E_0 = false;
                    IL_193:
                    if (arg_19E_0)
                    {
                        int ofs = pos3;
                        List<ExprAst> tmpList = new List<ExprAst>();
                        ExprAst token_4 = null;
                        int num = pos3;
                        while (true)
                        {
                            int newPos2 = this._grammar._#_expr_(num, text, 0, ref token_4);
                            if (newPos2 < 0)
                            {
                                break;
                            }
                            tmpList.Add(token_4);
                            num = newPos2;
                        }
                        int newPos3 = num;
                        token_2 = tmpList.NToList<ExprAst>();
                        int pos4 = newPos3;
                        bool _N_cache_8964 = pos4 >= 0;
                        bool arg_28A_0;
                        if (_N_cache_8964)
                        {
                            if (true)
                            {
                                if (isBest)
                                {
                                    arg_28A_0 = true;
                                }
                                else
                                {
                                    isBest = (bestOffsets[2] < pos4);
                                    arg_28A_0 = (isBest || bestOffsets[2] == pos4);
                                }
                                goto IL_27F;
                            }
                        }
                        arg_28A_0 = false;
                        IL_27F:
                        if (arg_28A_0)
                        {
                            int ofs2 = pos4;
                            int arg_2E8_0;
                            if (pos4 < text.Length)
                            {
                                char c = text[pos4];
                                arg_2E8_0 = ((c != '}') ? -1 : (pos4 + 1));
                            }
                            else
                            {
                                arg_2E8_0 = -1;
                            }
                            int newPos4 = arg_2E8_0;
                            if (newPos4 >= 0)
                            {
                                token_3 = new NToken(pos4, newPos4);
                            }
                            int pos5 = newPos4;
                            bool _N_cache_8965 = pos5 >= 0;
                            bool arg_375_0;
                            if (_N_cache_8965)
                            {
                                if (true)
                                {
                                    if (isBest)
                                    {
                                        arg_375_0 = true;
                                    }
                                    else
                                    {
                                        isBest = (bestOffsets[3] < pos5);
                                        arg_375_0 = (isBest || bestOffsets[3] == pos5);
                                    }
                                    goto IL_36A;
                                }
                            }
                            arg_375_0 = false;
                            IL_36A:
                            if (arg_375_0)
                            {
                                int ofs3 = pos5;
                                int pos6 = this._grammar._#_s_(pos5, text);
                                bool _N_cache_8966 = pos6 >= 0;
                                bool arg_400_0;
                                if (_N_cache_8966)
                                {
                                    if (true)
                                    {
                                        if (isBest)
                                        {
                                            arg_400_0 = true;
                                        }
                                        else
                                        {
                                            isBest = (bestOffsets[4] < pos6);
                                            arg_400_0 = (isBest || bestOffsets[4] == pos6);
                                        }
                                        goto IL_3F5;
                                    }
                                }
                                arg_400_0 = false;
                                IL_3F5:
                                if (arg_400_0)
                                {
                                    int ofs4 = pos6;
                                    if (isBest)
                                    {
                                        bestOffsets[0] = ofs0;
                                        bestOffsets[1] = ofs;
                                        bestOffsets[2] = ofs2;
                                        bestOffsets[3] = ofs3;
                                        bestOffsets[4] = ofs4;
                                        int i = 5;
                                        while (i < bestOffsets.Length && bestOffsets[i] >= 0)
                                        {
                                            bestOffsets[i] = -1;
                                            i++;
                                        }
                                        arg_4C6_0 = pos6;
                                    }
                                    else
                                    {
                                        arg_4C6_0 = -1;
                                    }
                                }
                                else
                                {
                                    arg_4C6_0 = -1;
                                }
                            }
                            else
                            {
                                arg_4C6_0 = -1;
                            }
                        }
                        else
                        {
                            arg_4C6_0 = -1;
                        }
                    }
                    else
                    {
                        arg_4C6_0 = -1;
                    }
                }
                else
                {
                    arg_4C6_0 = -1;
                }
                int newPos5 = arg_4C6_0;
                if (newPos5 > 0)
                {
                    result = new CalcParser.Expr.Seq(token_, token_2, token_3);
                    result.Location = new Location(this._grammar._parsingSource, token_.StartPos, token_3.EndPos);
                }
                else
                {
                    if (this._grammar._parsingErrors._#_seq_ < pos)
                    {
                        this._grammar._parsingErrors._#_seq_ = pos;
                    }
                }
                return newPos5;
            }
            public _#prefix#__seq_(IGrammar grammar) : base('\0', '?')
            {
                this._grammar = (CalcParser.GrammarImpl)grammar;
            }
        }
        public class _#prefix#__rounds_ : ExtensionPrefixBase<ExprAst>
        {
            private readonly CalcParser.GrammarImpl _grammar;
            public override RuleDescriptor Descriptor
            {
                get
                {
                    return CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__rounds_.StaticDescriptor;
                }
            }
            public override int Parse(int pos, string text, int[] bestOffsets, ref ExprAst result)
            {
                bool isBest = false;
                NToken token_ = default(NToken);
                ExprAst token_2 = null;
                NToken token_3 = default(NToken);
                int arg_88_0;
                if (pos < text.Length)
                {
                    char c = text[pos];
                    arg_88_0 = ((c != '(') ? -1 : (pos + 1));
                }
                else
                {
                    arg_88_0 = -1;
                }
                int newPos = arg_88_0;
                if (newPos >= 0)
                {
                    token_ = new NToken(pos, newPos);
                }
                int pos2 = newPos;
                bool _N_cache_9115 = pos2 >= 0;
                bool arg_113_0;
                if (_N_cache_9115)
                {
                    if (true)
                    {
                        if (isBest)
                        {
                            arg_113_0 = true;
                        }
                        else
                        {
                            isBest = (bestOffsets[0] < pos2);
                            arg_113_0 = (isBest || bestOffsets[0] == pos2);
                        }
                        goto IL_108;
                    }
                }
                arg_113_0 = false;
                IL_108:
                int arg_468_0;
                if (arg_113_0)
                {
                    int ofs0 = pos2;
                    int pos3 = this._grammar._#_s_(pos2, text);
                    bool _N_cache_9116 = pos3 >= 0;
                    bool arg_19E_0;
                    if (_N_cache_9116)
                    {
                        if (true)
                        {
                            if (isBest)
                            {
                                arg_19E_0 = true;
                            }
                            else
                            {
                                isBest = (bestOffsets[1] < pos3);
                                arg_19E_0 = (isBest || bestOffsets[1] == pos3);
                            }
                            goto IL_193;
                        }
                    }
                    arg_19E_0 = false;
                    IL_193:
                    if (arg_19E_0)
                    {
                        int ofs = pos3;
                        int pos4 = this._grammar._#_expr_(pos3, text, 0, ref token_2);
                        bool _N_cache_9117 = pos4 >= 0;
                        bool arg_22C_0;
                        if (_N_cache_9117)
                        {
                            if (true)
                            {
                                if (isBest)
                                {
                                    arg_22C_0 = true;
                                }
                                else
                                {
                                    isBest = (bestOffsets[2] < pos4);
                                    arg_22C_0 = (isBest || bestOffsets[2] == pos4);
                                }
                                goto IL_221;
                            }
                        }
                        arg_22C_0 = false;
                        IL_221:
                        if (arg_22C_0)
                        {
                            int ofs2 = pos4;
                            int arg_28A_0;
                            if (pos4 < text.Length)
                            {
                                char c = text[pos4];
                                arg_28A_0 = ((c != ')') ? -1 : (pos4 + 1));
                            }
                            else
                            {
                                arg_28A_0 = -1;
                            }
                            int newPos2 = arg_28A_0;
                            if (newPos2 >= 0)
                            {
                                token_3 = new NToken(pos4, newPos2);
                            }
                            int pos5 = newPos2;
                            bool _N_cache_9118 = pos5 >= 0;
                            bool arg_317_0;
                            if (_N_cache_9118)
                            {
                                if (true)
                                {
                                    if (isBest)
                                    {
                                        arg_317_0 = true;
                                    }
                                    else
                                    {
                                        isBest = (bestOffsets[3] < pos5);
                                        arg_317_0 = (isBest || bestOffsets[3] == pos5);
                                    }
                                    goto IL_30C;
                                }
                            }
                            arg_317_0 = false;
                            IL_30C:
                            if (arg_317_0)
                            {
                                int ofs3 = pos5;
                                int pos6 = this._grammar._#_s_(pos5, text);
                                bool _N_cache_9119 = pos6 >= 0;
                                bool arg_3A2_0;
                                if (_N_cache_9119)
                                {
                                    if (true)
                                    {
                                        if (isBest)
                                        {
                                            arg_3A2_0 = true;
                                        }
                                        else
                                        {
                                            isBest = (bestOffsets[4] < pos6);
                                            arg_3A2_0 = (isBest || bestOffsets[4] == pos6);
                                        }
                                        goto IL_397;
                                    }
                                }
                                arg_3A2_0 = false;
                                IL_397:
                                if (arg_3A2_0)
                                {
                                    int ofs4 = pos6;
                                    if (isBest)
                                    {
                                        bestOffsets[0] = ofs0;
                                        bestOffsets[1] = ofs;
                                        bestOffsets[2] = ofs2;
                                        bestOffsets[3] = ofs3;
                                        bestOffsets[4] = ofs4;
                                        int i = 5;
                                        while (i < bestOffsets.Length && bestOffsets[i] >= 0)
                                        {
                                            bestOffsets[i] = -1;
                                            i++;
                                        }
                                        arg_468_0 = pos6;
                                    }
                                    else
                                    {
                                        arg_468_0 = -1;
                                    }
                                }
                                else
                                {
                                    arg_468_0 = -1;
                                }
                            }
                            else
                            {
                                arg_468_0 = -1;
                            }
                        }
                        else
                        {
                            arg_468_0 = -1;
                        }
                    }
                    else
                    {
                        arg_468_0 = -1;
                    }
                }
                else
                {
                    arg_468_0 = -1;
                }
                int newPos3 = arg_468_0;
                if (newPos3 > 0)
                {
                    result = new CalcParser.Expr.Rounds(token_, token_2, token_3);
                    result.Location = new Location(this._grammar._parsingSource, token_.StartPos, token_3.EndPos);
                }
                else
                {
                    if (this._grammar._parsingErrors._#_rounds_ < pos)
                    {
                        this._grammar._parsingErrors._#_rounds_ = pos;
                    }
                }
                return newPos3;
            }
            public _#prefix#__rounds_(IGrammar grammar) : base('\0', '?')
            {
                this._grammar = (CalcParser.GrammarImpl)grammar;
            }
        }
        public class _#prefix#__prefixDec_ : ExtensionPrefixBase<ExprAst>
        {
            private readonly CalcParser.GrammarImpl _grammar;
            public override RuleDescriptor Descriptor
            {
                get
                {
                    return CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__prefixDec_.StaticDescriptor;
                }
            }
            public override int Parse(int pos, string text, int[] bestOffsets, ref ExprAst result)
            {
                bool isBest = false;
                NToken token_ = default(NToken);
                ExprAst token_2 = null;
                int newPos = (pos + 1 >= text.Length || text[pos] != '-' || text[pos + 1] != '-') ? -1 : (pos + 2);
                if (newPos >= 0)
                {
                    token_ = new NToken(pos, newPos);
                }
                int pos2 = newPos;
                bool _N_cache_9259 = pos2 >= 0;
                bool arg_117_0;
                if (_N_cache_9259)
                {
                    if (true)
                    {
                        if (isBest)
                        {
                            arg_117_0 = true;
                        }
                        else
                        {
                            isBest = (bestOffsets[0] < pos2);
                            arg_117_0 = (isBest || bestOffsets[0] == pos2);
                        }
                        goto IL_10C;
                    }
                }
                arg_117_0 = false;
                IL_10C:
                int arg_2D6_0;
                if (arg_117_0)
                {
                    int ofs0 = pos2;
                    int pos3 = this._grammar._#_s_(pos2, text);
                    bool _N_cache_9260 = pos3 >= 0;
                    bool arg_1A2_0;
                    if (_N_cache_9260)
                    {
                        if (true)
                        {
                            if (isBest)
                            {
                                arg_1A2_0 = true;
                            }
                            else
                            {
                                isBest = (bestOffsets[1] < pos3);
                                arg_1A2_0 = (isBest || bestOffsets[1] == pos3);
                            }
                            goto IL_197;
                        }
                    }
                    arg_1A2_0 = false;
                    IL_197:
                    if (arg_1A2_0)
                    {
                        int ofs = pos3;
                        int pos4 = this._grammar._#_expr_(pos3, text, 200, ref token_2);
                        bool _N_cache_9261 = pos4 >= 0;
                        bool arg_234_0;
                        if (_N_cache_9261)
                        {
                            if (true)
                            {
                                if (isBest)
                                {
                                    arg_234_0 = true;
                                }
                                else
                                {
                                    isBest = (bestOffsets[2] < pos4);
                                    arg_234_0 = (isBest || bestOffsets[2] == pos4);
                                }
                                goto IL_229;
                            }
                        }
                        arg_234_0 = false;
                        IL_229:
                        if (arg_234_0)
                        {
                            int ofs2 = pos4;
                            if (isBest)
                            {
                                bestOffsets[0] = ofs0;
                                bestOffsets[1] = ofs;
                                bestOffsets[2] = ofs2;
                                int i = 3;
                                while (i < bestOffsets.Length && bestOffsets[i] >= 0)
                                {
                                    bestOffsets[i] = -1;
                                    i++;
                                }
                                arg_2D6_0 = pos4;
                            }
                            else
                            {
                                arg_2D6_0 = -1;
                            }
                        }
                        else
                        {
                            arg_2D6_0 = -1;
                        }
                    }
                    else
                    {
                        arg_2D6_0 = -1;
                    }
                }
                else
                {
                    arg_2D6_0 = -1;
                }
                int newPos2 = arg_2D6_0;
                if (newPos2 > 0)
                {
                    result = new CalcParser.Expr.PrefixDec(token_, token_2);
                    result.Location = new Location(this._grammar._parsingSource, token_.StartPos, token_2.EndPos);
                }
                else
                {
                    if (this._grammar._parsingErrors._#_prefixDec_ < pos)
                    {
                        this._grammar._parsingErrors._#_prefixDec_ = pos;
                    }
                }
                return newPos2;
            }
            public _#prefix#__prefixDec_(IGrammar grammar) : base('\0', '?')
            {
                this._grammar = (CalcParser.GrammarImpl)grammar;
            }
        }
        public class _#postfix#_pow_ : ExtensionPostfixBase<ExprAst>
        {
            private readonly CalcParser.GrammarImpl _grammar;
            public override RuleDescriptor Descriptor
            {
                get
                {
                    return CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_pow_.StaticDescriptor;
                }
            }
            public override int Parse(int startPos, int pos, string text, int[] bestOffsets, ref ExprAst result)
            {
                bool isBest = false;
                NToken token_2 = default(NToken);
                ExprAst token_3 = null;
                ExprAst prefixResult = result;
                ExprAst token_4 = prefixResult;
                bool _N_cache_9359 = pos >= 0;
                bool arg_AA_0;
                if (_N_cache_9359)
                {
                    if (true)
                    {
                        if (isBest)
                        {
                            arg_AA_0 = true;
                        }
                        else
                        {
                            isBest = (bestOffsets[0] < pos);
                            arg_AA_0 = (isBest || bestOffsets[0] == pos);
                        }
                        goto IL_9F;
                    }
                }
                arg_AA_0 = false;
                IL_9F:
                int arg_36F_0;
                if (arg_AA_0)
                {
                    int arg_108_0;
                    if (pos < text.Length)
                    {
                        char c = text[pos];
                        arg_108_0 = ((c != '^') ? -1 : (pos + 1));
                    }
                    else
                    {
                        arg_108_0 = -1;
                    }
                    int newPos = arg_108_0;
                    if (newPos >= 0)
                    {
                        token_2 = new NToken(pos, newPos);
                    }
                    int pos2 = newPos;
                    bool _N_cache_9360 = pos2 >= 0;
                    bool arg_197_0;
                    if (_N_cache_9360)
                    {
                        if (true)
                        {
                            if (isBest)
                            {
                                arg_197_0 = true;
                            }
                            else
                            {
                                isBest = (bestOffsets[1] < pos2);
                                arg_197_0 = (isBest || bestOffsets[1] == pos2);
                            }
                            goto IL_18C;
                        }
                    }
                    arg_197_0 = false;
                    IL_18C:
                    if (arg_197_0)
                    {
                        int ofs = pos2;
                        int pos3 = this._grammar._#_s_(pos2, text);
                        bool _N_cache_9361 = pos3 >= 0;
                        bool arg_224_0;
                        if (_N_cache_9361)
                        {
                            if (true)
                            {
                                if (isBest)
                                {
                                    arg_224_0 = true;
                                }
                                else
                                {
                                    isBest = (bestOffsets[2] < pos3);
                                    arg_224_0 = (isBest || bestOffsets[2] == pos3);
                                }
                                goto IL_219;
                            }
                        }
                        arg_224_0 = false;
                        IL_219:
                        if (arg_224_0)
                        {
                            int ofs2 = pos3;
                            int pos4 = this._grammar._#_expr_(pos3, text, 30, ref token_3);
                            bool _N_cache_9362 = pos4 >= 0;
                            bool arg_2B5_0;
                            if (_N_cache_9362)
                            {
                                if (true)
                                {
                                    if (isBest)
                                    {
                                        arg_2B5_0 = true;
                                    }
                                    else
                                    {
                                        isBest = (bestOffsets[3] < pos4);
                                        arg_2B5_0 = (isBest || bestOffsets[3] == pos4);
                                    }
                                    goto IL_2AA;
                                }
                            }
                            arg_2B5_0 = false;
                            IL_2AA:
                            if (arg_2B5_0)
                            {
                                int ofs3 = pos4;
                                if (isBest)
                                {
                                    bestOffsets[0] = pos;
                                    bestOffsets[1] = ofs;
                                    bestOffsets[2] = ofs2;
                                    bestOffsets[3] = ofs3;
                                    int i = 4;
                                    while (i < bestOffsets.Length && bestOffsets[i] >= 0)
                                    {
                                        bestOffsets[i] = -1;
                                        i++;
                                    }
                                    arg_36F_0 = pos4;
                                }
                                else
                                {
                                    arg_36F_0 = -1;
                                }
                            }
                            else
                            {
                                arg_36F_0 = -1;
                            }
                        }
                        else
                        {
                            arg_36F_0 = -1;
                        }
                    }
                    else
                    {
                        arg_36F_0 = -1;
                    }
                }
                else
                {
                    arg_36F_0 = -1;
                }
                int newPos2 = arg_36F_0;
                if (newPos2 > 0)
                {
                    result = new CalcParser.Expr.Pow(token_4, token_2, token_3);
                    result.Location = new Location(this._grammar._parsingSource, token_4.StartPos, token_3.EndPos);
                }
                else
                {
                    if (this._grammar._parsingErrors._#_pow_ < pos)
                    {
                        this._grammar._parsingErrors._#_pow_ = pos;
                    }
                }
                return newPos2;
            }
            public _#postfix#_pow_(IGrammar grammar) : base(31, '\0', '?')
            {
                this._grammar = (CalcParser.GrammarImpl)grammar;
            }
        }
        public class _#postfix#_postfixDec_ : ExtensionPostfixBase<ExprAst>
        {
            private readonly CalcParser.GrammarImpl _grammar;
            public override RuleDescriptor Descriptor
            {
                get
                {
                    return CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_postfixDec_.StaticDescriptor;
                }
            }
            public override int Parse(int startPos, int pos, string text, int[] bestOffsets, ref ExprAst result)
            {
                bool isBest = false;
                NToken token_2 = default(NToken);
                ExprAst prefixResult = result;
                ExprAst token_3 = prefixResult;
                bool _N_cache_9478 = pos >= 0;
                bool arg_A6_0;
                if (_N_cache_9478)
                {
                    if (true)
                    {
                        if (isBest)
                        {
                            arg_A6_0 = true;
                        }
                        else
                        {
                            isBest = (bestOffsets[0] < pos);
                            arg_A6_0 = (isBest || bestOffsets[0] == pos);
                        }
                        goto IL_9B;
                    }
                }
                arg_A6_0 = false;
                IL_9B:
                int arg_2D9_0;
                if (arg_A6_0)
                {
                    int newPos = (pos + 1 >= text.Length || text[pos] != '-' || text[pos + 1] != '-') ? -1 : (pos + 2);
                    if (newPos >= 0)
                    {
                        token_2 = new NToken(pos, newPos);
                    }
                    int pos2 = newPos;
                    bool _N_cache_9479 = pos2 >= 0;
                    bool arg_1A5_0;
                    if (_N_cache_9479)
                    {
                        if (true)
                        {
                            if (isBest)
                            {
                                arg_1A5_0 = true;
                            }
                            else
                            {
                                isBest = (bestOffsets[1] < pos2);
                                arg_1A5_0 = (isBest || bestOffsets[1] == pos2);
                            }
                            goto IL_19A;
                        }
                    }
                    arg_1A5_0 = false;
                    IL_19A:
                    if (arg_1A5_0)
                    {
                        int ofs = pos2;
                        int pos3 = this._grammar._#_s_(pos2, text);
                        bool _N_cache_9480 = pos3 >= 0;
                        bool arg_232_0;
                        if (_N_cache_9480)
                        {
                            if (true)
                            {
                                if (isBest)
                                {
                                    arg_232_0 = true;
                                }
                                else
                                {
                                    isBest = (bestOffsets[2] < pos3);
                                    arg_232_0 = (isBest || bestOffsets[2] == pos3);
                                }
                                goto IL_227;
                            }
                        }
                        arg_232_0 = false;
                        IL_227:
                        if (arg_232_0)
                        {
                            int ofs2 = pos3;
                            if (isBest)
                            {
                                bestOffsets[0] = pos;
                                bestOffsets[1] = ofs;
                                bestOffsets[2] = ofs2;
                                int i = 3;
                                while (i < bestOffsets.Length && bestOffsets[i] >= 0)
                                {
                                    bestOffsets[i] = -1;
                                    i++;
                                }
                                arg_2D9_0 = pos3;
                            }
                            else
                            {
                                arg_2D9_0 = -1;
                            }
                        }
                        else
                        {
                            arg_2D9_0 = -1;
                        }
                    }
                    else
                    {
                        arg_2D9_0 = -1;
                    }
                }
                else
                {
                    arg_2D9_0 = -1;
                }
                int newPos2 = arg_2D9_0;
                if (newPos2 > 0)
                {
                    result = new CalcParser.Expr.PostfixDec(token_3, token_2);
                    result.Location = new Location(this._grammar._parsingSource, token_3.StartPos, token_2.EndPos);
                }
                else
                {
                    if (this._grammar._parsingErrors._#_postfixDec_ < pos)
                    {
                        this._grammar._parsingErrors._#_postfixDec_ = pos;
                    }
                }
                return newPos2;
            }
            public _#postfix#_postfixDec_(IGrammar grammar) : base(200, '\0', '?')
            {
                this._grammar = (CalcParser.GrammarImpl)grammar;
            }
        }
        public class _#prefix#__num_ : ExtensionPrefixBase<ExprAst>
        {
            private readonly CalcParser.GrammarImpl _grammar;
            public override RuleDescriptor Descriptor
            {
                get
                {
                    return CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__num_.StaticDescriptor;
                }
            }
            public override int Parse(int pos, string text, int[] bestOffsets, ref ExprAst result)
            {
                bool isBest = false;
                string token_ = null;
                int pos2 = this._grammar._#grammar#1._#_number_(pos, text, ref token_);
                bool _N_cache_9580 = pos2 >= 0;
                bool arg_A1_0;
                if (_N_cache_9580)
                {
                    if (true)
                    {
                        if (isBest)
                        {
                            arg_A1_0 = true;
                        }
                        else
                        {
                            isBest = (bestOffsets[0] < pos2);
                            arg_A1_0 = (isBest || bestOffsets[0] == pos2);
                        }
                        goto IL_96;
                    }
                }
                arg_A1_0 = false;
                IL_96:
                int arg_1BA_0;
                if (arg_A1_0)
                {
                    int ofs0 = pos2;
                    int pos3 = this._grammar._#_s_(pos2, text);
                    bool _N_cache_9581 = pos3 >= 0;
                    bool arg_12A_0;
                    if (_N_cache_9581)
                    {
                        if (true)
                        {
                            if (isBest)
                            {
                                arg_12A_0 = true;
                            }
                            else
                            {
                                isBest = (bestOffsets[1] < pos3);
                                arg_12A_0 = (isBest || bestOffsets[1] == pos3);
                            }
                            goto IL_11F;
                        }
                    }
                    arg_12A_0 = false;
                    IL_11F:
                    if (arg_12A_0)
                    {
                        int ofs = pos3;
                        if (isBest)
                        {
                            bestOffsets[0] = ofs0;
                            bestOffsets[1] = ofs;
                            int i = 2;
                            while (i < bestOffsets.Length && bestOffsets[i] >= 0)
                            {
                                bestOffsets[i] = -1;
                                i++;
                            }
                            arg_1BA_0 = pos3;
                        }
                        else
                        {
                            arg_1BA_0 = -1;
                        }
                    }
                    else
                    {
                        arg_1BA_0 = -1;
                    }
                }
                else
                {
                    arg_1BA_0 = -1;
                }
                int newPos = arg_1BA_0;
                if (newPos > 0)
                {
                    result = new CalcParser.Expr.Num(token_);
                    result.Location = new Location(this._grammar._parsingSource, pos, newPos);
                }
                else
                {
                    if (this._grammar._parsingErrors._#_num_ < pos)
                    {
                        this._grammar._parsingErrors._#_num_ = pos;
                    }
                }
                return newPos;
            }
            public _#prefix#__num_(IGrammar grammar) : base('\0', '?')
            {
                this._grammar = (CalcParser.GrammarImpl)grammar;
            }
        }
        public class _#prefix#__neg_ : ExtensionPrefixBase<ExprAst>
        {
            private readonly CalcParser.GrammarImpl _grammar;
            public override RuleDescriptor Descriptor
            {
                get
                {
                    return CalcParser.GrammarImpl.GrammarDescriptorImpl._#prefix#__neg_.StaticDescriptor;
                }
            }
            public override int Parse(int pos, string text, int[] bestOffsets, ref ExprAst result)
            {
                bool isBest = false;
                NToken token_ = default(NToken);
                ExprAst token_2 = null;
                int arg_7B_0;
                if (pos < text.Length)
                {
                    char c = text[pos];
                    arg_7B_0 = ((c != '-') ? -1 : (pos + 1));
                }
                else
                {
                    arg_7B_0 = -1;
                }
                int newPos = arg_7B_0;
                if (newPos >= 0)
                {
                    token_ = new NToken(pos, newPos);
                }
                int pos2 = newPos;
                bool _N_cache_9670 = pos2 >= 0;
                bool arg_106_0;
                if (_N_cache_9670)
                {
                    if (true)
                    {
                        if (isBest)
                        {
                            arg_106_0 = true;
                        }
                        else
                        {
                            isBest = (bestOffsets[0] < pos2);
                            arg_106_0 = (isBest || bestOffsets[0] == pos2);
                        }
                        goto IL_FB;
                    }
                }
                arg_106_0 = false;
                IL_FB:
                int arg_2C2_0;
                if (arg_106_0)
                {
                    int ofs0 = pos2;
                    int pos3 = this._grammar._#_s_(pos2, text);
                    bool _N_cache_9671 = pos3 >= 0;
                    bool arg_191_0;
                    if (_N_cache_9671)
                    {
                        if (true)
                        {
                            if (isBest)
                            {
                                arg_191_0 = true;
                            }
                            else
                            {
                                isBest = (bestOffsets[1] < pos3);
                                arg_191_0 = (isBest || bestOffsets[1] == pos3);
                            }
                            goto IL_186;
                        }
                    }
                    arg_191_0 = false;
                    IL_186:
                    if (arg_191_0)
                    {
                        int ofs = pos3;
                        int pos4 = this._grammar._#_expr_(pos3, text, 100, ref token_2);
                        bool _N_cache_9672 = pos4 >= 0;
                        bool arg_220_0;
                        if (_N_cache_9672)
                        {
                            if (true)
                            {
                                if (isBest)
                                {
                                    arg_220_0 = true;
                                }
                                else
                                {
                                    isBest = (bestOffsets[2] < pos4);
                                    arg_220_0 = (isBest || bestOffsets[2] == pos4);
                                }
                                goto IL_215;
                            }
                        }
                        arg_220_0 = false;
                        IL_215:
                        if (arg_220_0)
                        {
                            int ofs2 = pos4;
                            if (isBest)
                            {
                                bestOffsets[0] = ofs0;
                                bestOffsets[1] = ofs;
                                bestOffsets[2] = ofs2;
                                int i = 3;
                                while (i < bestOffsets.Length && bestOffsets[i] >= 0)
                                {
                                    bestOffsets[i] = -1;
                                    i++;
                                }
                                arg_2C2_0 = pos4;
                            }
                            else
                            {
                                arg_2C2_0 = -1;
                            }
                        }
                        else
                        {
                            arg_2C2_0 = -1;
                        }
                    }
                    else
                    {
                        arg_2C2_0 = -1;
                    }
                }
                else
                {
                    arg_2C2_0 = -1;
                }
                int newPos2 = arg_2C2_0;
                if (newPos2 > 0)
                {
                    result = new CalcParser.Expr.Neg(token_, token_2);
                    result.Location = new Location(this._grammar._parsingSource, token_.StartPos, token_2.EndPos);
                }
                else
                {
                    if (this._grammar._parsingErrors._#_neg_ < pos)
                    {
                        this._grammar._parsingErrors._#_neg_ = pos;
                    }
                }
                return newPos2;
            }
            public _#prefix#__neg_(IGrammar grammar) : base('\0', '?')
            {
                this._grammar = (CalcParser.GrammarImpl)grammar;
            }
        }
        public class _#postfix#_mul_ : ExtensionPostfixBase<ExprAst>
        {
            private readonly CalcParser.GrammarImpl _grammar;
            public override RuleDescriptor Descriptor
            {
                get
                {
                    return CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_mul_.StaticDescriptor;
                }
            }
            public override int Parse(int startPos, int pos, string text, int[] bestOffsets, ref ExprAst result)
            {
                bool isBest = false;
                NToken token_2 = default(NToken);
                ExprAst token_3 = null;
                ExprAst prefixResult = result;
                ExprAst token_4 = prefixResult;
                bool _N_cache_9770 = pos >= 0;
                bool arg_AA_0;
                if (_N_cache_9770)
                {
                    if (true)
                    {
                        if (isBest)
                        {
                            arg_AA_0 = true;
                        }
                        else
                        {
                            isBest = (bestOffsets[0] < pos);
                            arg_AA_0 = (isBest || bestOffsets[0] == pos);
                        }
                        goto IL_9F;
                    }
                }
                arg_AA_0 = false;
                IL_9F:
                int arg_36F_0;
                if (arg_AA_0)
                {
                    int arg_108_0;
                    if (pos < text.Length)
                    {
                        char c = text[pos];
                        arg_108_0 = ((c != '*') ? -1 : (pos + 1));
                    }
                    else
                    {
                        arg_108_0 = -1;
                    }
                    int newPos = arg_108_0;
                    if (newPos >= 0)
                    {
                        token_2 = new NToken(pos, newPos);
                    }
                    int pos2 = newPos;
                    bool _N_cache_9771 = pos2 >= 0;
                    bool arg_197_0;
                    if (_N_cache_9771)
                    {
                        if (true)
                        {
                            if (isBest)
                            {
                                arg_197_0 = true;
                            }
                            else
                            {
                                isBest = (bestOffsets[1] < pos2);
                                arg_197_0 = (isBest || bestOffsets[1] == pos2);
                            }
                            goto IL_18C;
                        }
                    }
                    arg_197_0 = false;
                    IL_18C:
                    if (arg_197_0)
                    {
                        int ofs = pos2;
                        int pos3 = this._grammar._#_s_(pos2, text);
                        bool _N_cache_9772 = pos3 >= 0;
                        bool arg_224_0;
                        if (_N_cache_9772)
                        {
                            if (true)
                            {
                                if (isBest)
                                {
                                    arg_224_0 = true;
                                }
                                else
                                {
                                    isBest = (bestOffsets[2] < pos3);
                                    arg_224_0 = (isBest || bestOffsets[2] == pos3);
                                }
                                goto IL_219;
                            }
                        }
                        arg_224_0 = false;
                        IL_219:
                        if (arg_224_0)
                        {
                            int ofs2 = pos3;
                            int pos4 = this._grammar._#_expr_(pos3, text, 20, ref token_3);
                            bool _N_cache_9773 = pos4 >= 0;
                            bool arg_2B5_0;
                            if (_N_cache_9773)
                            {
                                if (true)
                                {
                                    if (isBest)
                                    {
                                        arg_2B5_0 = true;
                                    }
                                    else
                                    {
                                        isBest = (bestOffsets[3] < pos4);
                                        arg_2B5_0 = (isBest || bestOffsets[3] == pos4);
                                    }
                                    goto IL_2AA;
                                }
                            }
                            arg_2B5_0 = false;
                            IL_2AA:
                            if (arg_2B5_0)
                            {
                                int ofs3 = pos4;
                                if (isBest)
                                {
                                    bestOffsets[0] = pos;
                                    bestOffsets[1] = ofs;
                                    bestOffsets[2] = ofs2;
                                    bestOffsets[3] = ofs3;
                                    int i = 4;
                                    while (i < bestOffsets.Length && bestOffsets[i] >= 0)
                                    {
                                        bestOffsets[i] = -1;
                                        i++;
                                    }
                                    arg_36F_0 = pos4;
                                }
                                else
                                {
                                    arg_36F_0 = -1;
                                }
                            }
                            else
                            {
                                arg_36F_0 = -1;
                            }
                        }
                        else
                        {
                            arg_36F_0 = -1;
                        }
                    }
                    else
                    {
                        arg_36F_0 = -1;
                    }
                }
                else
                {
                    arg_36F_0 = -1;
                }
                int newPos2 = arg_36F_0;
                if (newPos2 > 0)
                {
                    result = new CalcParser.Expr.Mul(token_4, token_2, token_3);
                    result.Location = new Location(this._grammar._parsingSource, token_4.StartPos, token_3.EndPos);
                }
                else
                {
                    if (this._grammar._parsingErrors._#_mul_ < pos)
                    {
                        this._grammar._parsingErrors._#_mul_ = pos;
                    }
                }
                return newPos2;
            }
            public _#postfix#_mul_(IGrammar grammar) : base(20, '\0', '?')
            {
                this._grammar = (CalcParser.GrammarImpl)grammar;
            }
        }
        public class _#postfix#_mod_ : ExtensionPostfixBase<ExprAst>
        {
            private readonly CalcParser.GrammarImpl _grammar;
            public override RuleDescriptor Descriptor
            {
                get
                {
                    return CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_mod_.StaticDescriptor;
                }
            }
            public override int Parse(int startPos, int pos, string text, int[] bestOffsets, ref ExprAst result)
            {
                bool isBest = false;
                NToken token_2 = default(NToken);
                ExprAst token_3 = null;
                ExprAst prefixResult = result;
                ExprAst token_4 = prefixResult;
                bool _N_cache_9893 = pos >= 0;
                bool arg_AA_0;
                if (_N_cache_9893)
                {
                    if (true)
                    {
                        if (isBest)
                        {
                            arg_AA_0 = true;
                        }
                        else
                        {
                            isBest = (bestOffsets[0] < pos);
                            arg_AA_0 = (isBest || bestOffsets[0] == pos);
                        }
                        goto IL_9F;
                    }
                }
                arg_AA_0 = false;
                IL_9F:
                int arg_36F_0;
                if (arg_AA_0)
                {
                    int arg_108_0;
                    if (pos < text.Length)
                    {
                        char c = text[pos];
                        arg_108_0 = ((c != '%') ? -1 : (pos + 1));
                    }
                    else
                    {
                        arg_108_0 = -1;
                    }
                    int newPos = arg_108_0;
                    if (newPos >= 0)
                    {
                        token_2 = new NToken(pos, newPos);
                    }
                    int pos2 = newPos;
                    bool _N_cache_9894 = pos2 >= 0;
                    bool arg_197_0;
                    if (_N_cache_9894)
                    {
                        if (true)
                        {
                            if (isBest)
                            {
                                arg_197_0 = true;
                            }
                            else
                            {
                                isBest = (bestOffsets[1] < pos2);
                                arg_197_0 = (isBest || bestOffsets[1] == pos2);
                            }
                            goto IL_18C;
                        }
                    }
                    arg_197_0 = false;
                    IL_18C:
                    if (arg_197_0)
                    {
                        int ofs = pos2;
                        int pos3 = this._grammar._#_s_(pos2, text);
                        bool _N_cache_9895 = pos3 >= 0;
                        bool arg_224_0;
                        if (_N_cache_9895)
                        {
                            if (true)
                            {
                                if (isBest)
                                {
                                    arg_224_0 = true;
                                }
                                else
                                {
                                    isBest = (bestOffsets[2] < pos3);
                                    arg_224_0 = (isBest || bestOffsets[2] == pos3);
                                }
                                goto IL_219;
                            }
                        }
                        arg_224_0 = false;
                        IL_219:
                        if (arg_224_0)
                        {
                            int ofs2 = pos3;
                            int pos4 = this._grammar._#_expr_(pos3, text, 20, ref token_3);
                            bool _N_cache_9896 = pos4 >= 0;
                            bool arg_2B5_0;
                            if (_N_cache_9896)
                            {
                                if (true)
                                {
                                    if (isBest)
                                    {
                                        arg_2B5_0 = true;
                                    }
                                    else
                                    {
                                        isBest = (bestOffsets[3] < pos4);
                                        arg_2B5_0 = (isBest || bestOffsets[3] == pos4);
                                    }
                                    goto IL_2AA;
                                }
                            }
                            arg_2B5_0 = false;
                            IL_2AA:
                            if (arg_2B5_0)
                            {
                                int ofs3 = pos4;
                                if (isBest)
                                {
                                    bestOffsets[0] = pos;
                                    bestOffsets[1] = ofs;
                                    bestOffsets[2] = ofs2;
                                    bestOffsets[3] = ofs3;
                                    int i = 4;
                                    while (i < bestOffsets.Length && bestOffsets[i] >= 0)
                                    {
                                        bestOffsets[i] = -1;
                                        i++;
                                    }
                                    arg_36F_0 = pos4;
                                }
                                else
                                {
                                    arg_36F_0 = -1;
                                }
                            }
                            else
                            {
                                arg_36F_0 = -1;
                            }
                        }
                        else
                        {
                            arg_36F_0 = -1;
                        }
                    }
                    else
                    {
                        arg_36F_0 = -1;
                    }
                }
                else
                {
                    arg_36F_0 = -1;
                }
                int newPos2 = arg_36F_0;
                if (newPos2 > 0)
                {
                    result = new CalcParser.Expr.Mod(token_4, token_2, token_3);
                    result.Location = new Location(this._grammar._parsingSource, token_4.StartPos, token_3.EndPos);
                }
                else
                {
                    if (this._grammar._parsingErrors._#_mod_ < pos)
                    {
                        this._grammar._parsingErrors._#_mod_ = pos;
                    }
                }
                return newPos2;
            }
            public _#postfix#_mod_(IGrammar grammar) : base(20, '\0', '?')
            {
                this._grammar = (CalcParser.GrammarImpl)grammar;
            }
        }
        public class _#postfix#_div_ : ExtensionPostfixBase<ExprAst>
        {
            private readonly CalcParser.GrammarImpl _grammar;
            public override RuleDescriptor Descriptor
            {
                get
                {
                    return CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_div_.StaticDescriptor;
                }
            }
            public override int Parse(int startPos, int pos, string text, int[] bestOffsets, ref ExprAst result)
            {
                bool isBest = false;
                NToken token_2 = default(NToken);
                ExprAst token_3 = null;
                ExprAst prefixResult = result;
                ExprAst token_4 = prefixResult;
                bool _N_cache_10016 = pos >= 0;
                bool arg_AA_0;
                if (_N_cache_10016)
                {
                    if (true)
                    {
                        if (isBest)
                        {
                            arg_AA_0 = true;
                        }
                        else
                        {
                            isBest = (bestOffsets[0] < pos);
                            arg_AA_0 = (isBest || bestOffsets[0] == pos);
                        }
                        goto IL_9F;
                    }
                }
                arg_AA_0 = false;
                IL_9F:
                int arg_36F_0;
                if (arg_AA_0)
                {
                    int arg_108_0;
                    if (pos < text.Length)
                    {
                        char c = text[pos];
                        arg_108_0 = ((c != '/') ? -1 : (pos + 1));
                    }
                    else
                    {
                        arg_108_0 = -1;
                    }
                    int newPos = arg_108_0;
                    if (newPos >= 0)
                    {
                        token_2 = new NToken(pos, newPos);
                    }
                    int pos2 = newPos;
                    bool _N_cache_10017 = pos2 >= 0;
                    bool arg_197_0;
                    if (_N_cache_10017)
                    {
                        if (true)
                        {
                            if (isBest)
                            {
                                arg_197_0 = true;
                            }
                            else
                            {
                                isBest = (bestOffsets[1] < pos2);
                                arg_197_0 = (isBest || bestOffsets[1] == pos2);
                            }
                            goto IL_18C;
                        }
                    }
                    arg_197_0 = false;
                    IL_18C:
                    if (arg_197_0)
                    {
                        int ofs = pos2;
                        int pos3 = this._grammar._#_s_(pos2, text);
                        bool _N_cache_10018 = pos3 >= 0;
                        bool arg_224_0;
                        if (_N_cache_10018)
                        {
                            if (true)
                            {
                                if (isBest)
                                {
                                    arg_224_0 = true;
                                }
                                else
                                {
                                    isBest = (bestOffsets[2] < pos3);
                                    arg_224_0 = (isBest || bestOffsets[2] == pos3);
                                }
                                goto IL_219;
                            }
                        }
                        arg_224_0 = false;
                        IL_219:
                        if (arg_224_0)
                        {
                            int ofs2 = pos3;
                            int pos4 = this._grammar._#_expr_(pos3, text, 20, ref token_3);
                            bool _N_cache_10019 = pos4 >= 0;
                            bool arg_2B5_0;
                            if (_N_cache_10019)
                            {
                                if (true)
                                {
                                    if (isBest)
                                    {
                                        arg_2B5_0 = true;
                                    }
                                    else
                                    {
                                        isBest = (bestOffsets[3] < pos4);
                                        arg_2B5_0 = (isBest || bestOffsets[3] == pos4);
                                    }
                                    goto IL_2AA;
                                }
                            }
                            arg_2B5_0 = false;
                            IL_2AA:
                            if (arg_2B5_0)
                            {
                                int ofs3 = pos4;
                                if (isBest)
                                {
                                    bestOffsets[0] = pos;
                                    bestOffsets[1] = ofs;
                                    bestOffsets[2] = ofs2;
                                    bestOffsets[3] = ofs3;
                                    int i = 4;
                                    while (i < bestOffsets.Length && bestOffsets[i] >= 0)
                                    {
                                        bestOffsets[i] = -1;
                                        i++;
                                    }
                                    arg_36F_0 = pos4;
                                }
                                else
                                {
                                    arg_36F_0 = -1;
                                }
                            }
                            else
                            {
                                arg_36F_0 = -1;
                            }
                        }
                        else
                        {
                            arg_36F_0 = -1;
                        }
                    }
                    else
                    {
                        arg_36F_0 = -1;
                    }
                }
                else
                {
                    arg_36F_0 = -1;
                }
                int newPos2 = arg_36F_0;
                if (newPos2 > 0)
                {
                    result = new CalcParser.Expr.Div(token_4, token_2, token_3);
                    result.Location = new Location(this._grammar._parsingSource, token_4.StartPos, token_3.EndPos);
                }
                else
                {
                    if (this._grammar._parsingErrors._#_div_ < pos)
                    {
                        this._grammar._parsingErrors._#_div_ = pos;
                    }
                }
                return newPos2;
            }
            public _#postfix#_div_(IGrammar grammar) : base(20, '\0', '?')
            {
                this._grammar = (CalcParser.GrammarImpl)grammar;
            }
        }
        public class _#postfix#_add_ : ExtensionPostfixBase<ExprAst>
        {
            private readonly CalcParser.GrammarImpl _grammar;
            public override RuleDescriptor Descriptor
            {
                get
                {
                    return CalcParser.GrammarImpl.GrammarDescriptorImpl._#postfix#_add_.StaticDescriptor;
                }
            }
            public override int Parse(int startPos, int pos, string text, int[] bestOffsets, ref ExprAst result)
            {
                bool isBest = false;
                NToken token_2 = default(NToken);
                ExprAst token_3 = null;
                ExprAst prefixResult = result;
                ExprAst token_4 = prefixResult;
                bool _N_cache_10139 = pos >= 0;
                bool arg_AA_0;
                if (_N_cache_10139)
                {
                    if (true)
                    {
                        if (isBest)
                        {
                            arg_AA_0 = true;
                        }
                        else
                        {
                            isBest = (bestOffsets[0] < pos);
                            arg_AA_0 = (isBest || bestOffsets[0] == pos);
                        }
                        goto IL_9F;
                    }
                }
                arg_AA_0 = false;
                IL_9F:
                int arg_36F_0;
                if (arg_AA_0)
                {
                    int arg_108_0;
                    if (pos < text.Length)
                    {
                        char c = text[pos];
                        arg_108_0 = ((c != '+') ? -1 : (pos + 1));
                    }
                    else
                    {
                        arg_108_0 = -1;
                    }
                    int newPos = arg_108_0;
                    if (newPos >= 0)
                    {
                        token_2 = new NToken(pos, newPos);
                    }
                    int pos2 = newPos;
                    bool _N_cache_10140 = pos2 >= 0;
                    bool arg_197_0;
                    if (_N_cache_10140)
                    {
                        if (true)
                        {
                            if (isBest)
                            {
                                arg_197_0 = true;
                            }
                            else
                            {
                                isBest = (bestOffsets[1] < pos2);
                                arg_197_0 = (isBest || bestOffsets[1] == pos2);
                            }
                            goto IL_18C;
                        }
                    }
                    arg_197_0 = false;
                    IL_18C:
                    if (arg_197_0)
                    {
                        int ofs = pos2;
                        int pos3 = this._grammar._#_s_(pos2, text);
                        bool _N_cache_10141 = pos3 >= 0;
                        bool arg_224_0;
                        if (_N_cache_10141)
                        {
                            if (true)
                            {
                                if (isBest)
                                {
                                    arg_224_0 = true;
                                }
                                else
                                {
                                    isBest = (bestOffsets[2] < pos3);
                                    arg_224_0 = (isBest || bestOffsets[2] == pos3);
                                }
                                goto IL_219;
                            }
                        }
                        arg_224_0 = false;
                        IL_219:
                        if (arg_224_0)
                        {
                            int ofs2 = pos3;
                            int pos4 = this._grammar._#_expr_(pos3, text, 10, ref token_3);
                            bool _N_cache_10142 = pos4 >= 0;
                            bool arg_2B5_0;
                            if (_N_cache_10142)
                            {
                                if (true)
                                {
                                    if (isBest)
                                    {
                                        arg_2B5_0 = true;
                                    }
                                    else
                                    {
                                        isBest = (bestOffsets[3] < pos4);
                                        arg_2B5_0 = (isBest || bestOffsets[3] == pos4);
                                    }
                                    goto IL_2AA;
                                }
                            }
                            arg_2B5_0 = false;
                            IL_2AA:
                            if (arg_2B5_0)
                            {
                                int ofs3 = pos4;
                                if (isBest)
                                {
                                    bestOffsets[0] = pos;
                                    bestOffsets[1] = ofs;
                                    bestOffsets[2] = ofs2;
                                    bestOffsets[3] = ofs3;
                                    int i = 4;
                                    while (i < bestOffsets.Length && bestOffsets[i] >= 0)
                                    {
                                        bestOffsets[i] = -1;
                                        i++;
                                    }
                                    arg_36F_0 = pos4;
                                }
                                else
                                {
                                    arg_36F_0 = -1;
                                }
                            }
                            else
                            {
                                arg_36F_0 = -1;
                            }
                        }
                        else
                        {
                            arg_36F_0 = -1;
                        }
                    }
                    else
                    {
                        arg_36F_0 = -1;
                    }
                }
                else
                {
                    arg_36F_0 = -1;
                }
                int newPos2 = arg_36F_0;
                if (newPos2 > 0)
                {
                    result = new CalcParser.Expr.Add(token_4, token_2, token_3);
                    result.Location = new Location(this._grammar._parsingSource, token_4.StartPos, token_3.EndPos);
                }
                else
                {
                    if (this._grammar._parsingErrors._#_add_ < pos)
                    {
                        this._grammar._parsingErrors._#_add_ = pos;
                    }
                }
                return newPos2;
            }
            public _#postfix#_add_(IGrammar grammar) : base(10, '\0', '?')
            {
                this._grammar = (CalcParser.GrammarImpl)grammar;
            }
        }
        private IncParser.GrammarImpl _#grammar#0;
        private NumParser.GrammarImpl _#grammar#1;
        public ExtensionPostfixBase<ExprAst>[] _#_expr_PostfixRules_ = new ExtensionPostfixBase<ExprAst>[0];
        public ExtensionPrefixBase<ExprAst>[] _#_expr_PrefixRules__ = new ExtensionPrefixBase<ExprAst>[0];
        private int _#_expr_PrefixEndPos_ = -1;
        private ExprAst _#_expr_PrefixResult_;
        private int _#_expr_EndPos_______ = -1;
        private ExprAst _#_expr_Result_______;
        private int _#_expr_BindingPower_ = -1;
        private int _#_expr_StartPos_____ = -1;
        private int _#_start_EndPos______ = -1;
        private ExprAst _#_start_Result______;
        private int _#_start_StartPos____ = -1;
        [CompilerGenerated, DebuggerBrowsable(DebuggerBrowsableState.Never)]
        private Parser _N_Parser_4066;
        private CalcParser.GrammarImpl.ParsingErrorsImpl _parsingErrors;
        private static readonly GrammarDescriptor _descriptor;
        public override Parser Parser
        {
            get;
            private set;
        }
        public static GrammarDescriptor StaticDescriptor
        {
            get
            {
                return CalcParser.GrammarImpl._descriptor;
            }
        }
        public GrammarDescriptor Descriptor
        {
            get
            {
                return CalcParser.GrammarImpl._descriptor;
            }
        }
        public new SourceSnapshot get_ParsingSource()
        {
            return base.ParsingSource;
        }
        public void Init()
        {
            this._parsingSource = this.Parser.ParsingSource;
            this._parsingErrors = (CalcParser.GrammarImpl.ParsingErrorsImpl)this.Parser.GetParsingErrorsForGrammar(CalcParser.GrammarImpl.StaticDescriptor);
            this._#grammar#1 = (NumParser.GrammarImpl)this.Parser.GetGrammar(NumParser.GrammarImpl.StaticDescriptor).Value;
            this._#grammar#0 = (IncParser.GrammarImpl)this.Parser.GetGrammar(IncParser.GrammarImpl.StaticDescriptor).Value;
            this.LoadExtensionRules();
        }
        public IGrammarState SaveState()
        {
            return new CalcParser.GrammarImpl.GrammarStateImpl(this);
        }
        private void LoadExtensionRules()
        {
            checked
            {
                ExtensionPrefixBase<ExprAst>[] e = this._#_expr_PrefixRules__;
                int result = 0;
                if (e != null)
                {
                    result = e.Length;
                }
                int prevLength = result;
                Array.Resize<ExtensionPrefixBase<ExprAst>>(ref this._#_expr_PrefixRules__, prevLength + 5);
                this._#_expr_PrefixRules__[prevLength + 0] = new CalcParser.GrammarImpl._#prefix#__neg_(this);
                this._#_expr_PrefixRules__[prevLength + 1] = new CalcParser.GrammarImpl._#prefix#__num_(this);
                this._#_expr_PrefixRules__[prevLength + 2] = new CalcParser.GrammarImpl._#prefix#__prefixDec_(this);
                this._#_expr_PrefixRules__[prevLength + 3] = new CalcParser.GrammarImpl._#prefix#__rounds_(this);
                this._#_expr_PrefixRules__[prevLength + 4] = new CalcParser.GrammarImpl._#prefix#__seq_(this);
                ExtensionPostfixBase<ExprAst>[] e2 = this._#_expr_PostfixRules_;
                int result2 = 0;
                if (e2 != null)
                {
                    result2 = e2.Length;
                }
                prevLength = result2;
                Array.Resize<ExtensionPostfixBase<ExprAst>>(ref this._#_expr_PostfixRules_, prevLength + 7);
                this._#_expr_PostfixRules_[prevLength + 0] = new CalcParser.GrammarImpl._#postfix#_add_(this);
                this._#_expr_PostfixRules_[prevLength + 1] = new CalcParser.GrammarImpl._#postfix#_div_(this);
                this._#_expr_PostfixRules_[prevLength + 2] = new CalcParser.GrammarImpl._#postfix#_mod_(this);
                this._#_expr_PostfixRules_[prevLength + 3] = new CalcParser.GrammarImpl._#postfix#_mul_(this);
                this._#_expr_PostfixRules_[prevLength + 4] = new CalcParser.GrammarImpl._#postfix#_postfixDec_(this);
                this._#_expr_PostfixRules_[prevLength + 5] = new CalcParser.GrammarImpl._#postfix#_pow_(this);
                this._#_expr_PostfixRules_[prevLength + 6] = new CalcParser.GrammarImpl._#postfix#_sub_(this);
            }
        }
        private void ResetMemoization()
        {
            this._#_start_StartPos____ = -1;
            this._#_start_Result______ = null;
            this._#_start_EndPos______ = -1;
            this._#_expr_StartPos_____ = -1;
            this._#_expr_BindingPower_ = -1;
            this._#_expr_Result_______ = null;
            this._#_expr_EndPos_______ = -1;
            this._#_expr_PrefixResult_ = null;
            this._#_expr_PrefixEndPos_ = -1;
        }
        public int _#_expr_(int pos, string text, int bindingPower)
        {
            ExprAst result = null;
            return this._#_expr_(pos, text, bindingPower, ref result);
        }
        public int _#_expr_(int pos, string text, int bindingPower, ref ExprAst curResult)
        {
            int _N_return = 0;
            int[] bestOffsets = new int[32];
            int curEndPos = -1;
            ExprAst newResult = null;
            if (this._#_expr_StartPos_____ == pos)
            {
                if (this._#_expr_EndPos_______ < 0)
                {
                    _N_return = -1;
                    return _N_return;
                }
                if (this._#_expr_BindingPower_ == bindingPower)
                {
                    curResult = this._#_expr_Result_______;
                    _N_return = this._#_expr_EndPos_______;
                    return _N_return;
                }
                this._#_expr_BindingPower_ = bindingPower;
                this._#_expr_EndPos_______ = -1;
                curResult = this._#_expr_PrefixResult_;
                curEndPos = this._#_expr_PrefixEndPos_;
            }
            else
            {
                this._#_expr_BindingPower_ = bindingPower;
                this._#_expr_StartPos_____ = pos;
                this._#_expr_PrefixEndPos_ = -1;
                this._#_expr_EndPos_______ = -1;
                int i = 0;
                while (i < bestOffsets.Length && bestOffsets[i] >= 0)
                {
                    bestOffsets[i] = -1;
                    i++;
                }
                if (pos < text.Length)
                {
                    char c = text[pos];
                    ExtensionPrefixBase<ExprAst>[] #_expr_PrefixRules__ = this._#_expr_PrefixRules__;
                    for (int k = 0; k < #_expr_PrefixRules__.Length; k++)
                    {
                        ExtensionPrefixBase<ExprAst> extensionPrefixBase = #_expr_PrefixRules__[k];
                        ExtensionPrefixBase<ExprAst> prefixRule = (ExtensionPrefixBase<ExprAst>)extensionPrefixBase;
                        if (prefixRule.LowerBound <= c && c <= prefixRule.UpperBound)
                        {
                            int newEndPos = prefixRule.Parse(pos, text, bestOffsets, ref newResult);
                            if (newEndPos > 0)
                            {
                                curResult = newResult;
                                curEndPos = newEndPos;
                            }
                        }
                    }
                }
                else
                {
                    ExtensionPrefixBase<ExprAst>[] #_expr_PrefixRules__2 = this._#_expr_PrefixRules__;
                    for (int l = 0; l < #_expr_PrefixRules__2.Length; l++)
                    {
                        ExtensionPrefixBase<ExprAst> extensionPrefixBase2 = #_expr_PrefixRules__2[l];
                        ExtensionPrefixBase<ExprAst> prefixRule2 = (ExtensionPrefixBase<ExprAst>)extensionPrefixBase2;
                        int newEndPos = prefixRule2.Parse(pos, text, bestOffsets, ref newResult);
                        if (newEndPos > 0)
                        {
                            curResult = newResult;
                            curEndPos = newEndPos;
                        }
                    }
                }
            }
            if (curEndPos >= 0)
            {
                ExprAst prefixResult = curResult;
                int prefixEndPos = curEndPos;
                ExprAst bestResult = curResult;
                int bestEndPos = curEndPos;
                while (curEndPos < text.Length)
                {
                    int j = 0;
                    while (j < bestOffsets.Length && bestOffsets[j] >= 0)
                    {
                        bestOffsets[j] = -1;
                        j++;
                    }
                    char c = text[curEndPos];
                    ExtensionPostfixBase<ExprAst>[] #_expr_PostfixRules_ = this._#_expr_PostfixRules_;
                    for (int m = 0; m < #_expr_PostfixRules_.Length; m++)
                    {
                        ExtensionPostfixBase<ExprAst> extensionPostfixBase = #_expr_PostfixRules_[m];
                        ExtensionPostfixBase<ExprAst> postfixRule = (ExtensionPostfixBase<ExprAst>)extensionPostfixBase;
                        if (postfixRule.LowerBound <= c && c <= postfixRule.UpperBound && bindingPower < postfixRule.BindingPower)
                        {
                            newResult = curResult;
                            int newEndPos = postfixRule.Parse(pos, curEndPos, text, bestOffsets, ref newResult);
                            if (newEndPos > 0)
                            {
                                bestEndPos = newEndPos;
                                bestResult = newResult;
                            }
                        }
                    }
                    if (bestEndPos == curEndPos)
                    {
                        IL_3A8:
                        this._#_expr_BindingPower_ = bindingPower;
                        this._#_expr_StartPos_____ = pos;
                        this._#_expr_PrefixResult_ = prefixResult;
                        this._#_expr_PrefixEndPos_ = prefixEndPos;
                        this._#_expr_Result_______ = curResult;
                        this._#_expr_EndPos_______ = curEndPos;
                        _N_return = curEndPos;
                        return _N_return;
                    }
                    curResult = bestResult;
                    curEndPos = bestEndPos;
                }
                goto IL_3A8;
            }
            _N_return = -1;
            return _N_return;
        }
        public int _#_any_(int pos, string text)
        {
            return (pos >= text.Length) ? -1 : (pos + 1);
        }
        public int _#_start_(int pos, string text, ref ExprAst result)
        {
            ExprAst token_ = null;
            int arg_1BA_0;
            if (this._#_start_StartPos____ == pos)
            {
                if (this._#_start_EndPos______ >= 0)
                {
                    result = this._#_start_Result______;
                }
                arg_1BA_0 = this._#_start_EndPos______;
            }
            else
            {
                int pos2 = this._#_s_(pos, text);
                int arg_12C_0;
                if (pos2 >= 0)
                {
                    int pos3 = this._#_expr_(pos2, text, 0, ref token_);
                    if (pos3 >= 0)
                    {
                        int newPos = this._#_any_(pos3, text);
                        int pos4 = (newPos >= 0) ? -1 : pos3;
                        arg_12C_0 = ((pos4 < 0) ? -1 : pos4);
                    }
                    else
                    {
                        arg_12C_0 = -1;
                    }
                }
                else
                {
                    arg_12C_0 = -1;
                }
                int newPos2 = arg_12C_0;
                this._#_start_StartPos____ = pos;
                this._#_start_EndPos______ = newPos2;
                if (newPos2 >= 0)
                {
                    result = token_;
                    result.Location = new Location(this._parsingSource, token_.StartPos, token_.EndPos);
                    this._#_start_Result______ = result;
                }
                else
                {
                    if (this._parsingErrors._#_start_ < pos)
                    {
                        this._parsingErrors._#_start_ = pos;
                    }
                }
                arg_1BA_0 = newPos2;
            }
            return arg_1BA_0;
        }
        public int _#_s_(int pos, string text)
        {
            int num = pos;
            while (true)
            {
                int arg_6A_0;
                if (num < text.Length)
                {
                    char c = text[num];
                    arg_6A_0 = ((c != ' ') ? -1 : (num + 1));
                }
                else
                {
                    arg_6A_0 = -1;
                }
                int newPos = arg_6A_0;
                if (newPos < 0)
                {
                    break;
                }
                num = newPos;
            }
            return num;
        }
        static GrammarImpl()
        {
            CalcParser.GrammarImpl._descriptor = new CalcParser.GrammarImpl.GrammarDescriptorImpl();
        }
        public GrammarImpl()
        {
        }
        public GrammarImpl(Parser parser)
        {
            if (parser == null)
            {
                throw new ArgumentNullException("parser", "The ``NotNull'' contract of parameter ``parser'' has been violated. See Main.n:17:2:49:2: .");
            }
            this.Parser = parser;
        }
        public override Nemerle.Builtins.Tuple<int, ExprAst> TryParseExpr(SourceSnapshot source)
        {
            checked
            {
                if (source == null)
                {
                    throw new ArgumentNullException("source", "The ``NotNull'' contract of parameter ``source'' has been violated. See Main.n:17:2:49:2: .");
                }
                this.ResetMemoization();
                this.Parser = new Parser(this, source);
                GrammarDescriptor[] dependencies = this.Descriptor.Dependencies;
                for (int i = 0; i < dependencies.Length; i++)
                {
                    GrammarDescriptor grammarDescriptor = dependencies[i];
                    GrammarDescriptor descriptor = grammarDescriptor;
                    this.Parser.AddGrammar(descriptor);
                }
                this.Init();
                ExprAst result = null;
                int pos = this._#_expr_(0, this._parsingSource.Text, 0, ref result);
                return new Nemerle.Builtins.Tuple<int, ExprAst>(pos, result);
            }
        }
        public override Nemerle.Builtins.Tuple<int, ExprAst> TryParseStart(SourceSnapshot source)
        {
            checked
            {
                if (source == null)
                {
                    throw new ArgumentNullException("source", "The ``NotNull'' contract of parameter ``source'' has been violated. See Main.n:17:2:49:2: .");
                }
                this.ResetMemoization();
                this.Parser = new Parser(this, source);
                GrammarDescriptor[] dependencies = this.Descriptor.Dependencies;
                for (int i = 0; i < dependencies.Length; i++)
                {
                    GrammarDescriptor grammarDescriptor = dependencies[i];
                    GrammarDescriptor descriptor = grammarDescriptor;
                    this.Parser.AddGrammar(descriptor);
                }
                this.Init();
                ExprAst result = null;
                int pos = this._#_start_(0, this._parsingSource.Text, ref result);
                return new Nemerle.Builtins.Tuple<int, ExprAst>(pos, result);
            }
        }
    }
    [Variant("CalcParser.Expr.Sub,CalcParser.Expr.Seq,CalcParser.Expr.Rounds,CalcParser.Expr.PrefixDec,CalcParser.Expr.Pow,CalcParser.Expr.PostfixDec,CalcParser.Expr.Num,CalcParser.Expr.Neg,CalcParser.Expr.Mul,CalcParser.Expr.Mod,CalcParser.Expr.Div,CalcParser.Expr.Add")]
    public abstract class Expr : ExprAst
    {
        [VariantOption]
        public class Add : CalcParser.Expr
        {
            public readonly ExprAst l;
            public readonly NToken op;
            public readonly ExprAst r;
            public override int _N_GetVariantCode()
            {
                return 0;
            }
            public Add()
            {
            }
            public Add(ExprAst l, NToken op, ExprAst r)
            {
                this.l = l;
                this.op = op;
                this.r = r;
            }
        }
        [VariantOption]
        public class Div : CalcParser.Expr
        {
            public readonly ExprAst l;
            public readonly NToken op;
            public readonly ExprAst r;
            public override int _N_GetVariantCode()
            {
                return 1;
            }
            public Div()
            {
            }
            public Div(ExprAst l, NToken op, ExprAst r)
            {
                this.l = l;
                this.op = op;
                this.r = r;
            }
        }
        [VariantOption]
        public class Mod : CalcParser.Expr
        {
            public readonly ExprAst l;
            public readonly NToken op;
            public readonly ExprAst r;
            public override int _N_GetVariantCode()
            {
                return 2;
            }
            public Mod()
            {
            }
            public Mod(ExprAst l, NToken op, ExprAst r)
            {
                this.l = l;
                this.op = op;
                this.r = r;
            }
        }
        [VariantOption]
        public class Mul : CalcParser.Expr
        {
            public readonly ExprAst l;
            public readonly NToken op;
            public readonly ExprAst r;
            public override int _N_GetVariantCode()
            {
                return 3;
            }
            public Mul()
            {
            }
            public Mul(ExprAst l, NToken op, ExprAst r)
            {
                this.l = l;
                this.op = op;
                this.r = r;
            }
        }
        [VariantOption]
        public class Neg : CalcParser.Expr
        {
            public readonly NToken op;
            public readonly ExprAst expr;
            public override int _N_GetVariantCode()
            {
                return 4;
            }
            public Neg()
            {
            }
            public Neg(NToken op, ExprAst expr)
            {
                this.op = op;
                this.expr = expr;
            }
        }
        [VariantOption]
        public class Num : CalcParser.Expr
        {
            public readonly string num;
            public override int _N_GetVariantCode()
            {
                return 5;
            }
            public Num()
            {
            }
            public Num(string num)
            {
                this.num = num;
            }
        }
        [VariantOption]
        public class PostfixDec : CalcParser.Expr
        {
            public readonly ExprAst expr;
            public readonly NToken op;
            public override int _N_GetVariantCode()
            {
                return 6;
            }
            public PostfixDec()
            {
            }
            public PostfixDec(ExprAst expr, NToken op)
            {
                this.expr = expr;
                this.op = op;
            }
        }
        [VariantOption]
        public class Pow : CalcParser.Expr
        {
            public readonly ExprAst l;
            public readonly NToken op;
            public readonly ExprAst r;
            public override int _N_GetVariantCode()
            {
                return 7;
            }
            public Pow()
            {
            }
            public Pow(ExprAst l, NToken op, ExprAst r)
            {
                this.l = l;
                this.op = op;
                this.r = r;
            }
        }
        [VariantOption]
        public class PrefixDec : CalcParser.Expr
        {
            public readonly NToken op;
            public readonly ExprAst expr;
            public override int _N_GetVariantCode()
            {
                return 8;
            }
            public PrefixDec()
            {
            }
            public PrefixDec(NToken op, ExprAst expr)
            {
                this.op = op;
                this.expr = expr;
            }
        }
        [VariantOption]
        public class Rounds : CalcParser.Expr
        {
            public readonly NToken l;
            public readonly ExprAst expr;
            public readonly NToken r;
            public override int _N_GetVariantCode()
            {
                return 9;
            }
            public Rounds()
            {
            }
            public Rounds(NToken l, ExprAst expr, NToken r)
            {
                this.l = l;
                this.expr = expr;
                this.r = r;
            }
        }
        [VariantOption]
        public class Seq : CalcParser.Expr
        {
            public readonly NToken l;
            public readonly list<ExprAst> expr;
            public readonly NToken r;
            public override int _N_GetVariantCode()
            {
                return 10;
            }
            public Seq()
            {
            }
            public Seq(NToken l, list<ExprAst> expr, NToken r)
            {
                this.l = l;
                this.expr = expr;
                this.r = r;
            }
        }
        [VariantOption]
        public class Sub : CalcParser.Expr
        {
            public readonly ExprAst l;
            public readonly NToken op;
            public readonly ExprAst r;
            public override int _N_GetVariantCode()
            {
                return 11;
            }
            public Sub()
            {
            }
            public Sub(ExprAst l, NToken op, ExprAst r)
            {
                this.l = l;
                this.op = op;
                this.r = r;
            }
        }
        public abstract override int _N_GetVariantCode();
        public static int _N_GetVariantCodeSafe(CalcParser.Expr x)
        {
            return ((object)x != null) ? x._N_GetVariantCode() : -1;
        }
        public static int _N_GetVariantCodeObject(object x)
        {
            int arg_1E_0;
            if (x is CalcParser.Expr)
            {
                CalcParser.Expr expr = (CalcParser.Expr)x;
                arg_1E_0 = expr._N_GetVariantCode();
            }
            else
            {
                arg_1E_0 = -1;
            }
            return arg_1E_0;
        }
    }
    private SourceSnapshot _parsingSource;
    public abstract override Parser Parser
    {
        get;
    }
    public SourceSnapshot ParsingSource
    {
        get
        {
            return this._parsingSource;
        }
    }
    public string GetText(NToken tok)
    {
        return this._parsingSource.OriginalText.Substring(tok.StartPos, checked(tok.EndPos - tok.StartPos));
    }
    public Location GetLocation(NToken tok)
    {
        return new Location(this._parsingSource, tok.StartPos, tok.EndPos);
    }
    public option<ExprAst> ParseExpr(string text)
    {
        Nemerle.Builtins.Tuple<int, ExprAst> _N_cache_5180 = this.TryParseExpr(text);
        int pos = _N_cache_5180.Field0;
        ExprAst res = _N_cache_5180.Field1;
        return (pos >= 0) ? new option<ExprAst>.Some(res) : option<ExprAst>.None._N_constant_object;
    }
    public option<ExprAst> ParseExpr(SourceSnapshot source)
    {
        Nemerle.Builtins.Tuple<int, ExprAst> _N_cache_5193 = this.TryParseExpr(source);
        int pos = _N_cache_5193.Field0;
        ExprAst res = _N_cache_5193.Field1;
        return (pos >= 0) ? new option<ExprAst>.Some(res) : option<ExprAst>.None._N_constant_object;
    }
    public Nemerle.Builtins.Tuple<int, ExprAst> TryParseExpr(string text)
    {
        return this.TryParseExpr(new SourceSnapshot(text, 0, ""));
    }
    public abstract override Nemerle.Builtins.Tuple<int, ExprAst> TryParseExpr(SourceSnapshot source);
    public option<ExprAst> ParseStart(string text)
    {
        Nemerle.Builtins.Tuple<int, ExprAst> _N_cache_5210 = this.TryParseStart(text);
        int pos = _N_cache_5210.Field0;
        ExprAst res = _N_cache_5210.Field1;
        return (pos >= 0) ? new option<ExprAst>.Some(res) : option<ExprAst>.None._N_constant_object;
    }
    public option<ExprAst> ParseStart(SourceSnapshot source)
    {
        Nemerle.Builtins.Tuple<int, ExprAst> _N_cache_5223 = this.TryParseStart(source);
        int pos = _N_cache_5223.Field0;
        ExprAst res = _N_cache_5223.Field1;
        return (pos >= 0) ? new option<ExprAst>.Some(res) : option<ExprAst>.None._N_constant_object;
    }
    public Nemerle.Builtins.Tuple<int, ExprAst> TryParseStart(string text)
    {
        return this.TryParseStart(new SourceSnapshot(text, 0, ""));
    }
    public abstract override Nemerle.Builtins.Tuple<int, ExprAst> TryParseStart(SourceSnapshot source);
}


ME>без тормозов -- надо подумать, но сейчас лень

ME>с чуть худшим синтаксисом -- перетащив его в треугольные скобки -- без тормозов
Кода у тебя будет минимум раз в 5 больше. И только для базового функционала.
Как на шаблонах делать восстановление после ошибок я вообще не представляю.
ЗЫ Я сам мастер шаблонов.
Автор: WolfHound
Дата: 06.02.12

Так что знаю о чем гворю.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[16]: Тюринг-полные ли шаблоны C++?
От: WolfHound  
Дата: 10.02.12 10:00
Оценка:
Здравствуйте, m e, Вы писали:

ME>насчет модели (в прошлом посте) -- скажем по 2-3 строчки про остальные 10 не столь распостраненных способов

ME>(+ примерчик), и мне уже че-то будет ясно

ME>или такой текст уже есть? тогда ссылку

http://rsdn.ru/summary/3766.xml
Смотри "Макросы Nemerle – расширенный курс" в 4х частях.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[13]: Тюринг-полные ли шаблоны C++?
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.02.12 12:40
Оценка:
Здравствуйте, WolfHound, Вы писали:

ME>>ладно, я предлагаю компромисс: я соглашаюсь на "сферическое в вакууме" и не доказываю, что оно нужно, а вы с владом рассказываете, *что* приводит к трудностям реализовать это на немерле

WH>Реализовать можно. Но будет много букв.

Да не будет много букв. Просто нужна конкретная постановка задачи.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: Тюринг-полные ли шаблоны C++?
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.02.12 13:45
Оценка:
Здравствуйте, m e, Вы писали:

WH>>Ты попробуй найти класс по имени и туда что-то добавить.

WH>>Не можешь?

ME>навскидку не помню, можно ли перегрузить оператор -> снаружи класса


Что-то связи не улавливаю.

>> Макросы Record, StructuralEquality, StructuralHashCode сразу получают TypeBuilder NToken'а. После чего достают из него поля. И генерируют на их основе нужные методы.


ME>1. тут идет дописывание, а не постройка с 0


Ты хотел поле добавить на основании наличия другого поля. Тут добавляются методы с реализацией на основании полей и прочей информации. Что не так то?

С нуля это тоже пожалуйста. Это даже проще, чем дописывать.

ME>2. про это я уже писал -- шаблоны, несмотря на тьюринг-полноту, просто не могут получить нужные данные


Они ни смотр на свою тьюринг-полноту вообще мало чего могут. А то что выходит выходит таким раком и с таким гемороем, что это уже не программирование, а мазохизм получается.

WH>>Ну попробуй на плюсах повторить вот это: https://github.com/rampelstinskin/ParserGenerator


ME>"это" это https://github.com/rampelstinskin/ParserGenerator/blob/master/Test/Main.n ?


ME>ты давай опять словами, а то идея по коду не полностью восстанавливается

ME>то, что я восстановил -- с точностью до тормозов лишнего виртуального вызова функции -- без проблем
ME>без тормозов -- надо подумать, но сейчас лень

Я плякаль (с). Ты бы лучше попробовал разобраться, прежде чем нести такую фееричную фигню.
В общем, у меня складывается впечатление, что ты пришел просто потроллить.

Перенести на С++ его практически невозможно. Как минимум не выйдет сформировать человеческие сообщения об ошибках. Да и сгенерировать кучу сложных преобразований и оптимизаций на С++ будет практически нереально.

Если ты сравниваешь этот парсер со Спиритомт, то я тебя разочарую. Спирит — это детсадовская поделка. И я не преувеличиваю. Основные фишки этого генератора:
1. Динамическая расширяемость грамматик. Вот пример динамической загрузки расширяющих грамматик:
Основной парсер.
Расширяющий парсер.
Вот здесь, в правиле обработчике директивы using, происходит подгрузка грамматики из внешней сборки. Сами сборки грузятся в статическом конструкторе (выше).

2. Полная декларативность. Генератор генерирует не только код распознавателя, но и AST. Делается это заданием атрибута Ast() содержащего имена полей для новой ветки AST. При этом, естественно, проверяется их количество и количество подправил. Если что выдается осмоленные сообщение об ошибке. Если тип описывающий AST уже описан пользователем с модификатором partial, то типы сливаются. Так к сгенерированному AST можно добавить рукописные члены.

3. Поддержка левой рекурсии.

4. Поддержка разбора операторных грамматик с приоритетом и ассоциативностью задаваемых в виде силы связывания для выражений.

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

В отличии от Спирита данный генератор парсеров позволяет создавать парсеры для реальных языков прогкраммирования (а не только для мелких игрушек).

Что касается скорости парсинга, то мы надеемся она будет очень высокой. Причем сравнивать мы будем не с другими генераторами парсеров, а с рукописными парсерами обычно применяемыми сейчас на практике для разбора сложных языков. Прошлая версия нашего генератора порождала код который был быстрее чем многие качественные рукописные парсеры. Эта должна быть не хуже. Сейчас в ней еще не сделаны все запланированные оптимизации. Но даже сейчас их список не мал. Тут и переписывание в ДКА, и мемоизация результата разбора правил с целью исключения экспоненциального роста повторов разбора правил и многое другое.

ME>с чуть худшим синтаксисом -- перетащив его в треугольные скобки -- без тормозов


С чуть худшим? Это не то ли убожество что Спиритом завется является "чуть худшим синтаксисом"?

Без тормозов?!
http://habrahabr.ru/blogs/cpp/81175/

Код на Spirit медленно компилируется. Действительно медленно. Ни gcc, ни cl (Visual Studio 2008) не справились с компиляцией полной грамматики С++, состоящей из 180 правил, выпав с “out of heap”.


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

Если бы Вольфхаунд считал бы, что аналог его парсера можно было бы сделать на С++, то зачем бы ему вообще было связываться с Немерлом?

Короче, для меня твои слова выглядят как толстый троллинг. Если в твои задачи не входит любой ценой доказать преимущества (которых явно нет) С++, то советую разобраться в вопросе по глубже. Причем не в теории, а на практике. Как только ты это сделаешь, то все вопросы отпадут сами собой.

Кстати, как показывает практика, именно из С++-ников получаются отличные немерлисты . Так что если ты пришел разобраться, то милость просим в наше братство. Мы тебе поможем и ты сможешь по достоинству оценить технологию.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: Тюринг-полные ли шаблоны C++?
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.02.12 14:28
Оценка:
Здравствуйте, m e, Вы писали:

ME>более фундаментальная и полезная вещь -- это добавление в "рядом лежащий" класс, примерно как у тебя в примере StructuralEquality; но при этом надо уметь *читать* другие классы просто по имени


Ты мыслишь со свей колокольни. Как тебе уже неоднократно сказали, если у тебя есть полное имя класса, то получить по нему TypeBuilder, через который можно как угодно изменять тип не проблема. Делается это элементарно typer.BindType(имя_типа). Далее дело техники.

Вопрос в том зачем нужно искать что-то по имени?

Лучше описал бы реальную проблему (задачу), а не твои потуги ее решить в убогом С++. Мы бы тебе не просто подсказали, а показали бы реальное решение.

ME>читать вдалеке куда важнее, чем писать вдалеке; вообще даже писать вдалеке -- это хулиганство какое-то (за некоторыми исключениями)


В Н нет разницы читать или писать. Весь доступ к информации о типах делается через класс TypeInfo. Класс TypeBuilder является его наследником и дополняет его методами позволяющими добавлять и изменять тип. При этом нет разницы в каких файлах и в скольких файлах лежат реальные типы. Ограничение только одно — изменяемый тип должен быть распарсен из исходников или сформирован макросом (т.е. не быть из внешней сборки).

ME>а как в немерле решалась проблема кольцевых зависимостей, если там и правда можно читать из далекого класса? (т.е. у нас кто-то издалека пытался прочесть но не прочел -- нет у нас такого, потом мы такого сгенерили, потом полезли читать у того дальнего класса, а у него нет, так как он не прочел у нас)


Такой проблемы нет, так как любое изменение делается в TypeBuilder-е описывающем конкретный тип. Если кто-то туда что-то добавил, то тот кто будет читать после увидит эти изменения.

ME>или она вообще не ставилась?


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

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

В Н2 мы планируем вместо стадий ввести реактивную модель. В ней вместо модели "прочел, проанализировал, сгенерировал", будет модель "подписался, получил уведомление, проанализировал, сгенерировал". В ней изменения будут вызвать перегенерацию автоматически.

ME>или модель затачивалась на "пишем куда угодно, читаем локально"?


В Н1 модель полностью императивная. Пишем и читаем что хотим.

ME>вообще, жду рассказа про модель примерно такими словами, как я только что написал -- что макросы умеют, что неумеют, что не рассматривалось -- потому что то, что я читал, это какая-то конкретика, которая без общего взгляда мне совершенно не понятна


Ты лучше не жди чудесного объяснения. Мы все равно будем говорить на разных языках, так как исходим из разных отправных знаний. Лучше просто изучи основы и попробуй сам писать макросы. Лучше всего сделать это на базе некоторой, интересной тебе, задачи. Это даст тебе полное представление.

ME>а да -- еще желательно кинуть ссылку на списочек макросов "как называется, че делает"


http://nemerle.org/wiki/Accessor_macros (сбоку список макросов). Список, к сожалению, не полный. Но для начала хватит.
Но начинать лучше с прочтения статей. Благо их на русском до фига. Можно прочесть Язык Немерле:
Часть 1
Автор(ы): Владислав Юрьевич Чистяков
Дата: 24.09.2009
Эта статья открывает цикл статей, посвященных обучению языку программирования Nemerle. Имеющиеся статьи об этом языке предполагают, что программист хорошо знаком с Microsoft .NET Framework и языком программирования C#. Данный же цикл статей, напротив, рассчитан на людей, не знакомых ни с тем, ни с другим, и может быть даже применен для изучения программирования как такового. Новичкам в программировании может потребоваться помощь людей, уже знающих программирование.

Часть 2
Автор(ы): Чистяков Владислав Юрьевич
Дата: 30.06.2010
Неформальное введение в язык программирования Nemerle. В этой части, на базе примера «калькулятор», описываются типы данных variant и class.

Часть 3
Автор(ы): Чистяков Владислав Юрьевич
Дата: 25.07.2010
Неформальное введение в язык программирования Nemerle. В этой части, на базе примера «калькулятор», описываются типы данных variant и class.

Часть 5
Автор(ы): Чистяков Владислав Юрьевич
Дата: 22.09.2011
Данная часть посвящена макросам Nemerle.

Эта работа не закончена, но зато наиболее полная и последовательная.

ME>и еще вопрос -- а макросы умеют принимать в качестве аргумента название класса, или его поля?


Да. Макрос может принимать в качестве аргумента любое выражение. А уже выражение может быть интерпретировано как имя класса или поля.

ME>с проверкой на наличие?


Да. Только проверку придется делать самостоятельно.

ME> а если этого поля пока что нет, и оно будет дописано другим макросом?


То твой макрос его не увидит.

ME>например так:

ME>
ME>  [StructuralEquality<exclude<StartPos>>, StructuralHashCode]
ME>  public struct NToken
ME>  {
ME>    public StartPos : int { get; }
ME>    public EndPos   : int { get; }
ME>


Не понял причем тут этот пример, но именно это макрос StructuralEquality. Только синтаксис другой. В Н параметры типов через [] задаюттся. А аргументы макросов просто в круглых скобках.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[17]: Тюринг-полные ли шаблоны C++?
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.02.12 14:31
Оценка:
Здравствуйте, WolfHound, Вы писали:

ME>>или такой текст уже есть? тогда ссылку

WH>http://rsdn.ru/summary/3766.xml
WH>Смотри "Макросы Nemerle – расширенный курс" в 4х частях.

Вот это совершенно не разумня ссылка. Это материал для тех кто уже знает что такое макросы и хочет погрузиться по глубже.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Тюринг-полные ли шаблоны C++?
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.02.12 14:35
Оценка:
Здравствуйте, m e, Вы писали:

ME>
ME>class T {
ME>  int a;
ME>  int b;
ME>  int c;
ME>  static if( hasMember!(Х, "y") ) {
ME>    int z;
ME>  }
ME>}
ME>


А можно пояснить какой смысл в этой действии? Ведь результат будет всегда один и тот же, так как поле или будет, или не будет. Какая-то условная компиляция получается. На фиг такое нужно на практике?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Тюринг-полные ли шаблоны C++?
От: FR  
Дата: 10.02.12 14:44
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>А можно пояснить какой смысл в этой действии? Ведь результат будет всегда один и тот же, так как поле или будет, или не будет. Какая-то условная компиляция получается. На фиг такое нужно на практике?


В шаблонах вполне осмысленно, конечно если тип X обобщенный.
Re[9]: Тюринг-полные ли шаблоны C++?
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.02.12 14:46
Оценка: +1
Здравствуйте, FR, Вы писали:

FR>В шаблонах вполне осмысленно, конечно если тип X обобщенный.


Если он обобщенный, то проверять ты будешь не левых тип Х который по имени будешь искать, а параметр типов.
Меня интересует смысл именно этого кода. Я его не могу уловить.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Тюринг-полные ли шаблоны C++?
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.02.12 15:04
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Напомню, что BindFixedType имеет тип PExpr -> FixedType.


Это мелкие детали. В макрос тоже обычно не строки передаются. В прочем строку в PExpr тоже не долго превратить. Так что написать для себя (если очень нужно) вариант принимающих строку — это не проблема.

FixedType в FixedType.Class тоже не сложно превратить. Можно фатальную ошибку выдавать, если это не пользовательский тип.

WH>И у FixedType нет метода GetFields.


А если так:
fixedType.TipeInfo?.GetFields() ?? []

?

WH>Перегрузки, которая принимают строку у BindFixedType тоже нет.


См. выше.

WH>С типами из текущей сборки (TypeBuilder) и теми которые лежат во внешних сборках (LibraryReference.ExternalTypeInfo) нужно обращаться по-разному.


Зачем? Не надо. Всю информацию можно получить через TypeInfo. Приведение к TypeBuilder потребуется только, если захочешь изменить тип. Но оно и разумно.

WH>Короче мороки много.


Нет тут особой мороки. Не выдумывай. Максимум пару функций-помощников придется написать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: Тюринг-полные ли шаблоны C++?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 10.02.12 16:07
Оценка:
ME>или она вообще не ставилась?
ME>или модель затачивалась на "пишем куда угодно, читаем локально"?

на сколько я понимаю, такой уровень постановки вообще не рассматривался.

задача ставилась как: давайте сделаем так, чтобы на уровне компиляции можно было выполнять произвольный набор преобразований:
Ast -> код1 -> Ast
Ast -> код2 -> Ast
Ast -> код3 -> Ast
и т.д.

при этом никаких ограничений ни на порядок вызова код1, код2, код3 и т.д., ни на "масштаб" ast-а, ни на набор использованных инструкций в ast-е не накладывается, а процветает сплошная анархия.
Re[11]: [почти offtop]
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.02.12 16:30
Оценка: -1
Здравствуйте, Lloyd, Вы писали:

L>К переходу на личности замечание имеет самое прямое отношение, ибо аппелирует не к предмету обсуждения, а к личности собеседника, выставляя ее (личность) в негативном свете.


Оно не апеллирует, а просто замечает, что ответ твой не по дулу. Ну, а то, что ты считаешь плохим делом докапывание к словам — это хорошо. Может в следующий раз подумаешь надо ли давать совершенно бессмысленные комментарии. Ведь и без тебя все все поняли.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Тюринг-полные ли шаблоны C++?
От: WolfHound  
Дата: 10.02.12 19:38
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>А если так:

VD>
VD>fixedType.TipeInfo?.GetFields() ?? []
VD>

VD>?
Ух ты костыль какой.

VD>Зачем? Не надо. Всю информацию можно получить через TypeInfo. Приведение к TypeBuilder потребуется только, если захочешь изменить тип. Но оно и разумно.

То-то мне пришлось огород городить...
https://github.com/rampelstinskin/ParserGenerator/blob/master/Nemerle.Parser.Macro/Compiler/GrammarCompiler/Typing/LoadExternalGrammars.n
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[14]: Тюринг-полные ли шаблоны C++?
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.02.12 20:11
Оценка:
Здравствуйте, WolfHound, Вы писали:

VD>>А если так:

VD>>
VD>>fixedType.TypeInfo?.GetFields() ?? []
VD>>

VD>>?
WH>Ух ты костыль какой.

Какой на фиг костыль?

VD>>Зачем? Не надо. Всю информацию можно получить через TypeInfo. Приведение к TypeBuilder потребуется только, если захочешь изменить тип. Но оно и разумно.

WH>То-то мне пришлось огород городить...
WH>https://github.com/rampelstinskin/ParserGenerator/blob/master/Nemerle.Parser.Macro/Compiler/GrammarCompiler/Typing/LoadExternalGrammars.n

Это не только огород, но еще и потенциально опасный код. Когда будем переходить на бэкэнды ExternalTypeInfo из пользовательского кода доступен не будет. Так что советую тебе пока не поздно перенести функцию в компилятор (где ей самое место). И возвращать он должен TypeInfo, а не ExternalTypeInfo.

Ну, а к поиску типов по имена этот код не имеет отношения.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: [почти offtop]
От: Lloyd Россия  
Дата: 10.02.12 21:29
Оценка: :)
Здравствуйте, VladD2, Вы писали:

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


L>>К переходу на личности замечание имеет самое прямое отношение, ибо аппелирует не к предмету обсуждения, а к личности собеседника, выставляя ее (личность) в негативном свете.


VD>Оно не апеллирует, а просто замечает, что ответ твой не по дулу. Ну, а то, что ты считаешь плохим делом докапывание к словам — это хорошо. Может в следующий раз подумаешь надо ли давать совершенно бессмысленные комментарии. Ведь и без тебя все все поняли.


это ж надо сколько раз ты в одном посте соврал. Ты открываешь новые горизонты:
1. Твой ответ именно что аппелирует к личности, причем буквально, даже и "придираться" ни к чему не надо.
2. Твой ответ вообще никак не упоминает мой пост, он — исключительно о моей персоне, а не о том, что там было написано. Это особенно прискорбно наблюдать, учитывая то, что тот пост был исключительно в твою поддержку.
3. К какого докарывания к словам не было. Непрерывность и бесконечность не имеют ничего общего.
4. Бессмысленность комментария существует исключительно в глазах читающего. Если тебе была непонятна разница между непрерывностью и бесконечностью, не стоило вытаякиввть это на публику, я мог бы объяснить разницу и в частной переписке. Ты имел недавно возможность убедиться, что я не против ответить на все твои вопросы.
5. Фразу "все и без тебя" хорошобы подкреплять ссылками и объяснениями кто именно и что именно понял. А то выглядит как какая-то несуоазица.
Re[13]: [почти offtop]
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.02.12 21:57
Оценка: -1
Здравствуйте, Lloyd, Вы писали:

L>это ж надо сколько раз ты в одном посте соврал. Ты открываешь новые горизонты:

L>1. Твой ответ именно что аппелирует к личности, причем буквально, даже и "придираться" ни к чему не надо.
L>2. Твой ответ вообще никак не упоминает мой пост, он — исключительно о моей персоне, а не о том, что там было написано. Это особенно прискорбно наблюдать, учитывая то, что тот пост был исключительно в твою поддержку.
L>3. К какого докарывания к словам не было. Непрерывность и бесконечность не имеют ничего общего.
L>4. Бессмысленность комментария существует исключительно в глазах читающего. Если тебе была непонятна разница между непрерывностью и бесконечностью, не стоило вытаякиввть это на публику, я мог бы объяснить разницу и в частной переписке. Ты имел недавно возможность убедиться, что я не против ответить на все твои вопросы.
L>5. Фразу "все и без тебя" хорошобы подкреплять ссылками и объяснениями кто именно и что именно понял. А то выглядит как какая-то несуоазица.

Ты маньяк .
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: [почти offtop]
От: Lloyd Россия  
Дата: 11.02.12 14:06
Оценка: :)
Здравствуйте, VladD2, Вы писали:

VD>Ты маньяк .


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