检查输入语法并确定结果

时间:2013-03-12 21:31:33

标签: parsing language-agnostic grammar

说我有一个字符串“abacabacabadcdcdcd”,我想应用一套简单的规则:

abaca->一种

dcd-> d

从左到右s.t.字符串最终成为“abad”。此输出将用于做出决定。应用规则后,如果输出字符串与预设字符串(如“abad”)不匹配,则原始字符串将被丢弃。恩。每个字符串应该提取到“abad”,如果没有,则踢。

我现在将此硬编码作为正则表达式,但这些小规则集有很多实例。我正在寻找一些将采取一系列简单规则并编译(或只是一个函数?)的东西,我可以将字符串提供给并检索结果。规则集彼此独立。

输入受到严格控制,使用的规则很简单。速度是最重要的方面。

我看过Bison和ANTLR,但我认为我不需要那么强大......

我在找什么?

编辑:应该提到字符串由几个字母组成。通常为5,即“abcde”。没有空格等等。只是字母。

1 个答案:

答案 0 :(得分:1)

如果速度很快,你可以从一张地图开始,它包含你的规则作为字符串的键值对。然后,您可以将此映射编译为一种状态机,一个带有char键的树,其中关联的值是替换字符串或另一个树。

然后你通过字符串char来char。查找树中的当前字符。如果找到另一棵树,请查找该树中的下一个字符,等等。 在某些时候,要么:

  1. 查找将失败,然后您知道到目前为止您看到的字符串不是任何规则的前缀。您可以跳过当前角色并继续下一个角色。
  2. 或者你得到一个替换字符串。在这种情况下,您可以用替换字符串替换当前字符与您查找的最后一个字符之间的字符。
  3. 唯一的困难是如果替换本身可以成为替换模式的一部分。例如:

    ab -> e
    cd -> b
    

    输入:

    acd -> ab (by rule 2)
    ab   -> e (by rule 1) ????
    

    现在问题是你是否想重新考虑ab给e?

    如果是这样,您必须在每次更换后从头开始重新开始。此外,很难判断替换是否会结束,除非您拥有的所有规则都是右侧比左侧短。因为,在这种情况下,有限的字符串将在有限的时间内减少。

    但如果我们不需要重新考虑,上面的算法将直接通过字符串。