Page 199 - 《软件学报》2025年第10期
P. 199

4596                                                      软件学报  2025  年第  36  卷第  10  期


                 遍历完成后, 一棵新的语法树就构建完成了. 第             3  个方法为  insert, 这是将新节点插入到语法树中的方法, 该方法的
                 参数分别为根节点       rootNode, 新节点的父节点    fatherId  以及一个新节点   newNode, 从根节点进行判断当前节点的
                 id  与  newNode 节点的父节点的   id  是否一致, 如果一致就将      newNode 节点插入到当前节点的子节点列表            sonList
                 中, 否则从根节点的子节点列表开始深度优先遍历每一个节点进行判断. 总体的过程为先建立新的抽象语法树根
                 节点, 然后遍历编译单元中的每一个正常节点, 将每个节点转化为一个新的节点插入到新的抽象语法树中. 通过该
                 算法得到的抽象语法树不仅包含了原本抽象语法树的全部语法信息, 而且结构更加简单, 其链式存储方式为后面
                 的变异操作提供了方便.

                 算法  1. 抽象语法树优化算法.

                 输入: 抽象语法树 T;
                 输出: 优化后的抽象语法树 T'.
                 1.  function setNode(curNode)
                 2.       rootNodeName ← T.getName
                 3.       rootNodeValue ← T.getValue
                 4.       rootId ← setId(rootNodeName, rootNodeValue)
                 5.       newNode ← setNode(rootId, rootNodeName, rootNodeValue)
                 6.       return newNode
                 7.  end function
                 8.  rootNode ← T'.buildrootNode  (rootNodeId, rootNodeName, rootNodeValue)
                 9.  while i = 1 to n do
                 10.     int index ← 1
                 11.     ti ← getTree(ni, index, sign)
                 12.     T.add(ti)
                 13.  end while
                 14.  function getTree(rootNode, curNode)
                 15.  childrens ← curNode.getChildren
                 16.  newNode ← setNode(curNode)
                 17.  curNodeFatherId ← curNode.getFatherId
                 18. T'.insert  (rootNode, curNodeFatherId, newNode)
                 19.  for all node ∈ childrens do

                 20.           getTree(rootNode, childrens)
                 21.     end for
                 22.  end function
                 23.  function insert(rootNode, fatherId, newNode)
                 24.      if rootNode.id is fatherId and rootNode.allChilds.notExist(newNode) then
                 25.            rootNode.sonList.add(newNode)
                 26.      end if
                                sonList ← root.getSonList
                 27.
                 28.            if sonList is not null then
                 29.             for all node ∈ sonList do
                 30.            getTree (node, fatherId, newNode)
   194   195   196   197   198   199   200   201   202   203   204