Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.09.2021, 18:07   #1
plktre
Пользователь
 
Регистрация: 09.09.2019
Сообщений: 43
По умолчанию Задана строка символов, найти последовательность символов, заданную правилами

Задана строка символов, найти последовательность символов, заданную правилами:
выражение ::= множитель * выражение | множитель
множитель ::= идентификатор | целое
идентификатор ::= буква | идентификатор буква | идентификатор цифра
буква ::= A | B | C | D | E | F | G | H | I | J | K| L | M| N| O| P| Q| R| S |T| U|V| W |X| Y| Z
цифра ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
целое ::= цифра | целое цифра
plktre вне форума Ответить с цитированием
Старый 17.09.2021, 23:18   #2
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Я бы попробовал сделать через грамматики.
Код:
interface IGrammar{
   (bool IsMatch, int Consumed) TryConsume(ReadOnlySpan<char> span);
}

sealed record Letter: IGrammar{
    (bool IsMatch, int Consumed) TryConsume(ReadOnlySpan<char> span){/*вернуть true если буква*/}
}

sealed record Digit: IGrammar{
    (bool IsMatch, int Consumed) TryConsume(ReadOnlySpan<char> span){/*вернуть true если цифра*/}
}

sealed record Concatenator: IGrammar{
    IReadOnlyList<IGrammar> Parts{get; init;}
    (bool IsMatch, int Consumed) TryConsume(ReadOnlySpan<char> span){
           int total_consumed = 0;
           foreach (var grammar in Parts){
                var(is_match, consumed) = grammar.TryConsume(span);
                if(!is_match) return (false, 0);
                span = span[consumed..];
                total_consumed += consumed;
           }
           return (true, total_consumed);
     }
}

sealed record Combinator: IGrammar{
     IReadOnlyList<IGrammar> Variants{get;init;}
     (bool IsMatch, int Consumed) TryConsume(ReadOnlySpan<char> span){
           foreach (var grammar in Parts){
                var(is_match, consumed) = grammar.TryConsume(span);
                if(is_match) return (true, consumed);
           }
           return (false, 0);
     }
}
Код набирал тут, поэтому за правильность не ручаюсь.
Дальше, я думаю, понятно: набираешь с помощью конкатенатора и комбинатора все эти правила, и запускаешь матчинг.
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 17.09.2021, 23:21   #3
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

А ещё то же самое можно сделать с помощью регулярных выражений.
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 17.02.2022, 03:23   #4
дарья50397
Новичок
Джуниор
 
Регистрация: 17.02.2022
Сообщений: 3
По умолчанию

New man, подскажите пожалуйста на каком языке код написан?
дарья50397 вне форума Ответить с цитированием
Старый 17.02.2022, 04:36   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

дарья50397, данная тема в разделе C#, так что с 99% вероятностью это он.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.02.2022, 19:44   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

Я бы даже сказал, что это C# 9, следовательно в старых студиях под старый .NET Frameword или .NET Core заведомо не соберётся из-за record и init.
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задана строка символов. Вывести на экран только различные слова Maybelll Общие вопросы C/C++ 2 02.05.2020 10:50
Задана строка символов. Преобразовать эту строку Proskurina Паскаль, Turbo Pascal, PascalABC.NET 1 28.05.2012 09:40
Дана строка символов - определить количество слов, имеющих заданную длину n. Неопытный Общие вопросы Delphi 5 17.05.2012 15:16
Дана последовательность символов (строка). Группу символов, разделенную с одной или обеих сторон пробелам viper1941 Паскаль, Turbo Pascal, PascalABC.NET 1 14.04.2011 08:46
Ввести строку символов,в которой задана последовательность целых чисел (возможно со знаком), разделенных killoff1234 Помощь студентам 0 16.05.2010 18:37