powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Парсинг математического выражения
33 сообщений из 33, показаны все 2 страниц
Парсинг математического выражения
    #38750290
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К примеру есть такая входная строка:
z - min(z123, 456) + (k2) / sqrt(x) * (SomeFunc("Sunshine 34",f_var) + 45 - t)

Суть в том, чтобы вытащить переменные (z, z123, k2, x, f_var, t) и заменить их какими-то числами.
А суть вопроса, как вытащить-то ? Какую логическую базу подвести ?
Если вдруг что, C# .NET 4.0
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750412
рубист
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tual,

Ищи статьи по лексическому разбору программ и выражений.

https://ru.wikipedia.org/wiki/Лексический_анализ
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750435
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tualА суть вопроса, как вытащить-то ? Какую логическую базу подвести ?
Если вдруг что, C# .NET 4.0
Регулярки там есть?
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750484
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если есть - примерно так...

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
<!DOCTYPE html>
<html>
<head>
<!--
<script src='http://code.jquery.com/jquery-latest.js'></script>
<link rel='stylesheet type=text/css href=tmp.css' />
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
var str='z - min(z123, 456) + (k2) / sqrt(x) * (SomeFunc("Sunshine 34",f_var) + 45 - t)';
var a=str.replace(/"[^"]*"/g,'').match(/[A-Za-z]([A-Za-z\d_]+)?(?=([\s\-\,\)\+\*\/]))/g);
for (var i=0; i<a.length; i++) {
	var re=new RegExp(a[i]+'(?=([\\s\\-\\,\\)\\+\\*\\/]))','g');
	str=str.replace(re,'{'+i+'}');
};
alert(str);
</script>
</head>
<body>
</body>
</html>
</html>
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750504
eldarkaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам помогут регулярные выражения. RegExp в простонародье.
Регулярные выражения в .NET Framework
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750516
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eldarkaaВам помогут регулярные выражения. RegExp в простонародье.
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750541
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krysa, у вас тут сущий винегрет в коде :)
можете проще подсказать регулярку на переменную... а есче интересно, как вы избежали текста внутри кавычек... там тоже может быть текст похожий на переменную
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750547
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750554
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tualkrysa, у вас тут сущий винегрет в коде :)
Пример полностью рабочий! Т.ч. не гони волну...

tualможете проще подсказать регулярку на переменную...
Это как понять?
Метод match() как раз их все и покажет...

tualа есче интересно, как вы избежали текста внутри кавычек... там тоже может быть текст похожий на переменную
Для этого я убрал текст "в кавычках" методом replace()...
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750579
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tualвытащить переменные (z, z123, k2, x, f_var, t) и заменить их какими-то числами.а какими числами?
есть карта (имя_переменной, значение)?
если есть, то все просто.
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750615
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да это грубо говоря часть некоего задания... неважно откуда строка взялась, неважно что с ней будет потом.
Надо просто найти переменные, и потом заменить их произвольными числами.
Ну разве что если переменная X встретилась не один раз, то заменить одним и тем же числом.
Вся беда в регулярках, в которых я слаб :)
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750633
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tualВся беда в регулярках, в которых я слаб :)
Регулярки они и в Африке регулярки... Просто возьми мой пример и все дела.
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750651
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Взял :) Надо ж еще понять, что в нем и как :) Вот почитал доку и понял где что и почему в нем. Даже добавил оператор % и учел переменные начинающиеся с _ :)
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750658
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tualДаже добавил оператор % и учел переменные начинающиеся с _ :)а случай, когда строка оканчивается на переменную, учел?
(если к твоему примеру в конец добавить "+ z")
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750663
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а кстати нет
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750673
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как его учесть, куда $ засунуть ?
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750688
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tualА как его учесть, куда $ засунуть ?после [\s\-\,\)\+\*\/] и [\\s\\-\\,\\)\\+\\*\\/] добавь |$

хотя все равно есть баг и вопрос.

баг - если в строку "Sunshine 34" поместить z, например, так "Sunshine z 34", то он заменится.

