【问题标题】:Finite State Machine parsing有限状态机解析
【发布时间】:2011-11-17 18:56:31
【问题描述】:

This 图片描述了有限状态机解析“nice”字符串。

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

编辑

图片来自上面的链接:

【问题讨论】:

    标签: javascript fsm


    【解决方案1】:

    根据维基百科(您的链接指向的地方),这指的是“接受者 FSM”和“根据定义,FSM 接受的语言是常规语言”。可以说它只是/^nice$/.test(somestring)。如果这有帮助并且您需要有关正则表达式的更多信息,请查看RegExp

    【讨论】:

      【解决方案2】:

      我最近在一个项目中用 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 transition table 或其他机制来处理state++ 以外的转换。

      【讨论】:

      • 谢谢!假设我想解析另一个词 - “程序员”而不是“nice” - 我应该制作新的测试数组吗?如果是这样,程序如何区分这些数组?我需要为我想解析的每个单词测试数组吗??
      • 好吧,这段代码是为更复杂的测试而设计的(我用它来寻找网络内容中的重复模式,包括 jQuery 选择器匹配和正则表达式在内的各种测试)。所以是的,每个测试套件——本质上是不同 FSM 的逻辑——都有自己的一组测试。您可以轻松地创建一个函数来自动为新字符串或一系列正则表达式或您拥有的东西生成测试。
      猜你喜欢
      • 2011-03-06
      • 2012-01-07
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多