公共命名空间中包括大量的句子,句子之间有依赖关系。例如,许多操作都需要用到字符串,则字符串操作是基础的。根据分“两步走”的计划,先在公共命名空间中确定语言是什么样子的,再想办法实现计算机语言。这两步和字符集+字体的划分,如出一辙。依赖关系的分析是第二步的开始。
一个句子作为一个节点,依赖关系的分析的目标,不是画出关系图,而是给它们排队,从复杂的图变成简单的线。
首先说表示方式:a->b表示先实现a再实现b,或者说b依赖a。
节点间关系分为:顺序、分支、循环、合并。
顺序:a->b, b->c推导出a->b->c
分支:a->b, a->c推导出a->d, d=(b, c)
循环:a->b, b->a推导出c=(a, b)
合并:a->c, b->c推导出d=(a, b), d->c
d=(b, c), b->a推导出d=(b, c), d->a,把b升格为d
如果x=(a, b), y=(a, b),则x和y等价
如何在计算机中表示a->b->c?用数组
如何表示d=(a, b, c)?用集合
ordered[5237]=['a', 'b', 'c']
unordered[625]={'a', 'b', 'c'}
5237和625是编号,因为预测公共命名空间会很大,里边的句子排到几千几万都有可能
用ordered数组记录形如a->b->c的
用unordered集合记录形如d=(a, b, c)的,编号625就代表d了
有如下依赖关系:
a->b, b->c, c->d, a->c, b->d
解:
由a->b, a->c推导出a->x, x=(b, c)
因为b属于x,所以,b->c推导出x->c
由c->d, b->d推导出y->d, y=(c, b)
a->x->c, y->d发现x等于y
因为c属于x,所以有a->x->x推导出a->x
a->x, y->d推导出a->x->d, x=(b, c)
根据b->c对x内部进行排序,结果不变
已知:a->b, a->c, a->d, a->e, b->c, c->d, c->e
解:
a->x, x=(b, c, d, e)
求x内部关系,取只包括(b, c, d, e)的式子,得:
b->c, c->d, c->e
推导出b->c->y, y=(d, e)
求y内部关系,取只包括(d, e)的式子,得空集
y的内部得空集,无需处理,停
所有集合都停止时就停止
已知:a->c, a->d, b->d, b->e
解:
a->x, x=(c, d), b->y, y=(d, e)
在x, y中都有d,合并x, y得z=(c, d, e)
a->z, b->z
得t->z, t=(a, b), z=(c, d, e)