自顶向下的分析是从树根开始推导的;
S->z1->z2->...->zn
所用到的规则放在一个后进先出的堆栈里,开始时堆栈为空,这个堆栈的作用是记录最近所用到的规则;
堆栈的作用是记录最近所用到的规则;
假定左部符号为A的规则的排列顺序是Pa.1,Pa.2,...,算法如下:
局部分析表:
序号:标明是整个分析过程中的第几个据不分析;
根 : 标明该局部分析过程的树根;
起点:标明该局部分析是从输入串的第几个词开始;
终点:标明局部分析是到输入串的第几个词结束;
成分表:标明该局部分析是以哪些局部分析为其构成成分的;
概率与法:
句法歧义: 从自动分析的角度看,这些歧义可分为:外显式和内含式两种: 如果一个词串所对应的若干种结构有各不相同的根,叫做外显式歧义;
如果一个词语串所对应的若干种结构有形同的根,叫做内含式歧义;
乔姆斯基范式:
A->a;
A->BC
Ai,j(A)=P(A->a)
一般化:
规则概率的调整,需要用到外部概率的概念;
先来考虑A是整个语句绑定后的符号(或者从生成的观点看,是由A推出整个语句)
乔姆斯基范式:
句法分析二:
1
线图分析算法(
Chartparsing
)
2
标准
LR
分析算法
3 GLR
分析算法(
Tomita/
富田胜算法)
Chart算法的过程描述:
1)
将待分析字符串
w
置入输入缓冲区,
agenda
清为空栈;
2)
循环,反复执行下面步骤,直至输入缓冲区和
agenda
均为空
a)
若
agenda
为空,则从输入缓冲区取一个字符,并把该字符及其起止位置
(P1, P2)
推入
agenda
栈;
b)
从
agenda
中弹出栈顶的边,该边的起止位置为
(P1, P2),
边上标记为
L
;
c)
检查规则集中的规则,对所有形如
A
à
L
b
这样的规则,在
active arc
集合中增加一条起止位置为
P1, P2
,弧上为
A
à
L ·
b
这样的点规则;
d)
把从
agenda
中弹出的标记为
L
的边,加入到
chart
中的
P1, P2
之间;
e)
检查所有
active arc
,如果存在起止位置为
P0, P1
,且弧上点规则为
A->
a
·
L
b
的
active arc
,就增加一条新的
active arc
,起止位置为
P0, P2
,弧上点规则为
A-〉
a
L ·
b
f)如果一条
active arc
(起止位置为
P0, P2
)上点规则形如
A->
a
L ·
(点号在规则最右端),就将起止位置为
P0, P2
,边上标记为
A
的边压入
agenda
栈