Программистское...
Apr. 8th, 2015 06:21 amНесколько лет назад для себя хотел написать на C++ библиотеку для,
как бы это назвать поинтереснее, для распределенного парсинга (parsing).
Под катом основной класс и названия еще нескольких классов.
Идея такая скажем идет поток данных, к примеру просто какой-то текст,
программы или данных с какой-то семантикой, XML к примеру, или просто некоторый заковыристый протокол обмена информацией, фантазия тут бесконечна.
К примеру люди пишут драйвер к какому то устройству или девайсу, к примеру USB
или к примеру какие-то лингвистические алгоритмы распознавания или шифраторы-дешифраторы,
компиляторы, интерпретаторы и т.п.
Нет единого подхода, инструментария как это сделать, везде свой софт, который еще к тому же фиг поймешь без поллитра.
Так вот возникает идея построить некоторую сеть типа нейронной из узкоспециализированных парсеров. Так же как работает человеческий мозг, который в реальном времени всю жизнь занимается распознаванием всего и вся в реальном времени с помощью своего могучего распределенного суперкомпутера.
Ну и конструировать разные парсеры из кубиков и соединяя их синапсами и аксонами в один большой обьект который имеет довольно сложное состояние.
Вот простейший пример: в потоке текста нужно распознавать числа, далее эти числа отдать потребителю. для этого нужны парсеры фильтрующие цифры, знаки +/-, и логический парсер который понимает что правильное число распарсено. И такой парсер очень просто собрать из имеющихся кубиков. Сами понимаете, что очень сложную задачу можно сделать имея довольно небольшой набор таких кубиков. Кроме того представьте когда подсистемы еще кроме того иерархически интегрированы друг с другом. Тут воображение разыгрывается не на шутку...
Вообще мне кажется это интересная имеющая миллионы приложений и а также
вплоть до конструирования экспертных систем вплоть до искусственного интеллекта.
Потому, что природа уже и придумала для этого большой, живой распределенный парсер,
состоящий на 90% из воды. :)
class Parser
{
protected:
enum State
{
ACTIVE,
DONE,
ERROR
};
State state;
public:
Parser(void) : state(ACTIVE) { }
// return true if it the input was parsed and consumed
virtual bool Parse(const Input & in) = 0; // { return true; }
virtual void Reset() { state = ACTIVE; }
virtual const State & GetState() const { return state; }
};
class InputParser : public Parser
{
string & input;
public:
explicit InputParser(string & dest) : input(dest) {}
void SetTarget(string & dest) { input = dest; }
virtual bool Parse(const Input & in)
{
input += in;
return true;
}
};//InputParser
class SetParser : public Parser
class SingleParser : public Parser
class BlankParser : public SingleParser
class NullParser : public Parser
class KeyFilterParser : public Parser
class KeyParser : public KeyFilterParser
class SequenceParser : public Parser
class SignParser : public Parser
template class NumberParser : public Parser
template class SignNumberParser : public SequenceParser
class NumericParser : public Parser
class ParallelParser : public Parser
class ParserWrapper : public Parser
как бы это назвать поинтереснее, для распределенного парсинга (parsing).
Под катом основной класс и названия еще нескольких классов.
Идея такая скажем идет поток данных, к примеру просто какой-то текст,
программы или данных с какой-то семантикой, XML к примеру, или просто некоторый заковыристый протокол обмена информацией, фантазия тут бесконечна.
К примеру люди пишут драйвер к какому то устройству или девайсу, к примеру USB
или к примеру какие-то лингвистические алгоритмы распознавания или шифраторы-дешифраторы,
компиляторы, интерпретаторы и т.п.
Нет единого подхода, инструментария как это сделать, везде свой софт, который еще к тому же фиг поймешь без поллитра.
Так вот возникает идея построить некоторую сеть типа нейронной из узкоспециализированных парсеров. Так же как работает человеческий мозг, который в реальном времени всю жизнь занимается распознаванием всего и вся в реальном времени с помощью своего могучего распределенного суперкомпутера.
Ну и конструировать разные парсеры из кубиков и соединяя их синапсами и аксонами в один большой обьект который имеет довольно сложное состояние.
Вот простейший пример: в потоке текста нужно распознавать числа, далее эти числа отдать потребителю. для этого нужны парсеры фильтрующие цифры, знаки +/-, и логический парсер который понимает что правильное число распарсено. И такой парсер очень просто собрать из имеющихся кубиков. Сами понимаете, что очень сложную задачу можно сделать имея довольно небольшой набор таких кубиков. Кроме того представьте когда подсистемы еще кроме того иерархически интегрированы друг с другом. Тут воображение разыгрывается не на шутку...
Вообще мне кажется это интересная имеющая миллионы приложений и а также
вплоть до конструирования экспертных систем вплоть до искусственного интеллекта.
Потому, что природа уже и придумала для этого большой, живой распределенный парсер,
состоящий на 90% из воды. :)
class Parser
{
protected:
enum State
{
ACTIVE,
DONE,
ERROR
};
State state;
public:
Parser(void) : state(ACTIVE) { }
// return true if it the input was parsed and consumed
virtual bool Parse(const Input & in) = 0; // { return true; }
virtual void Reset() { state = ACTIVE; }
virtual const State & GetState() const { return state; }
};
class InputParser : public Parser
{
string & input;
public:
explicit InputParser(string & dest) : input(dest) {}
void SetTarget(string & dest) { input = dest; }
virtual bool Parse(const Input & in)
{
input += in;
return true;
}
};//InputParser
class SetParser : public Parser
class SingleParser : public Parser
class BlankParser : public SingleParser
class NullParser : public Parser
class KeyFilterParser : public Parser
class KeyParser : public KeyFilterParser
class SequenceParser : public Parser
class SignParser : public Parser
template
template
class NumericParser : public Parser
class ParallelParser : public Parser
class ParserWrapper : public Parser