Parsing 如果我升级或升级节点,我是否能够解析任何类型的和/或树?

Parsing 如果我升级或升级节点,我是否能够解析任何类型的和/或树?,parsing,Parsing,给定语法(a | ab)c,我们可以将语法树编写为: and / \ or c / \ a ab 但这是无法比拟的。例如,如果我们给它输入“abc”,它将首先遍历树的左侧,匹配“a”,“或”返回true,“调用”c,“c”失败,整个树不尝试“ab”就失败 如果我们像这样变换树: or / \ and and / \ / \ a c ab c 这应该是一个等价的表示,然后我们像以前一样沿着左边走,点击“a”,“a”返回true

给定语法
(a | ab)c
,我们可以将语法树编写为:

   and
   / \
  or  c
 /  \
a   ab
但这是无法比拟的。例如,如果我们给它输入“abc”,它将首先遍历树的左侧,匹配“a”,“或”返回true,“调用”c,“c”失败,整个树不尝试“ab”就失败

如果我们像这样变换树:

     or
    /  \
 and   and
 / \    / \
a   c  ab  c
这应该是一个等价的表示,然后我们像以前一样沿着左边走,点击“a”,“a”返回true,我们尝试旁边的“c”,失败了,我们回到根,尝试右边的分支,这次成功了

因此,要将第一棵树转换为第二棵树,我们只需“提升”或,克隆“和”,并混合子树。如果我们这样做,我是否能够解析任何只包含“and”、“ors”和叶节点的树?或者是否存在这样一种可能失败的情况

我尝试了一个更复杂的场景(在纸上),比如
((a | ab)c)| d)e
,它似乎也在那里工作


编辑:在这种情况下,如果我将两个“OR”提升到一个级别,似乎是可行的,但如果我一直将“OR”提升到树的顶部,它也会起作用。

你想遵循什么样的解析模型?@Damien_不信者:没有。我只是在编造一些东西(=)我建议不要尝试开拓这个领域——在这些领域已经做了相当多的工作。如果您想查看的话,它包含了很多关于解析工作的信息。