Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/98: Рейтинг темы: голосов - 98, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 26.10.2010
Сообщений: 8

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

26.10.2010, 18:40. Показов 19475. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте !

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

(уравнения однородные второго порядка вида y'' (плюc-минус) a*y (плюс-минус)b=0)

Предложите пожалуйста идеи, как это можно "сконструировать" .

Теорию то я понимаю, как это работает , но вся проблема в переводе этих мыслей на язык C# .

Должно быть текстовое поле и по кнопке , анализатор должен проверять написанное в этом текстовом поле , естесственно с выдачей соответствующих ошибок , если таковые будут иметься.

пробовал что-то подобное сделать для квадратного уравнения , к чему впринципе и сводится дифференциальное , но опять же результатов не добился.

Жду.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.10.2010, 18:40
Ответы с готовыми решениями:

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

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

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

14
Автор FAQ
Автор FAQ
 Аватар для Rockedit
1803 / 615 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
26.10.2010, 19:12
Могу предложить такую идею
сначало из введеной строки удаляются все пробелы, затем проверяется 1 символ(0 элемент символьного массива) на равенство y, следуший на равенство + или - далее должен идти символ(набор символов от 0..9) после них * и т.д. впринципи все сводится к проверки соответствуюших позиций.
При помоши операции Split можно разбить выражение на 3 части(в нем должны отсутствовать пробелы)
т.е. скажем есть выпажение y+2*x-b=0, разбиваешь на части
y
2*x
b=0
и далее уже дело техники)
1
0 / 0 / 0
Регистрация: 26.10.2010
Сообщений: 8
26.10.2010, 19:26  [ТС]
Буду пробовать !
0
Автор FAQ
Автор FAQ
 Аватар для Rockedit
1803 / 615 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
26.10.2010, 19:46
вот набросал
работает
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using System;
 
using System.Windows.Forms;
 
namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(Ur(DeleteSpace(textBox1.Text)).ToString());
        }
        /// <summary>
        /// Метод удаляет из строки пробелы
        /// </summary>
        /// <param name="str">Начальная строка</param>
        /// <returns>Модифицированная строка</returns>
        static string DeleteSpace(string str)
        {
            var returnStr = "";
            for (var i = 0; i < str.Length; i++)
            {
                if (Char.IsWhiteSpace(str[i])) continue;
                returnStr += str[i];
            }
            return returnStr;
        }
        /// <summary>
        /// Проверяет, является ли строка числом
        /// </summary>
        /// <param name="str">Начальная строка</param>
        /// <returns>True or False</returns>
        static bool IsNumber(string str)
        {
            try
            {
                double.Parse(str);
            }
            catch
            {
                return false;
            }
            return true;
        }
        /// <summary>
        /// Функция анализа правильностии диф. уравнения
        /// </summary>
        /// <param name="str">строка соделжашая уравнение</param>
        /// <returns>True or False</returns>
        static bool Ur(string str)
        {
            //разбиваем уравнение на части
            string[] part = str.Split(new char[]{'+','-'});
         /*   foreach(string s in part)
            {
                MessageBox.Show(s);
            }*/
            //проверяем что первый символо = (y or Y)
            if (part[0].ToLower() != "y")
            {
                return false;
            }
            //проверяем праввильность части a*x
            string[] part1 = part[1].Split('*');
            if ((!IsNumber(part1[0])) || (part1[1].ToLower() != "x"))
            {
                return false;
            }
            //проверяем правильность последней части
            string[] part2 = part[2].Split('=');
            if ((!IsNumber(part2[0])) || (part2[1] != "0"))
            {
                return false;
            }
            return true;
 
        }
    }
}
1
 Аватар для Unril
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
26.10.2010, 20:54
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
using System;
 
namespace ConsoleApplicationTest
{
    internal class Program
    {
        private static void Main()
        {
            // Исходная строка .
            string str = @"y '' - 10* y'-5=0";
            // Убираем пробелы.
            str = str.Replace(" ", string.Empty);
            int a = 0;
            int b = 0;
            int pos = 0;
            if (Check(str, ref a, ref b, ref pos))
            {
                Console.WriteLine("Выражение подходит, коэффициенты: a={0}, b={1}", a, b);
            }
            else
            {
                Console.WriteLine("Ошибка в записи выражения в позиции {0}", pos);
            }
            Console.ReadKey();
        }
 