вопрос - возможны ли в строках экранирования кавычек, например, \" (а так же экранирования экранирований \\). Если да, то есть ещё один баг :)
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750700
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про экранированные кавычки ничего не сказано.
Про текст внутри кавычек - это типа строковая константа, то есть в ней априори нет переменных, просто какая-то константа.

Я в js regexp не секу
просветите об этом месте
Код: javascript
1.
2.
3.
4.
for (var i=0; i<a.length; i++) {
	var re=new RegExp(a[i]+'(?=([\\s\\-\\,\\)\\+\\*\\/]))','g');
	str=str.replace(re,'{'+i+'}');
};


по смыслу тут понятно, что найденные места заменяются текстом {i}, но мне надо это перевести на c#
но какими методами не понимаю, ибо на js не понял :)
тем более что замена идет уже на строке оригинала, там где был стерт текст с кавычками, то есть явно без ориентации на индекс в строке
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750707
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tualПро текст внутри кавычек - это типа строковая константа, то есть в ней априори нет переменных, просто какая-то константа.вот и я про то.
"Sunshine z 34" должно остаться как есть, а сейчас заменяется на " "Sunshine {0} 34""
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750712
tual
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лучше с другим моим вопросом подскажите...
А то если не пойму просто способа, мне придется в лоб собирать строку по индексам и оффсетам.

PS Насчет текста в кавычках, его видимо тоже придется так собирать.
PPS Матч на переменные я делаю при отброшенном тексте с кавычками (replace), так что то не проблема.
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750772
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tualМатч на переменные я делаю при отброшенном тексте с кавычками (replace), так что то не проблема.это понятно.
только вот последующую замену переменных на значение ты делаешь на исходной строке, и если в ней нашлась переменная z не внутри кавычек, то заменится она так же и внутри.


