この図は、"nice" 文字列を解析する有限状態マシンを示しています。
問題は、JS コードでどのように見えるかです。
編集
上のリンクからの写真:
ウィキペディア(リンク先)によると、これは「アクセプターFSM」と「定義により、FSMによって受け入れられる言語は通常の言語です」を指します。それだけになると言えます/^nice$/.test(somestring)
。これが役に立ち、正規表現に関する詳細情報が必要な場合は、RegExpをご覧ください。
つい最近、あるプロジェクトで 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++
。