        private static bool Check(string str, ref int a, ref int b, ref int pos)
        {
            // Номер состояния конечного автомата.
            int condition = 0;
            // Коэффициенты уравнения.
            int signa = 1;
            int signb = 1;
            a = 0;
            b = 0;
            // Проходим по всем символам строки.
            pos = 0;
            foreach (char c in str)
            {
                pos++;
                switch (condition)
                {
                    case 0:
                        if (char.IsLetter(c))
                        {
                            condition = 1;
                            break;
                        }
                        return false;
                    case 1:
                        if (char.IsLetter(c))
                        {
                            condition = 1;
                            break;
                        }
                        if (c == '\'')
                        {
                            condition = 2;
                            break;
                        }
                        return false;
                    case 2:
                        if (c == '\'')
                        {
                            condition = 3;
                            break;
                        }
                        return false;
                    case 3:
                        if (c == '+')
                        {
                            condition = 4;
                            signa = 1;
                            break;
                        }
                        if (c == '-')
                        {
                            condition = 4;
                            signa = -1;
                            break;
                        }
                        return false;
                    case 4:
                        if (char.IsDigit(c))
                        {
                            condition = 5;
                            a = int.Parse(c.ToString());
                            break;
                        }
                        return false;
                    case 5:
                        if (char.IsDigit(c))
                        {
                            condition = 5;
                            a = a * 10 + int.Parse(c.ToString());
                            break;
                        }
                        if (c == '*')
                        {
                            condition = 6;
                            break;
                        }
                        return false;
                    case 6:
                        if (char.IsLetter(c))
                        {
                            condition = 7;
                            break;
                        }
                        return false;
                    case 7:
                        if (char.IsLetter(c))
                        {
                            condition = 7;
                            break;
                        }
                        if (c == '\'')
                        {
                            condition = 8;
                            break;
                        }
                        return false;
                    case 8:
                        if (c == '+')
                        {
                            condition = 9;
                            signb = 1;
                            break;
                        }
                        if (c == '-')
                        {
                            condition = 9;
                            signb = -1;
                            break;
                        }
                        return false;
                    case 9:
                        if (char.IsDigit(c))
                        {
                            condition = 10;
                            b = int.Parse(c.ToString());
                            break;
                        }
                        return false;
                    case 10:
                        if (char.IsDigit(c))
                        {
                            condition = 10;
                            b = 10 * b + int.Parse(c.ToString());
                            break;
                        }
                        if (c == '=')
                        {
                            condition = 11;
                            break;
                        }
                        return false;
                    case 11:
                        if (c == '0')
                        {
                            condition = 12;
                            break;
                        }
                        return false;
                    default:
                        return false;
                }
            }
            a = a*signa;
            b = b*signb;
            return true;
        }
    }
}
С использованием конечного автомата.
2
Автор FAQ
Автор FAQ
 Аватар для Rockedit
1803 / 615 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
26.10.2010, 21:18
Блин, я опечатался. сейчас тока увидел. в моем коде x надо заменить на y и я про '' забыл. Теперь все норм.
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using System;
 
using System.Windows.Forms;
 
namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(Ur(DeleteSpace(textBox1.Text)).ToString());
        }
        /// <summary>
        /// Метод удаляет из строки пробелы
        /// </summary>
        /// <param name="str">Начальная строка</param>
        /// <returns>Модифицированная строка</returns>
        static string DeleteSpace(string str)
        {
            var returnStr = "";
            for (var i = 0; i < str.Length; i++)
            {
                if (Char.IsWhiteSpace(str[i])) continue;
                returnStr += str[i];
            }
            return returnStr;
        }
        /// <summary>
        /// Проверяет, является ли строка числом
        /// </summary>
        /// <param name="str">Начальная строка</param>
        /// <returns>True or False</returns>
        static bool IsNumber(string str)
        {
            try
            {
                double.Parse(str);
            }
            catch
            {
                return false;
            }
            return true;
        }
        /// <summary>
        /// Функция анализа правильностии диф. уравнения
        /// </summary>
        /// <param name="str">строка соделжашая уравнение</param>
        /// <returns>True or False</returns>
        static bool Ur(string str)
        {
            //разбиваем уравнение на части
            string[] part = str.Split(new char[]{'+','-'});
         /*   foreach(string s in part)
            {
                MessageBox.Show(s);
            }*/
            //проверяем что первый символо = (y or Y)
            if (part[0].ToLower() != @"y''")
            {
                return false;
            }
            //проверяем праввильность части a*y
            string[] part1 = part[1].Split('*');
            if ((!IsNumber(part1[0])) || (part1[1].ToLower() != "y"))
            {
                return false;
            }
            //проверяем правильность последней части
            string[] part2 = part[2].Split('=');
            if ((!IsNumber(part2[0])) || (part2[1] != "0"))
            {
                return false;
            }
            return true;
 
        }
    }
}
Unril, твой код не работает для действительных чисел.
1
 Аватар для Unril
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
26.10.2010, 22:28
Как вариант, можно использовать регулярные выражения:
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
using System;
using System.Text.RegularExpressions;
 
