我最近在一个项目中用 Javascript 做了一些 FSM 工作。我的代码适用于上述情况,如下所示 - 您有一个工厂来制作状态自动机,这只是它试图匹配的一系列步骤:
function fsmAutomatonFactory(tests) {
var step = 0;
var state = false; // acceptance state
return {
testNext: function(element) {
// matches current step
if (tests[step].test(element)) {
// advance step
step++;
return true;
}
// no match
return false;
},
getState: function() {
// all steps completed successfully
return step >= tests.length
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在您可以设置一个带有一系列测试的自动机,并通过它运行输入系列:
function fsmTest(str) {
// set up automaton
var tests = [
{ test: function(l) { return l == 'n' }},
{ test: function(l) { return l == 'i' }},
{ test: function(l) { return l == 'c' }},
{ test: function(l) { return l == 'e' }}
];
var automaton = fsmAutomatonFactory(tests);
// run the test letter by letter
for (var x=0; x<str.length; x++) {
// you could break early here if you wanted
automaton.testNext(str[x]);
}
return automaton.getState();
}
Run Code Online (Sandbox Code Playgroud)
这是大量的代码str == "nice",但它可以相对较好地扩展到更复杂的输入和测试。这适用于像您的情况这样的线性模式;如果您需要分支或更复杂的逻辑,您可能需要实现状态转换表或其他机制来处理state++.
| 归档时间: |
|
| 查看次数: |
2135 次 |
| 最近记录: |