There some times appears a task when you have a sequence of object and you need perform some action when a particular pattern (subsequence?) occurs.
As more concrete example we can imagine a log monitoring solution which should alert when a predefined sequence of messages is detected (A followed by B, followed by C, but no D in the middle).
This sounds a bit like CEP, but a) no need for real-time processing; b) no large volumes.
What patterns\algorithms exists to solving problems of this kind? Is there a well-known name for the problem (so that i can search for solutions myself)?
-
9I think you are looking for a "state machine".amon– amon2017年02月03日 14:01:33 +00:00Commented Feb 3, 2017 at 14:01
-
thanks! i was also thinking about a state machine. do you know of any good design patters to implement one in OO language?scorpp– scorpp2017年02月05日 21:05:26 +00:00Commented Feb 5, 2017 at 21:05
-
You don't really need any special design pattern. Usually, state machines are implemented as a nested switch/case, but there are many variations possible.amon– amon2017年02月05日 21:14:59 +00:00Commented Feb 5, 2017 at 21:14
-
1btw did my task with spring-statemachine. worked quite nice! thanks for tip.scorpp– scorpp2017年04月05日 11:14:25 +00:00Commented Apr 5, 2017 at 11:14
-
Will there be intervening messages between A and B, or between B and C, etc? What if message A appears multiple times, and B also appears multiple times? Would that still count as a detection?rwong– rwong2018年01月30日 06:42:07 +00:00Commented Jan 30, 2018 at 6:42
1 Answer 1
Parser generators, such as ANTLR, specifically address this task. They generate a parser that can perform some task when a production is complete. You can either trigger an alert directly in the production definition, or merely use the parser to generate an abstract syntax tree that is more abstract (has less complexity) than the original input. You can then process the tree using complex logic that is entirely outside the parser.