编写一个带语法的解析器并生成一个解析树

时间:2012-10-27 16:10:26

标签: ruby

我的目标是编写一个将采用逻辑表达式的函数(例如:A OR NOT(B和C))并将其转换为析取范式。 (不是B或不是C)

我写了一个会产生逻辑表达式的语法

S => !S
S => (S)
S => S op S
S => W
op => AND | OR
W => A | B | C | ... | Z

这是我的算法

  1. 给出表达式S
  2. 使用上面的语法递归解析表达式并构建相应的解析树
  3. 通过递归“简化”树上的任何NOT运算符,将表达式转换为DNF。
  4. 递归遍历最终解析树并输出DNF逻辑表达式。
  5. 使用解析树,我可以通过检查当前节点的父节点,并将其向下推到树中或重新排列树(在NOT NOT的情况下)来简化NOT运算符。然后把树弄平,这是微不足道的。

    这适用于纸上,但现在我坚持使用实际的解析器。如何将这些规则转换为解析器类?我不想使用外部库,并且想从头开始编写解析器。

1 个答案:

答案 0 :(得分:1)

看看Treetop,它可能会做你想要的。 http://treetop.rubyforge.org/