Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 15.02.2013, 13:36   #1
Местный
 
Аватар для Elecktron
 
Регистрация: 27.10.2011
Адрес: Харьков
Сообщений: 106
Сказал Спасибо: 24
Имеет 11 спасибок в 7 сообщенях
Elecktron пока неопределено
По умолчанию парсинг текста или скрипты в боте

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

казалось бы - вполне хватит команд "а ля валкер" - ничего сложного вроде нет, вносим скрипт в Memo и запускаем.. но не тут то было!

в коде реализуем функции типа:
UseItem(id)
UseSkill(id)
MTL(x,y,z)

и дергать будем их из скрипта.
вопрос только в том, как распознать какую функцию и с каким параметром дернуть..

решение вида:
PHP код:
  while (i<Memo1->Lines->Count)
  {
    
0;
    
opr Memo1->Lines->Strings[i];
    while (
c<Memo1->Lines->Strings[i].Length())
    {
     
c++;
     if (
opr[c] != '#')
      {
       if (
opr[c] == 'M' && opr[c+1] == 'T' && opr[c+2] == 'L')
       
ShowMessage("MTL");
      }
     else
     {
      
Memo1->Lines->Strings[i].Length();
      
ShowMessage("закоментированная строка");
     }
    }
   
i++;
  } 
действенно, но несколько не изящно и громоздко
когда количество скриптовых команд разрастется до 10+ можно будет в этом коде сломать не только голову...
к тому же могут возникнуть проблемы с параметрами, количество символов в которых может варьироваться.

гуглю не первый день, в выдаче странные результаты, местами мало относящиеся к моей теме.
использовать сторонние библиотеки и движки не вижу смысла, да нет желания прикручивать в Visual C++..

буду признателен за любые идеи и подсказки...

"нюхом чую", что решение где-то рядом, и совсем простое..
__________________
C++Builder 6, Delphi 7, RAD Studio XE2, MS VC++...
Elecktron вне форума   Ответить с цитированием
Старый 15.02.2013, 15:39   #2
Пользователь
 
Аватар для n1ghtmare
 
Регистрация: 21.04.2010
Сообщений: 56
Сказал Спасибо: 3
Имеет 3 спасибок в 3 сообщенях
n1ghtmare пока неопределено
По умолчанию

Это какой язык? Судя по всему это c++ builder?

Последний раз редактировалось n1ghtmare, 15.02.2013 в 15:42.
n1ghtmare вне форума   Ответить с цитированием
Старый 15.02.2013, 22:41   #3
Местный
 
Аватар для Elecktron
 
Регистрация: 27.10.2011
Адрес: Харьков
Сообщений: 106
Сказал Спасибо: 24
Имеет 11 спасибок в 7 сообщенях
Elecktron пока неопределено
По умолчанию

Цитата:
Сообщение от n1ghtmare Посмотреть сообщение
Это какой язык? Судя по всему это c++ builder?
зря ты удалил свое сообщение, оно содержало достаточно много полезной информации.
да это c++ builder.
да конечный вариант будет на MS Visual C++

