算符优先级语法中算符的 LEADING 和 TRAILING 操作是什么?


LEADING

如果产生式为 A → aα 或 A → Ba α 其中 B 为非终结符,且 α 可以是任意的字符串,则右侧第一个终结符符号为

Leading(A) = {a}

如果产生式为 A → Bα,如果 a 在 LEADING (B) 中,则 a 也将出现在 LEADING (A) 中。

TRAILING

如果产生式为  A→ αa 或 A → αaB 其中 B 为非终结符,且 α 可以是任意的字符串,则

TRAILING (A) = {a}

如果产生式为  A → αB。如果 a 在 TRAILING (B) 中,则 a 也将出现在 TRAILING (A) 中。

计算 LEADING 的算法

输入 − 无上下文语法 G

输出 − 如果布尔数组 L [A, a] = true,则 LEADING (A) = {a}

方法 − 如果 L (A, a) 之前不是真,则过程 Install (A, a) 将使其变为真。

  • 开始

  • 对于每个非终结符 A 和终结符 a

                           L [A, a] = false ;

  • 对于每个形式为 A ⟶ aα 或 A → B a α 的产生式

                            安装 (A, a);

  • 当堆栈不为空时

                            从堆栈中弹出顶部对 (B, a);

                            对于每个形式为 A → B α 的产生式

                            安装 (A, a);

  • 结束

过程安装 (A, a)

  • 开始
  • 如果 L [A, a] 为假

                    L [A, a] = 真

                    将 (A, a) 压入堆栈。

  • 结束

TRAIL 的计算算法

输入 − 无上下文语法 G

输出 - TRAILING (A) = {a} 当且仅当布尔数组 T [A, a] = 真

方法

  • 开始
  • 对于每个非终结符 A 和终结符 a

                 T [A, a] = 假;

  • 对于每个形式为 A ⟶ αa 或 A → α a B 的产生式

                  安装 (A, a);

  • 当堆栈不为空时

                从堆栈中弹出顶部对 (B, a);

                对于每个形式为 A → αB 的产生式

                安装 (A, a);

  • 结束

过程安装 (A, a)

  • 开始
  • 如果 T [A, a] 为假

                 T [A, a] = 真

                 将 (A, a) 压入堆栈。

  • 结束

算子优先级关系计算算法

输入 - 算子语法

输出 - 终结符和符号之间的优先级关系。

方法

  • 开始
  • 对于每个产生式 A → B1, B2, … … … . Bn

                       对于 i = 1 到 n – 1

              如果 Bi 和 Bi+1 均为终结符,则

                      设置 Bi = Bi+1

             如果 i ≤ n − 2 且 Bi 和 Bi+2 均为终结符且 Bi+1 为非终结符,则

                      设置 Bi = Bi+1

             如果 Bi为终结符 & Bi+1为非终结符,则对于 LEADING (Bi+1) 中的所有 a

                       设置 Bi <. a

            如果 Bi为非终结符 & Bi+1 为终结符,则对于 TRAILING (Bi) 中的所有 a

                      设置 a . > Bi+1

  • 结束

更新于: 29-Oct-2021

11K+ 浏览量

开始你的职业生涯

完成课程并获得认证

开始学习
广告
© . All rights reserved.