编写解析器是解决此编程挑战的正确方法吗?

时间:2011-07-15 14:47:25

标签: parsing language-agnostic

看看这个编程挑战。

https://gist.github.com/1083219

  

我们构建了一种新的通信协议,可以使用受限制的语法发送消息。   我们需要编写一个函数来确定给定的消息是否在语法上有效。

     

以下是规则:

     
      
  1. 协议中有15个有效字符:小写字符'a'到'j'   和大写字母'Z','M','K','P'和'Q'。
  2.   
  3. 隔离的每个小写字符都是有效的消息,例如,“a”是有效消息。
  4.   
  5. 如果σ是有效信息,则Zσ也是如此。
  6.   
  7. 如果σ和τ是有效信息,则Mστ,Kστ,Pστ和Qστ也是如此。
  8.   
  9. 所有其他消息均无效。
  10.         

    以您选择的语言编写函数,以检查消息是否有效。   输入由一系列由空格分隔并包含的潜在消息组成   只有上面的15个字符。

         

    输出包含每个潜在消息一行,如果消息有效,则后跟'VALID',如果消息无效,则后跟'INVALID'。

         

    下面是一些示例输出。

    Input    Output
    Qa Zj    Qa INVALID
    MZca     Zj VALID
    Khfa     MZca VALID
             Khfa INVALID
    

有很多方法可以解决它,包括正则表达式,逐字符解析。我想知道别人怎么想如何解决这个问题。

我认为一个简单的解析器可能是最好的方法。首先编写语法,然后实现解析器。

1 个答案:

答案 0 :(得分:1)

我认为你应该可以用一个相当简单的递归字符串函数f来做到这一点:

  1. 查看字符串的第一个字符
  2. 如果是小写字母,请返回字符串的其余部分
  3. 如果是Z,请返回f(the rest of the string)
  4. 如果是M, K, P, or Q,则返回f(f(the rest of the string))
  5. 否则,返回整个字符串
  6. 然后将它包装在函数g中,如果f返回空字符串则返回true,否则返回false。为每条消息执行此操作。

    这是有效的,因为您描述的语法是一个简单的树结构:任何有两个子节点的节点都是M, K, P, or Q,任何有一个子节点的节点都是Z,任何叶子都是小写字母。 f总是只在树上消耗一个节点并返回树的其余部分(包括兄弟节点),并在格式错误的树上返回非空字符串。