Pull to refresh

Comments 12

А чего не стали задействовать Nitra? Народ на этом деле даже HLSL парсит. Описание грамматики для арифметики выглядит примерно так.
Не надо так:
catch (Exception ex)
{
    new InvalidOperationException(ex.Message);
}

Лучше так:
catch (Exception ex)
{
    throw new InvalidOperationException("Ой", ex);
}

Посмотрите на простенький токенайзер который мы используем в своих проектах: github.com/shared-repos/lexer
Уж очень похоже на ваши лексемы :)
Код написан жутко не оптимально. Может он и рабочий, но требует очень сильной переработки и структуризации для понимания.
Например,
return Regex.Replace(Regex.Replace(Regex.Replace(Regex.Replace(src, @"(\(\+)", "("), @"(\A[\+]{1})", ""), @"(\(-)", "(%"), @"(\A[-]{1})", "%");

смотрится жутко. Регексы как минимум должны создаваться один раз и быть прекомпилены в случае многократного использования.
Публичные переменные в рамках класса — тоже не супер. Для этого придумали auto-property.
Размер функции в несколько страниц — плохо. Постарайтесь разбить на осмысленные части.
Поменьше копи-паста кода:
Double b = Convert.ToDouble(stack.Pop().Value);
Double a = Convert.ToDouble(stack.Pop().Value);
<source>
Встречается в почти каждом case.
7-zip архив в хранилище OneDrive… чем не устроил GitHub?
Недавно тоже занимался проектом, связанным с парсингом выражений на C#. Использовал NCalc. Есть и функции и переменные. Приведенные примеры реализуемы на нем без проблем.
Тоже использовали NCalc в своем проекте, в определенный момент столкнулись с проблемой, что в нем использовался тип float, а не double, благо проект с открытым исходным кодом.
Простите, а я не понял что там с заменой унарного плюса и минуса. На что их заменяют и главное зачем?
Унарный плюс просто удаляется за ненадобностью, а унарный минус заменяется на другой символ. т.к. "(операнд)минус(операнд)" и «минус(операнд)» это разные операции и с разными приоритетами.
Забыл уточнить что это необходимо по алгоритму расчета обратной польской нотации.
ИМХО можно было включить обработку унарных плюса и минуса в парсер напрямую. Еще кроме унарных плюса и минуса есть еще унарная битовая инверсия, унарная логическая инверсия… символы которых вполне могут использоваться и как бинарные опрерации.
Унарные и бинарные операции имеют разное число аргументов, поэтому должны нормально различаться парсером без всяких дополнительных действий (по крайней мере для рекурсивного спуска так, думаю что все эти алгоритмы примерно работают схожим образом)
Тоже в свое время создал свой велосипед с АКПП свой проект для разбора математических выражений в .NET. Может почерпнете что-нибудь полезное: MathExpressions.NET. Правда у меня еще есть дифференцирование, упрощение, дроби, компиляция.
Sign up to leave a comment.

Articles