6

この図は、"nice" 文字列を解析する有限状態マシンを示しています。

問題は、JS コードでどのように見えるかです。

編集

上のリンクからの写真:

有限状態機械の解析

4

2 に答える 2

4

ウィキペディア(リンク先)によると、これは「アクセプターFSM」と「定義により、FSMによって受け入れられる言語は通常の言語です」を指します。それだけになると言えます/^nice$/.test(somestring)。これが役に立ち、正規表現に関する詳細情報が必要な場合は、RegExpをご覧ください。

于 2011-11-17T20:32:11.700 に答える
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
        }
    }
}

これで、一連のテストを使用してオートマトンをセットアップし、一連の入力を実行できます。

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();
}

これは の大量のコードですがstr == "nice"、より複雑な入力やテストに比較的うまく対応できます。これは、あなたの場合のような線形パターンで機能します。分岐またはより複雑なロジックが必要な場合は、状態遷移表または 以外の遷移を処理するその他のメカニズムを実装する必要がある場合がありますstate++

于 2011-11-17T19:50:51.470 に答える