Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 21.05.2011
Сообщений: 24
1

Создать синтаксический анализатор

25.04.2012, 11:42. Показов 2785. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C#. Нужно написать синтаксический анализатор, который проверяет правильность записанной функции. например: y=cos(x)+sin(3x) - правильно записанная функция, у = сo + si -какое-то равенство переменной у и суммы двух других переменных, что-то в этом духе.
Помогите,плиз!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.04.2012, 11:42
Ответы с готовыми решениями:

Мой синтаксический анализатор
Разбивает текст на слова, удаляет комментарии. Выделяет в 1 слово: последовательность букв и цифр...

Синтаксический анализатор
Здравствуйте ! Прошу Вашей помощи в составлении , точнее советах по составлению Синтаксического...

Синтаксический анализатор кода
Необходимо написать программу, которая считывает текстовый файл с кодом и выводит колличество...

Синтаксический анализатор C++ ANTLR4
Выручайте нужна помощь. Знания очень скудны в таком плане, потому решил использовать antlr4....

9
Эксперт Python
4632 / 2050 / 361
Регистрация: 17.03.2012
Сообщений: 10,134
Записей в блоге: 6
25.04.2012, 12:40 2
для начала, если у вас учивывается равенство - это уже запись не функции, а уравнения.
Тем более, если там другие переменные.

А в чем проблема?
Дробите запись, вначале по знаку =, потом по +\- (как наименьший приоритет), с учетом скобок, получается у вас дерево. каждый элемент потома проверяете на корректность.
1
0 / 0 / 0
Регистрация: 21.05.2011
Сообщений: 24
25.04.2012, 17:06  [ТС] 3
Вот я считал и разбил по знакам. как дальше сверить?

C#
1
2
3
4
5
6
7
8
static void Main(string[] args)
        {
            StreamReader r = new StreamReader("t.txt");
            List<string> mass = new List<string>();
            string[] ss = r.ReadToEnd().Split('+', '-', '\r', '\n', '\t', '=', '(', ')');
              //  for (int j = 0; j < ss.Length; j++)
        
         }
0
Эксперт Python
4632 / 2050 / 361
Регистрация: 17.03.2012
Сообщений: 10,134
Записей в блоге: 6
25.04.2012, 17:14 4
нет, это слишком просто и неинтересно.
должен быть счетчик скобок.
бегите по строке вручную. нашли "(" - повышаете счетчик скобок на 1. ")" - понижаете.
дробите только когда счетчик равен нулю.
0
0 / 0 / 0
Регистрация: 21.05.2011
Сообщений: 24
25.04.2012, 17:19  [ТС] 5
Ну вот еще на экран вывел:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static void Main(string[] args)
        {
            StreamReader r = new StreamReader("t.txt");
            List<string> mass = new List<string>();
            string[] ss = r.ReadToEnd().Split('+', '-', '=', '*', '/', '(', ')', '\r', '\n', '\t');
                for (int j = 0; j < ss.Length; j++)
                {
                    int ff;
                    if (!Int32.TryParse(ss[j], out ff))
                        mass.Add(ss[j]);
                }
                mass.Sort();
                for (int I = 0; I < mass.Count - 1; I++)
                Console.WriteLine(mass[I]);
        
         }
Миниатюры
Создать синтаксический анализатор  
0
0 / 0 / 0
Регистрация: 21.05.2011
Сообщений: 24
25.04.2012, 17:22  [ТС] 6
я не знаю как так сделать....
0
Эксперт Python
4632 / 2050 / 361
Регистрация: 17.03.2012
Сообщений: 10,134
Записей в блоге: 6
25.04.2012, 17:36 7
Я написал словами, код - уж извините, сами.

Впрочем, у меня завтра под рукой будет аналогичный код на Delphi, если хотите - поделюсь.
Правда, там немного специфики по окончательно "чистому" одночлену, но разбор вам пойдет.
0
0 / 0 / 0
Регистрация: 21.05.2011
Сообщений: 24
25.04.2012, 17:57  [ТС] 8
спс, давайте хоть на делфи. разберемся может быть.

Добавлено через 18 минут
Цитата Сообщение от dondublon Посмотреть сообщение
Я написал словами, код - уж извините, сами.
подскажи хотябы как сравнить(что написать на знаке "?")
C#
1
2
3
for (int I = 0; I < mass.Count; I++)
{ if (mass[I]== ? )  //как туда запихать ,что mass[I]==cos?
}
0
Эксперт Python
4632 / 2050 / 361
Регистрация: 17.03.2012
Сообщений: 10,134
Записей в блоге: 6
25.04.2012, 18:07 9
ну полагаю, надо взять строку и от нее метод Substring.

Добавлено через 1 минуту
но это неправильный подход. надо разбить строку по знакам + и -, с учетом скобок.
0
Эксперт Python
4632 / 2050 / 361
Регистрация: 17.03.2012
Сообщений: 10,134
Записей в блоге: 6
26.04.2012, 07:14 10
Вот файл.
CubeOperations.rar
некоторые комментарии.
1. Класс заточен на получение значения из трехмерного массива по координатам i,j,k. Все, что с этими координатами - вам не нужно.
2. Класс TSubOperations - вам пойдет просто List<SubOperations>, когда это писалось, в дельфи генериков не было.
3. Порядок работы таков: создаём TCubeOperation от стринга, он парсит его один раз. Потом каждый раз подаем ijk, он по уже готовому дереву выдаёт результат, функция GetCellValue: double.
4. Включены функции Min(a,b,c...) и Max (такое же) - наверно, это вам не нужно.
5. Возведение в степень - учитываются три способа записи: a^b, a**b и pow(a,b). Ну вот так вот.

Комментариев в коде полно, выглядит, как будто хрестоматийный код из учебника писал я. удачи.
0
26.04.2012, 07:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.04.2012, 07:14
Помогаю со студенческими работами здесь

Нужно разработать синтаксический анализатор
Разработать синтаксический анализатор для понятия «скалярный_тип»: скалярный_тип ::=...

Написать синтаксический анализатор-калькулятор
Задача заключается в том что надо написать программу &quot;калькулятор&quot; на языке С Sharp. Калькулятор...

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru