Comments 12
А чего не стали задействовать Nitra? Народ на этом деле даже HLSL парсит. Описание грамматики для арифметики выглядит примерно так.
Не надо так:
Лучше так:
catch (Exception ex)
{
new InvalidOperationException(ex.Message);
}
Лучше так:
catch (Exception ex)
{
throw new InvalidOperationException("Ой", ex);
}
Посмотрите на простенький токенайзер который мы используем в своих проектах: github.com/shared-repos/lexer
Уж очень похоже на ваши лексемы :)
Уж очень похоже на ваши лексемы :)
Код написан жутко не оптимально. Может он и рабочий, но требует очень сильной переработки и структуризации для понимания.
Например,
смотрится жутко. Регексы как минимум должны создаваться один раз и быть прекомпилены в случае многократного использования.
Публичные переменные в рамках класса — тоже не супер. Для этого придумали auto-property.
Размер функции в несколько страниц — плохо. Постарайтесь разбить на осмысленные части.
Поменьше копи-паста кода:
Например,
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?
Простите, а я не понял что там с заменой унарного плюса и минуса. На что их заменяют и главное зачем?
Унарный плюс просто удаляется за ненадобностью, а унарный минус заменяется на другой символ. т.к. "(операнд)минус(операнд)" и «минус(операнд)» это разные операции и с разными приоритетами.
Забыл уточнить что это необходимо по алгоритму расчета обратной польской нотации.
ИМХО можно было включить обработку унарных плюса и минуса в парсер напрямую. Еще кроме унарных плюса и минуса есть еще унарная битовая инверсия, унарная логическая инверсия… символы которых вполне могут использоваться и как бинарные опрерации.
Унарные и бинарные операции имеют разное число аргументов, поэтому должны нормально различаться парсером без всяких дополнительных действий (по крайней мере для рекурсивного спуска так, думаю что все эти алгоритмы примерно работают схожим образом)
Унарные и бинарные операции имеют разное число аргументов, поэтому должны нормально различаться парсером без всяких дополнительных действий (по крайней мере для рекурсивного спуска так, думаю что все эти алгоритмы примерно работают схожим образом)
Тоже в свое время создал свой велосипед с АКПП свой проект для разбора математических выражений в .NET. Может почерпнете что-нибудь полезное: MathExpressions.NET. Правда у меня еще есть дифференцирование, упрощение, дроби, компиляция.
Sign up to leave a comment.
Парсинг формул с функциями