namespace ConsoleApplicationTest
{
    internal class Program
    {
        private static void Main()
        {
            // Исходная строка.
            string str = @"y'' + 1,01 *y'-5= 0";
            // Убираем пробелы.
            str = str.Replace(" ", string.Empty);
            // Проверяем на совпадение с шаблоном и ищем значения коэффициентов.
            var regex = new Regex(@"\A(?<arg>\w+)\'\'(?<num1>[-+]\d+(,\d+)*)\*\k<arg>\'(?<num2>[-+]\d+(,\d+)*)=0\Z");
            Match matche = regex.Match(str);
            if (matche.Success)
            {
                // Получаем коэффициенты и выводим результат.
                double a = double.Parse(matche.Groups["num1"].Value);
                double b = double.Parse(matche.Groups["num2"].Value);
                Console.WriteLine("Выражение подходит, коэффициенты: a={0}, b={1}", a, b);
            }
            else
            {
                Console.WriteLine("Ошибка в записи выражения.");
            }
            Console.ReadKey();
        }
    }
}
1
Автор FAQ
Автор FAQ
 Аватар для Rockedit
1803 / 615 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
26.10.2010, 22:52
Хороший вариант)
0
0 / 0 / 0
Регистрация: 26.10.2010
Сообщений: 8
27.10.2010, 05:41  [ТС]
А может можно так.

Разбить один текст бокс на части с каждым элементом и по отдельности анализировать введенный-миниэлемент . ?

Т.к потом будет вычисление корней и автоматический режим , думаю это поможет. ?)
0
Автор FAQ
Автор FAQ
 Аватар для Rockedit
1803 / 615 / 37
Регистрация: 22.12.2009
Сообщений: 1,544
27.10.2010, 10:29
Цитата Сообщение от Nikolaos Посмотреть сообщение
А может можно так.

Разбить один текст бокс на части с каждым элементом и по отдельности анализировать введенный-миниэлемент . ?

Т.к потом будет вычисление корней и автоматический режим , думаю это поможет. ?)
Собственно так я и делаю.
1
0 / 0 / 0
Регистрация: 26.10.2010
Сообщений: 8
27.10.2010, 13:30  [ТС]
Да. Просто ты предложил внутри текстового поля разделять на части. А здесь получается уже само текстовое поле "раздробить" )

Спасибо большое !!!
0
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
27.10.2010, 14:47
Цитата Сообщение от Nikolaos Посмотреть сообщение
Здравствуйте !
Прошу Вашей помощи в составлении , точнее советах по составлению Синтаксического анализатора дифференциальных уравнений.
Поправка - Лексического. )))

Недавно сам такой писал.
Однопроходной лексический парсер формул C#: Leleko.CalcScript.cs.zip
http://sources.codenet.ru/file... ipt.cs.zip
1
 Аватар для zarko97
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
22.07.2017, 16:26
sigmov, а зачем в шарповом сорсе эти указатели лепить? бяка ведь жуткая
0
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
22.07.2017, 16:45
Цитата Сообщение от zarko97 Посмотреть сообщение
sigmov, а зачем в шарповом сорсе эти указатели лепить? бяка ведь жуткая
Не прошло и 7и лет )))
Не красиво. Можно(и возможно нужно) и без них. Но! для скорости... )))
Потом в 2012 я переписал без указателей. Ухудшилось примерно на 12%. Счел это приемлемым. Правда, где код сейчас - НЗ.
0
 Аватар для zarko97
279 / 39 / 13
Регистрация: 11.10.2015
Сообщений: 405
22.07.2017, 18:43
sigmov, да и goto у вас куда ни глянь сидит...не хорошо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.07.2017, 18:43
Помогаю со студенческими работами здесь

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

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

Синтаксический анализатор (проверка на наличие русских букв)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

Теория языков программирования. Лексическо-синтаксический анализатор (доработка существующей программы)
Здравствуйте. Хочу попросить помощь с программой по ТЯП. Тут лежит само задание. У меня есть исходный код ( - с# (MS VS 2010)), но...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru