⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hierarchy

📁 早期freebsd实现
💻
字号:
#!/usr/local/bin/gawk -f#**************************************************************************************## hierarchy:#		This program takes an input file which defines a DAG#	and expands it into a tree.  It is useful when you have a tree of# 	generic types.  See the sample input file "file_types.hierarchy"#	for a sample dataset, and sample outputs "file_types.includes.h",#	"file_types.operation.h" and "file_types.type.h".  The input has #	three distinct types of input lines:##		root 	TYPE#		set	<TAG>	TYPE1	TYPE2	...#		children	TYPE|<TAG>	TYPE|<TAG>	TYPE|<TAG>	...##	each word is tab-separated.  "root" defines the root type of the #	tree.  "set" defines an alias for a list of types.  "children"#	defines the child types (or sets of types) for a given type or #	set of types.##**************************************************************************************# command line switches:#	-voutput_type=type	-- print the specialized type definition (iPcress only)#	-voutput_type=general	-- general output type.  has sub-options#		-vpreamble=???	-- print this ??? string before the type#		-vpostamble=???	-- print this ??? string after after the type#		-vprint_first=1	-- if you want to include the root type###**************************************************************************************function print_type_node (queue, node, out,    i) {	for (i = 1 ; i <= queue[node] ; i ++)	  printf "%s", queue[node,i] ;	printf "_type = \n\t" ;	for (i = 1 ; i <= queue[node] ; i ++)	  {	    printf "isa_%s", queue[node,i] ;	    if (i < queue[node])	      printf " | " ;	  }        printf ",\n" ;	return}function print_general_node (queue, node,     i) {	if ((queue[node] > 1) || (print_first == 1))	  {	    printf "%s", preamble;	    for (i = 1 ; i <= queue[node] ; i ++)	      {	        if ((i == queue[node]) && (i > 1))		  printf ".";	        printf "%s", queue[node,i] ;	      }	  printf "%s\n", postamble;	  }	return}BEGIN { head = 2;	tail = 1;	}$1 == "set" { 	set_names[$2] = NF - 2;	for (dummy = 3 ; dummy <= NF ; dummy ++)	  {	    set_names[$2,dummy - 2] = $dummy;	  }	}$1 == "root" { root_set = $2 ; }($1 == "children") && ($2 ~ /<.+>/) { 	for (s_el = 1 ; s_el <= set_names[$2] ; s_el ++)	  {	    t=0 ;	    for (dummy = 3 ; dummy <= NF ; dummy ++)	      if ($dummy ~ /<.+>/)	        {		  for (i = 1 ; i <= set_names[$dummy] ; i ++)		    {		      t++		      children[set_names[$2,s_el],t] = set_names[$dummy,i]		    }		}	      else		{		  t ++	          children[set_names[$2,s_el],t] = $dummy;		}	    children[set_names[$2,s_el]] = t;	   }	}($1 == "children") && ($2 !~ /<.+>/) { 	t = 0;	for (dummy = 3 ; dummy <= NF ; dummy ++)	  if ($dummy ~ /<.+>/)	    {	      for (i = 1 ; i <= set_names[$dummy] ; i ++)		{		  t++		  children[$2,t] = set_names[$dummy,i]		}	    }	  else	    {	      t ++	      children[$2,t] = $dummy;	    }	children[$2] = t;	}END { 	queue[1] = 1;	queue[1,1] = root_set;	while (head > tail)	  {	    if (output_type == "type")	      print_type_node(queue,tail);	    if (output_type == "general")	      print_general_node(queue,tail);	    for (i = 1 ; i <= children[queue[tail,queue[tail]]] ; i ++)	      {		# add new node to queue		for (j = 1 ; j <= queue[tail] ; j ++)		    queue[head,j] = queue[tail,j];		queue[head] = queue[tail] + 1;		queue[head,queue[head]] = children[queue[tail,queue[tail]],i]		head ++	      }	    tail ++	  }     }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -