【编译原理】提取左部公因子算法

下面是书中给出的算法,简单的描述了两句。但是实际上实现起来没有那么简单。在百度搜索提取左部公因算法时也只有理论上的知识,并没有实际的算法。https://github.com/hixiaosan/dragon_algorithm.gittype Tree struct { Root *Node}type Node struct {...
摘要由CSDN通过智能技术生成

下面是书中给出的算法, 简单的描述了两句。但是实际上实现起来没有那么简单。

在百度搜索提取左部公因算法时也只有理论上的知识,并没有实际的算法。

 

 

 https://github.com/hixiaosan/dragon_algorithm.git

type Tree struct {
    Root *Node
}

type Node struct {
    Child []*Node  // 子节点
    Pros []*Production       // 产生式索引
    Sym  Symbolic // 当前符号
}

// 生成分析树
func InitProductionTree(parent *Node, pros []*Production, idx int) {

    fmt.Println("InitProductionTree")
    groupPros := make(map[Symbolic][]*Production)

    for i := 0; i < len(pros); i++ {
        if len(pros[i].body) > idx {
            sym := *pros[i].body[idx]
            if _, ok := groupPros[sym]; !ok {
                groupPros[sym] = make([]*Production, 0);
            }

            groupPros[sym] = append(groupPros[sym], pros[i])
        }
    }

    for k, v := range groupPros {
        fmt.Println(k)
        if len(v) > 1 { // 重复前缀大于 1个的 加入子节点
    
            child := &Node{Child: make([]*Node, 0), Pros:v, Sym: k}
            parent.Child = append(parent.Child, child)

            InitProductionTree(child, groupPros[k], idx + 1
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值