Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 26.09.2018
Сообщений: 7
1

Упрощенный синтаксический анализатор(для проверки методов/функций) используя регулярные выражения

03.10.2018, 23:00. Просмотров 1165. Ответов 1
Метки нет (Все метки)

Нужно написать метод, регулярное выражение, на С#, который будет проверять правильность ввода процедуры(Pascal). Буду очень благодарен тому, кто разбирается.

В качестве пaрамeтров могут выступать идeнтификаторы, стрoковые константы, зaключенные в двойные кавычки и oдиночные символы, заключeнные в одинарные кавычки.

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


Пример строк, отправляемых клиентом серверу(без синтакс. ошибок введенные процедуры)

proc1('s',13,"sss");//верно
proc2('s',s,d,11,"sss");//верно
proc3("sss");//верно
Программа должна дать ответ, верно ли введена процедура или нет

С синтакс. ошибками процедуры

proc1(s',11,"sss"); //ошибка:отсутствует кавычка в начале первого параметра
proc2('s',s,d,11,sss");//ошибка:отсутствует двойная кавычка в начале последнего параметра
proc3("sss);//ошибка:отсутствует двойная кавычка в конце последнего параметра
proc4("sss"; //ошибка:отсутствует скобка закрывающая
Добавлено через 1 час 1 минуту
Жалкая попытка сделать парсер:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public void ThreadPoolCallback(Object threadContext)
    {
        if ((str.Length == 0) && (str[str.Length - 1] != ')'))
        {
            haveError = true;
        }
        else
        {
            int startIndex = str.IndexOf('('),
            lastIndex = str.LastIndexOf(')'),
            startIndex2 = str.LastIndexOf('('),
            lastIndex2 = str.IndexOf(')');
            if (startIndex < lastIndex && startIndex > 0 && lastIndex == str.Length - 1 &&
            startIndex == startIndex2 && lastIndex == lastIndex2)
            {
                int curr = startIndex + 1;
                while (curr < lastIndex)
                {
                    string s = "";
                    while (str[curr] != ',' && curr < lastIndex)
                    {
                        s += str[curr];
                        curr++;
                    }
 
                    curr++;
                }
            }
            else
            {
                haveError = true;
            }
        }
        doneEvent.Set();
    }
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.10.2018, 23:00
Ответы с готовыми решениями:

TCP/IP Client-Server, упрощенный синтаксический анализатор
Пишу TCP/IP Client-Server, упрощенный синтаксический анализатор для проверки прoцeдуры пacкаля. ...

Лексический анализатор - как использовать регулярные выражения?
Вот код анализатора. Как использовать регулярные выражение? И мне нужно разделить идентификатор...

Синтаксический анализатор для понятия ДНФ
Нужно построить синтаксический анализатор для понятия дизъюнктивная нормальная форма (ДНФ) на С#

Синтаксический анализатор арифметического выражения
Помогите пожалуйста ничего не понимающей студентке! Разработать синтаксический анализатор...

1
5045 / 1907 / 572
Регистрация: 11.04.2015
Сообщений: 3,319
Записей в блоге: 41
04.10.2018, 01:24 2
Лучший ответ Сообщение было отмечено noname_clear как решение

Решение

noname_clear, тут есть несколько моментов, которые следовало бы пояснить. Ну например:
Цитата Сообщение от noname_clear Посмотреть сообщение
В качестве пaрамeтров могут выступать идeнтификаторы
Для идентификаторов правила в разных языках могут быть разными, поэтому было бы неплохо узнать их для данного случая.
Цитата Сообщение от noname_clear Посмотреть сообщение
стрoковые константы
Видимо имеются в виду строковые литералы, но опять-таки для них тоже есть правила, например в некоторых языках они могут быть многострочными, в других - не могут. Бывает, что разные типы литералов в одном языке могут иметь разные правила. Ну и так далее.
Кроме того в "верных" примерах присутствуют отдельные символы (s, d и так далее) о назначении которых можно только догадываться(полагаю это тоже идентификаторы). Есть еще вопросы по пробелам, следует ли учитывать возможность появления необязательных пробелов или они запрещены. В принципе, те примеры, что приведены проходят проверку так

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
            Regex re = new Regex(@"[\w-[\d]]\w*\(('.'|"".+""|\d+|[\w-[\d]]\w*)(,('.'|"".+""|\d+|[\w-[\d]]\w*))*\);");
            Console.WriteLine("Правильные примеры");
            string[] right = {
                @"proc1('s',13,""sss"");",
                @"proc2('s',s,d,11,""sss"");",
                @"proc3(""sss"");" };
            foreach (string s in right)
            {
                Console.WriteLine("{0} - {1}", s, re.IsMatch(s));
            }
 
            Console.WriteLine("Неправильные примеры");
            string[] wrong =
            {
                @"proc1(s',11,""sss"");",
                @"proc2('s',s,d,11,sss"");",
                @"proc3(""sss);",
                @"proc4(""sss"";"
            };
            foreach (string s in wrong)
            {
                Console.WriteLine("{0} - {1}", s, re.IsMatch(s));
            }
Однако, возможно, код придется доработать с учетом приведенных выше замечаний.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.10.2018, 01:24

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Регулярные выражения для проверки пароля
Доброго времени суток форумчане! В общем проблема такова: Решил сделать проверку для поля...

Регулярные выражения для проверки занятости имени
как сделать проверку например есть в базе компания с именем Company Name что бы при регистрации...

Составить регулярные выражение для проверки вводимого выражения
Есть строка, не могу составить регулярные выражение для проверки вводимого к математическому...

Регулярные выражения для проверки введенного адреса проживания пользователя
Здравствуйте друзья! Делаю проверку на правильность вводимых данных пользователем при регистрации...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.