创建满足规则的 CFG

问题描述

所以我有以下问题,我需要创建一个上下文无关的无歧义语法来满足以下条件。

字母将是 { (,a,b,),£ },每个正确的字符串必须包含;

  • 一个或多个 a/b 的任意顺序的序列,这些必须用 ( ) 括起来
  • 或由 ( 和 ) 括起来的正确表达式或它们的序列。
  • 每个正确的字符串都必须包含一个 £,并且这将始终是最后一个字符。

示例正确的字符串;

  • (baabb)£
  • (b)(baabb)£
  • (((aba)))£
  • ((bbab)((b))(ba))£

我已经无数次尝试创建一个满足这一点的语法并且在很多情况下都取得了成功,但是该语法必须导致一个无冲突的 SR 解析表,并且在每种情况下我都尝试过我无法让它发生冲突自由。如果有人有任何关于如何将我已经拥有的语言转换为无冲突语言的提示,请发表评论。提前致谢。

解决方法

解决这个问题的最好方法(也是我应该开始的方法)是将规则复制为上下文无关的语法。

  1. 一个正确的表达式 (E) 是一个或多个 a/b (A) 以任意顺序 (C }) 由 ( ) 括起来。

     A → a
     A → b
     C → A
     C → C A
     E → ( C )
    
  2. 或由 ( ) 或它们的序列 (S) 括起来的正确表达式

     E → ( S )
     S → S E
     S → E
    
  3. 每个正确的字符串都必须包含一个 £,并且这将始终是最后一个字符。

     T → S £ 
    

唯一需要解释的部分是第二点。编写 Dyck 文法(即带括号的表达式)的常用方法是借助规则 S → ( S ) S; S → λ(其中 λ 表示右侧为空)。但是在这个问题中,括号之间一定有什么东西,显然有一个要求语法不包括λ-规则。为了满足这些要求,我将规则分为两部分:E 是一个带括号的表达式,而 S 是一个非空序列。