Токенизатор C# - хранение разделителей [дубликат]

Существует несколько способов сделать это. Я обычно отступаю только к использованию чего-то вроде этого:

long start = System.currentTimeMillis();
// ... do something ...
long end = System.currentTimeMillis();

или то же самое с System.nanoTime ();

Для чего-то больше на стороне сравнительного тестирования вещей, кажется, также существует этот: http://jetm.void.fm/ Никогда не пробовал его все же.

5
задан Benjamin 18 December 2013 в 10:11
поделиться

3 ответа

Вы можете использовать Regex.Split с утверждениями нулевой ширины. Например, следующее будет разделено на + - * / :

Regex.Split(str, @"(?=[-+*/])|(?<=[-+*/])");

Фактически это говорит: «разделить в этой точке, если за ним следует или предшествует любой из - + * / . Сама совпадающая строка будет нулевой длины, поэтому вы не потеряете никакую часть входной строки.

12
ответ дан 18 December 2019 в 09:52
поделиться

Результатом будет:

string s = "24+3";
string seps = @"(\t)|(\n)|(\+)|(-)|(\*)|(/)|(\()|(\))";
string[] tokens = System.Text.RegularExpressions.Regex.Split(s, seps);

foreach (string token in tokens)
    Console.WriteLine(token);
4
ответ дан 18 December 2019 в 09:52
поделиться

Если вам нужно очень гибкое, мощное, надежное и расширяемое решение, вы можете использовать Порт C # ANTLR . Есть некоторые начальные накладные расходы (ссылка - информация о настройке для VS2008) , которые, вероятно, приведут к излишним расходам для такого крошечного проекта. Вот пример калькулятора с поддержкой переменных .

Возможно, излишний для вашего класса, но если вам интересно узнать о «реальных» решениях этого типа реальных проблем, взгляните - видеть. У меня даже есть пакет Visual Studio для работы с грамматиками , или вы можете использовать ANTLRWorks отдельно.

1
ответ дан 18 December 2019 в 09:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: