【问题标题】:Backus–Naur form with boolean algebra. Problem with brackets and parse tree具有布尔代数的 Backus-Naur 形式。括号和解析树的问题
【发布时间】:2020-08-19 19:23:05
【问题描述】:

boolean algebra

我想用 Backus-Naur-Form 写那些布尔表达式。

我得到的是:

::= | |

::=

| | |

::= | | | |

::= |

我用做了一个rekursion,所以只要有一个括号它就会启动一个新实例,但我仍然不知道什么时候关闭括号。有了这个,您可以设置一个右括号并创建一个新实例,但我只希望它用于左括号。

我可以在和中分开吗? 我的巴库斯-瑙尔形式是否正确?互联网上关于带有布尔代数的 Backus-Naur 形式的信息并不多。这个的解析树长什么样子?

【问题讨论】:

  • 通常 EBNF 产生式使用括号作为符号周围的文字(终端或非终端)。例如<multiplication_expr> ::= "(" <term> "*" <term> ")"。所以,不,你不会有一个规则,比如你的 <bracket> ::= ...
  • 这是否意味着我必须重新排列这些布尔表达式以便没有括号?或者我如何处理布尔表达式中的那些括号?

标签: bnf parse-tree boolean-algebra


【解决方案1】:

我假设您想使用 Backus-Naur 形式为布尔表达式定义语法,并且您的示例是此类表达式的具体实例。您的语法存在多个问题:

首先,您希望您的语法只生成正确的布尔表达式。使用您的语法,您可以使用路径<variable> -> <operator> -> <OR> 生成一个简单的运算符 作为有效表达式,这显然是错误的,因为该运算符缺少其操作数。换句话说, 本身不能是正确的布尔表达式。您的语法可以导出各种其他不正确的表达式。出于同样的原因,左括号和右括号应该一起出现在生产规则的某个地方,因为您要确保每个左括号都有一个右括号。将它们放在单独的产生式规则中可能会破坏这种保证,具体取决于语法的整体结构。

其次,您想区分非终结符号(由生产规则细化的符号,即写在<> 之间的符号)和终结符号(原子符号,如变量pqrs)。因此,您的非终结符号<p><q><r><s> 应该是终结符号pqrs。括号和运算符等其他符号也是如此。

第三,为了得到一个明确的解析树,你希望你的运算符的优先级和关联性是正确的,也就是说,你要确保,例如,否定在蕴涵之前被评估,因为它具有更高的优先级(类似于必须在加法之前计算乘法的算术表达式)。换句话说,我们希望具有较高优先级的运算符出现在离解析树的叶节点更近的位置,而具有较低优先级的运算符则出现在更靠近树的根节点的位置,因为首先评估树的叶子。我们可以通过以递减方式反映运算符优先级的方式定义语法来实现这一点:

<expression>  ::= <expression>  ↔ <implication> | <implication>
<implication> ::= <implication> → <disjunction> | <disjunction>
<disjunction> ::= <disjunction> ∨ <conjunction> | <conjunction>
<conjunction> ::= <conjunction> ∧ <negation>    | <negation>
<negation>    ::= ¬ <negation> | <variable> | ( <expression> )
<variable>    ::= p | q | r | s

&lt;expression&gt; 开始,我们可以看到一个有效的布尔表达式首先将所有 运算符链接在一起,然后是所有 运算符,然后是所有 运算符,依此类推,依此类推。他们的优先级。因此,优先级较低的运算符(例如)位于树根附近,而优先级较高的运算符(例如¬)位于树的叶子附近。

请注意,上面的语法是左递归的,这可能会导致无法处理它们的软件工具(例如解析器生成器)出现一些问题。

【讨论】:

  • 这是否意味着我可以将这个语法用于所有布尔代数?
  • 是的,语法涵盖了所有布尔表达式,即它可以正确处理您的示例等等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
相关资源
最近更新 更多