да я прекрасно понимаю что такие конструкции
PHP код:
if (opr[c] == 'M' && opr[c+1] == 'T' && opr[c+2] == 'L'
попадают под классификацию "быдлокод".
иначе бы я не задавал бы здесь вопросов, а сделал бы так и не морочил голову. в некоторых случаях такого более чем достаточно и нет смысла делать иначе.

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

C++ не имеет встроенной реализации работы с регулярными выражениями.
поэтому приходится "лепить"

в phx используется Pax Compiler. это избыточно, громоздко и писалось для delphi.
__________________
C++Builder 6, Delphi 7, RAD Studio XE2, MS VC++...
Elecktron вне форума   Ответить с цитированием
Старый 15.02.2013, 23:32   #4
Пользователь
 
Аватар для n1ghtmare
 
Регистрация: 21.04.2010
Сообщений: 56
Сказал Спасибо: 3
Имеет 3 спасибок в 3 сообщенях
n1ghtmare пока неопределено
По умолчанию

Цитата:
Сообщение от Elecktron Посмотреть сообщение
зря ты удалил свое сообщение, оно содержало достаточно много полезной информации.
Удалил потому что провтыкал с языком, увидел memo и сразу подумал что это delphi.
Но суть та же. Что мешает в builder'e использовать готовый движок (К примеру Lua, я его использую) ? Причем тут visual c++. Ведь движки как правило ничего кроме stl не используют. В билдере какой-то не такой stl?

Кстати никто не заставляет использовать регулярки, хотя тот же boost имеет реализацию регулярок. функция strstr
К примеру так:
Код:
if (strstr(line, "MTL(") == line) { ... }
Ищем подстроку, и если она находиться в начале строки то ура.

Это не лучший вариант, т.к. в строковых параметрах к примеру может быть название функции ну и т.п.

Последний раз редактировалось n1ghtmare, 15.02.2013 в 23:43.
n1ghtmare вне форума   Ответить с цитированием
Старый 15.02.2013, 20:02   #5
Местный
 
Регистрация: 13.12.2007
Сообщений: 126
Сказал Спасибо: 10
Имеет 39 спасибок в 32 сообщенях
Zergatul
По умолчанию

Можно заюзать простые рег експы для парсинга названия и всех параметров в удобный массив.

Пример на джаваскрипте (можно запустить в консоли браузера):
Код:
str = 'someFunc(1, 2, 3, "qq", true)'
str.match('^([a-zA-Z]+)\\((.+)\\)$')
Выдаст:
Код:
["someFunc(1, 2, 3, "qq", true)", "someFunc", "1, 2, 3, "qq", true"]
Дальше парсим параметры:
Код:
params = '1, 2, 3, "qq", true'
params.match(/([^,]+)+/g)
Результат:
Код:
["1", " 2", " 3", " "qq"", " true"]

Последний раз редактировалось Zergatul, 15.02.2013 в 20:16.
Zergatul вне форума   Ответить с цитированием
Старый 15.02.2013, 21:58   #6
Пользователь
 
Аватар для n1ghtmare
 
Регистрация: 21.04.2010
Сообщений: 56
Сказал Спасибо: 3
Имеет 3 спасибок в 3 сообщенях
n1ghtmare пока неопределено
По умолчанию

Примерно так, а в памяти хранить пару { "имя в скрипте", указатель на реальную } А вообще я бы посоветовал lua.
n1ghtmare вне форума   Ответить с цитированием
Старый 19.02.2013, 15:25   #7
Местный
 
Регистрация: 10.08.2010
Сообщений: 634
Сказал Спасибо: 22
Имеет 95 спасибок в 70 сообщенях
mira пока неопределено
По умолчанию

используй имеющиеся скрипт движки. больше времени потратиш на изобретение велосипедов чем на бота.
__________________
читернуть бы ништяг
mira вне форума   Ответить с цитированием
Старый 19.02.2013, 15:44   #8
Местный
 
Аватар для SeregaZ
 
Регистрация: 16.08.2009
Сообщений: 1,224
Сказал Спасибо: 4
Имеет 229 спасибок в 182 сообщенях
SeregaZ пока неопределено
По умолчанию

велосипеды - путь к более обширному понимаю того, что происходит. самый лучший путь к самообразванию.
__________________
хочу картинку в подпись!
SeregaZ вне форума   Ответить с цитированием
Старый 19.02.2013, 18:57   #9
Местный
 
Аватар для Elecktron
 
Регистрация: 27.10.2011
Адрес: Харьков
Сообщений: 106
Сказал Спасибо: 24
Имеет 11 спасибок в 7 сообщенях
Elecktron пока неопределено
По умолчанию

Цитата:
Сообщение от SeregaZ Посмотреть сообщение
велосипеды - путь к более обширному понимаю того, что происходит. самый лучший путь к самообразванию.
чем я собственно и занимаюсь
готовые скриптовые движки (типа PaxCompiler) громоздки и избыточны.
да и конкретно Pax не очень хорошо совмещается с MSVC++
у меня уже есть варианты обработки, но пока это обрывки набросков и мыслей у меня в голове...
когда оформится это все в рабочий (или не очень ) код я обязательно выложу на суд общественности
__________________
C++Builder 6, Delphi 7, RAD Studio XE2, MS VC++...
Elecktron вне форума   Ответить с цитированием
Старый 23.02.2013, 04:37   #10
Местный
 
Аватар для Elecktron
 
Регистрация: 27.10.2011
Адрес: Харьков
Сообщений: 106
Сказал Спасибо: 24
Имеет 11 спасибок в 7 сообщенях
Elecktron пока неопределено
По умолчанию

вот что получилось в результате сбора кусочков мыслей и нескольких часов гугления:

PHP код:
    while (i<Memo1->Lines->Count)
    {
     
TStringList *WCount = new TStringList();
     
TSysCharSet Tws,Tcs;
     
Tcs<<'('<<')'<<','<<' '// разделители
     
AnsiString s Memo1->Lines->Strings[i];
     
ExtractStrings(Tcs,Tws,s.c_str(),WCount);

   if(
WCount->Strings[0] == "MTL")
     {
      
ShowMessage("Moving to x:"WCount->Strings[1]+" y:"+WCount->Strings[2]+" z:"+WCount->Strings[3]);
     }
     else
   if(
WCount->Strings[0] == "UseItem")
     {
      
ShowMessage("Use Item ID:"WCount->Strings[1]);
     }
     else
   if(
WCount->Strings[0] == "#")
     {
      
ShowMessage("ignored line");
     }
     else
     
Label1->Caption "Expression syntax on line "+IntToStr(i); //тут бы еще допилить прерывание выполнения...
 
        
i++;
        
delete WCount;
    } 
в бота еще не интегрировал.
нужно будет переписать на MSVC++ (бот на нем ), добавить функционала и реализовать отправку соответствующих пакетов...
__________________
C++Builder 6, Delphi 7, RAD Studio XE2, MS VC++...
Elecktron вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Основные форумы > Программинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 03:28.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!