вот, набросал функцию
Код: 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.
string ReplaceVars(string str)
{
    bool insideQuotes = false;
    Dictionary<string, string> dict = new Dictionary<string, string>();
    Random r = new Random();
    Regex rx = new Regex(@"""|[A-Za-z_][0-9A-Za-z_]*(?!\s*\()(?=([^0-9A-Za-z_]|$))");
    return rx.Replace(str, (MatchEvaluator)delegate(Match m)
    {
        if (m.Value == "\"") {
            insideQuotes = !insideQuotes;
            return m.Value;
        }
        if (insideQuotes)
        {
            return m.Value;
        }
        string v;
        if (!dict.TryGetValue(m.Value, out v))
        {
            v = r.Next().ToString();
            dict[m.Value] = v;
        }
        return v;
    });
}

//-------
string str = "z - min(z123, 456) + (k2) / sqrt(x) * (SomeFunc(\"Sunshine z 34\",f_var) + 45 - t) + z";
string result = ReplaceVars(str);



заменяет переменные на рандомщину.
Одинаковые переменные - одинаковые значения.
учтено все кроме экранирования кавычек.
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750787
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вот это может экранирования кавычек обработать )

Код: 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.
string ReplaceVars(string str)
{
    bool insideQuotes = false;
    Dictionary<string, string> dict = new Dictionary<string, string>();
    Random r = new Random();
    Regex rx = new Regex(@"\\*""|[A-Za-z_][0-9A-Za-z_]*(?!\s*\()(?=([^0-9A-Za-z_]|$))");

    return rx.Replace(str, (MatchEvaluator)delegate(Match m)
    {
        if (m.Value[m.Value.Length-1] == '"') {
            insideQuotes = (m.Value.Length % 2 == 1) ? !insideQuotes : insideQuotes;
            return m.Value;
        }
        if (insideQuotes)
        {
            return m.Value;
        }
        string v;
        if (!dict.TryGetValue(m.Value, out v))
        {
            v = r.Next().ToString();
            dict[m.Value] = v;
        }
        return v;
    });
}


...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38750826
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если хотите что бы этот код потом можно было поддерживать лучше генератором воспользоваться аналогичным LEX
например
если разберётесь, это окупится...
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38751147
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Яростный Мечбаг - если в строку "Sunshine 34" поместить z, например, так "Sunshine z 34", то он заменится.
Понятное дело, что с кавычками придется дорабатывать... Прятать их сначала, потом работать с переменными. По окончанию замен "возвращать" строковые константы.
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38752112
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)лучше генератором воспользоваться аналогичным LEX
а просто конечный автомат - никак не реализовать?
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38752605
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилkealon(Ruslan)лучше генератором воспользоваться аналогичным LEX
а просто конечный автомат - никак не реализовать?
так они большинство и делают ДКА, вручную хотите его составлять?
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38752620
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)вручную хотите его составлять?
да
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38752623
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот, кстати, хорошее описание, коротко и по делу
ему достаточно разбить на токены и собрать назад
LEX с этим прекрасно справляется, остаётся найти аналог для C#
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38752651
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)остаётся найти аналог для C#
токенизатор - экран текста и никаких зависимостей и чтения лицензий
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38752699
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилkealon(Ruslan)вручную хотите его составлять?
да
если только из любви к извращенствам искусству
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  MakeLexer('sl.inc',
   [
    [#9,#32]
    ,['+','-','*','/']
    ,['(',')']
    ,One(One(['a'..'b'])+List(['a'..'b','0'..'9']),'ID')
 // to do:  Comment
 // to do:  Str define
   ]); 


Код: plaintext
1.
2.
3.
4.
5.
6.
Start state:0
  0:#0->5;#9->0;#32->0;('('..'+')->0;'-'->0;'/'->0;('a'..'b')->1;
  1:-> bubble{next:2,gap:1}  Start tag:ID
  2:#0->4;#9->3;#32->3;('('..'+')->3;'-'->3;'/'->3;('0'..'9')->2;('a'..'b')->2;
  3:-> bubble{next:0,gap:1}  Accept:ID
  4:-> bubble{next:5,gap:1}  Accept:ID
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38753363
Alex Marmuzevich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вставлю свои 5 копеек. Задача 1 в 1 похожа на шаблонный проект для FsLex (на F#). Собственно, почему бы не подключить к проекту F# либу, решающую задачу, чем геммороиться со своим парсером?
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38753530
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex MarmuzevichВставлю свои 5 копеек. Задача 1 в 1 похожа на шаблонный проект для FsLex (на F#). Собственно, почему бы не подключить к проекту F# либу, решающую задачу, чем геммороиться со своим парсером?
а никто и не говорит ему подключать свой парсер, говорят возьми аналог Flex-а
это так, пример - исскуства ради (вернее для более изощрённых целей)
...
Рейтинг: 0 / 0
Парсинг математического выражения
    #38783197
poprigun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в bat-нике реализовываю команду sleep, но при выполнении пишет "Неправильное число. Числовые константы должны быть десятичными (17), шестнадцатеричными (0x11),или восьмеричными (021)." не понимаю, в чем ошибка. Подскажите пожалуйста

@echo off
set sleep=%1

:main
set a=%1
set a| find "/?" > nul
if %ERRORLEVEL%==0 goto printhelp
for /F "tokens=1,2,3,4 delims=:," %%a in ("%time%") do set /a firstSeconds=(%%a*3600+%%b*60+%%c)*100+%%d
goto :papap

:papap
echo %sleep%| findstr /R "[^0123456789]" > nul
if %ERRORLEVEL% == 0 goto :error
for /F "tokens=1,2,3,4 delims=:," %%a in ("%time%") do set /a lastSeconds=(%%a*3600+%%b*60+%%c)*100+%%d
set /a result1=%firstSeconds%+%sleep%
set /a result2=%sleep%-8640000+%firstSeconds%
if %lastSeconds% EQU %result1% goto :end
if %lastSeconds% EQU 0 goto :end
if %lastSeconds% EQU %result2% goto :end
goto :papap

:end
echo all
exit /b

:printhelp
echo You reed /?
exit /b

:error
echo I can not calculate data
exit /b
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Парсинг математического выражения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]