有限状态机解析

DrS*_*ove 5 javascript fsm

这张图描绘了有限状态机解析"漂亮"字符串.

问题是它在JS代码中会是什么样子?

编辑

上面的链接图片:

有限状态机解析

nra*_*itz 1

我最近在一个项目中用 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++.