5

我的目标是编写一个将采用逻辑表达式(例如:A OR NOT(B AND C))并将其转换为析取范式的函数。(A 或非 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 逻辑表达式。

使用解析树,我可以通过检查当前节点的父节点并将其推下树或重新排列树(在 NOT NOT 的情况下)来简化 NOT 运算符。然后将树弄平是微不足道的。

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

4

1 回答 1

1

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

于 2012-10-27T17:04:18.883 回答