编译器设计中的优先级函数是什么?

优先表中任意两个运算符或符号之间的优先关系可以转换为两个优先函数 f 和 g,将终端符号映射为整数。

  • 如果一个 <. b,则 f (a) <. 克(乙)

  • 如果a = b,则f(a) =。克(乙)

  • 如果 a .> b,则 f (a) .> g (b)

这里a,b代表终端符号。f (a) 和 g (b) 表示具有整数值的优先函数。

优先函数的计算

  • 对于每个终端 a,创建符号 f a &g a

  • 为每个符号创建一个节点。

               如果一个=。b,则 fa & gb 在同一组或节点中。

               如果一个=。b & c =。b,则 fa & fc 必须在同一组或节点中。

  • (a) 如果一个 <。b,标记从 g b到 f a的边。

             (b) 如果 a .>b,标记从 f a到 g b的边。

  • 如果构造的图有循环,则不存在优先函数。

  • 如果没有循环。

        (a) f a = 从 f a组开始的最长路径的长度。

        (b) g a = g a组中最长路径的长度。

Example1 - 为下表构建优先图和优先函数。

解决方案

Step1 - 创建符号

Step2 - 没有符号具有相同的优先级,如给定表中所示;因此,每个符号将保留在不同的节点中。

Step3 - 如果一个<。b,从 f a → g a创建一条边

              如果 a .>b,从 g b → f a创建一条边

因为,$<. +,*,身份证。因此,从 g +, g *, g id到 f s

相似度+<。,*,身份证。∴ 从 g * , g id到 f +创建一条边

相似度 * <. ID。因此,标记从 g id到 f *的边。

因为, +,*, id 。> $因此,标记从 f +、 f *、 f id到 g s 的边。

相似度 +,*, id 。> +。标记从 f +、 f *、 f id到 g +的边。

相似度 *, id 。> *。标记从 f *、 f id到 g 的边。

结合我们得到的所有边

Step4 - 计算每个节点的最大路径长度,我们得到以下优先函数


ID+*$
F4240
G5130

Example2 - 为下表构建优先图和优先函数。

解决方案

正如我们所拥有的 (=.)。因此 f & g 将在同一组中。

优先图的计算

优先函数表的计算

因为 f $和 g $没有出边,所以 f($) = g($) = 0。

由于 f 和 g 没有出边,所以 f(( ) = g( )) = 0。

对于所有其他人,计算从它开始的最长长度的路径。

例如 -

取 f + ,

它具有三个出边并追踪其路径。

f + → g $

f + → f (

f + → g + → f (和 f + → g + → f $

选择最大长度的路径,长度为2。

因此,f + = 2。计算 f 和 g 的所有路径,我们得到优先表


+*()ID$
F240440
G135050

以上是 编译器设计中的优先级函数是什么? 的全部内容, 来源链接: utcz.com/z/363357.html

回到顶部