网络书屋(Web Reading Room)

A blogging framework for hackers.

使用Ydiff工具生成文件差异比较文件

Ydiff是一个不错的lisp语法分析工具(王垠编制).下面是该工具简单用途和使用说明。

  1. 用途 主要是js,cpp,和lisp的分析,现在也有python,ruby的分析工具。

  2. 使用说明

编译的时候仅仅在项目下载之后,make一下即可生成对应的diff-cpp,diff-js,diff-lisp分析工具. 文件分为单文件和文件夹两种。

单文件使用说明

1
 diff-lisp *.scm *1.scm

文件夹使用方式

保存下面源代码为process-lisp.sh

1
2
3
4
5
6
7
dir1=let-lang
dir2=letrec-lang
for i in `ls ${dir1}/*.scm`
do
    export TestVari=$i
    /home/happycamp-of-lisp/wangying/ydiff/diff-lisp $i ${dir2}/${TestVari##*\/}
done

当然也可以改为

1
2
3
4
5
6
dir1=let-lang
dir2=letrec-lang
for i in `ls ${dir1}/*.scm`
do
    /home/happycamp-of-lisp/wangying/ydiff/diff-lisp $i ${dir2}/${i##*\/}
done

只要修改对应的文件夹dir1,dir2,就可以分析对应文件夹的scm所有文件,然后运用下面命令行,即可生成 对应的html文件,方便阅读

1
bash process-lisp.sh

数组引入进一步修改处理程序

数组的shell操作参考如下,

  • 定义的时候通过小括号包裹
  • 调用的时候通过${}

注意 数据运算和判断(注意只有在双括号的小于号才是小于号)的两个中括号

1
seq 1 $((${#array1[@]}-1))

测试过很多错误的情况,比如

1
2
3
4
5
6
7
8
array1=(`ls -l|grep ^d|awk '{print $9}'`);
echo ${array1[@]:0:${#array1[@]}-1};
export length1=${!array1[@]};
for i in ${array1[@]:1:length1-1}; do 
    for j in ${array1[@]:$i:length1}; do 
        echo $i,$j;
    done;
done;

原因在于,${!}操作并不是把它当作数组形式,所以改为数组即可,使用seq。

1
2
3
4
5
6
length1=${!array1[@]}
echo $length1
    0 1 2 3

echo ${#length1[@]}
    1

正确的过程(注意$i+1)

1
2
3
4
5
6
array1=(`ls -l|grep ^d|awk '{print $9}'`);
for i in `seq 1 $((${#array1[@]}-1))`; do 
    for j in ${array1[@]:$i+1:${#array1[@]}}; do 
        echo ${array1[$i]},$j;
    done;
done;

结果,满足组合公式

1
2
3
4
5
6
1,letrec-lang
1,lexaddr-lang
1,proc-lang
2,lexaddr-lang
2,proc-lang
3,proc-lang

批处理解析scm文件

当文件夹下存在如下文件下,则可以进一步利用程序进行分析,注意拷贝nav.js和diff.css进行渲染

1
2
3
ls┌─[root][canbetter-N53SM][±][master ?:10 ✗][2.2.1][/home/happycamp-of-lisp/EOPL2014/DF-eopl/chapter3/proc-lang/ds-rep]
└─➞ ls
compiled  data-structures.scm  drscheme-init.scm  environments.scm  interp.scm  lang.scm  tests.scm  top.scm

批处理程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
array1=(`ls -l|grep ^d|awk '{print $9}'`);
# 遍历所有文件夹 除了最后一个
for i in `seq 1 $((${#array1[@]}-1))`; do
    #遍历从i之后的文件
    for j in ${array1[@]:$i:${#array1[@]}}; do
        #echo ${array1[$i]},$j;
        dir1=${array1[$i]};
        dir2=$j;
        mkdir ${dir1}-${dir2}
        # 选取对应文件夹下的scm文件
        for k in `ls ${dir1}/*.scm`
        do
            #export TestVari=$i
            /home/happycamp-of-lisp/wangying/ydiff/diff-lisp $k ${dir2}/${k##*\/}
        done

        mv *.html ${dir1}-${dir2}
        cp ./nav.js ./diff.css ${dir1}-${dir2}
    done;
done;

然后可以在terminal运行

1
2
python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

在浏览器输入

http://localhost:8000/ 

有问题的数组下标

数组下表是从0开始的!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
array1=(`ls -l|grep ^d|awk '{print $9}'`);
# 遍历所有文件夹 除了最后一个
for i in `seq 0 $((${#array1[@]}-1))`; do
    #遍历从i之后的文件
    for j in ${array1[@]:$i+1:${#array1[@]}}; do
        #echo ${array1[$i]},$j;
        dir1=${array1[$i]};
        dir2=$j;
        mkdir ${dir1}-${dir2}
        # 选取对应文件夹下的scm文件
        for k in `ls ${dir1}/*.scm`
        do
            #export TestVari=$i
            /home/happycamp-of-lisp/wangying/ydiff/diff-lisp $k ${dir2}/${k##*\/}
        done

        mv *.html ${dir1}-${dir2}
        cp ./nav.js ./diff.css ${dir1}-${dir2}
    done;
done;

mkdir final-result
for i in `seq 0 $((${#array1[@]}-1))`; do
    #遍历从i之后的文件
    for j in ${array1[@]:$i+1:${#array1[@]}}; do
        #echo ${array1[$i]},$j;
        dir1=${array1[$i]};
        dir2=$j;
        mv ${dir1}-${dir2} final-result
    done;
done;

这样就完成了文件夹下所有的文件对比操作,当然得确保该文件夹下存在scm文件。

进一步修改YDiff?