top-down parser

语法分析,通俗的讲其实就是给一个句子和 一个语法,判断这个句子是否能够由这个语法生成出来,如果能,则给出生成的路径(或者生成树)

top-down parsing,自顶向下语法分析;在这种分析规则下最常用的语法分析算法是LL,即从左至右分析,每次分析都替换掉最左边的非终结符。

(LL:Scan input from Left to Right; Construct a Leftmost Derivation)

LL算法的基本组成

LL算法有四个组件:

  1. 输入缓冲区:待分析的句子,在进行分析前需要在句子的末尾添加一个"$"符号
  2. 栈:用于存放一些语法符号,栈底用"$"号标记,初始化将起始符S压入栈底。当栈为空时,分析完成。
  3. 分析表:表的第一行是终结符或者"$"符号,第一列是非终结符,表里的格子里存放相应的递推公式
  4. 输出流A:每次分析所使用到的推导公式

算法伪代码:

repeat
  Let X be the top stack symbol
  Let a be the symbol pointed to by ip(input pointer)
  if X is terminal or $ then
    if X = a then
      pop X from the stack and advance ip
    else error()
  else
    if M[X,a] = X -> Y_1...Y_k then begin
      pop X from the stack;
      push Y_k,...,Y_1 onto the stack, and Y_1 on top;
      output the production X -> Y_1...Y_k
    end
    else error()
until X = $ /*where the stack is empty*/

构建分析表

从上面的算法伪代码就能看出来,如果能构建出算法分析表的话,其实LL算法是比较简单的。

构建算法分析表的步骤:先计算出语法的FIRST以及FOLLOW,然后按照分析表构造算法进行构造

  • FIRST函数:
    设 a 是语法中的一个符号,则FIRST(a)则是所有出现在 a 的最左边或者由 a 生成的字符串的最左边的非终结符的集合
    注:若\alpha\Rightarrow\epsilon,则\epsilon\in First(\alpha)

  • FOLLOW函数:
    设 A 是非终结符,则FOLLOW(A)是所有在任何形式的句子中直接出现在A的右边的非终结符的集合
    注:若S\Rightarrow\alpha A,则"$"属于FLLOW(A)

计算FIRST()的具体步骤:

  1. 如果X是终结符,则FIRST(X) = {X}
  2. 如果X是非终结符,
    若X->\epsilon,则\epsilon\in FIRST(X)
    若X ->Y_1...Y_k,则FIRST(X) = FIRST(Y_1...Y_k)

FIRST(X_1X_2...X_n) = FIRST(X_1)
"+" FIRST(X_2),if \epsilon\in FIRST(X_1)
"+" FIRST(X_3),if \epsilon\in FIRST(X_2)
\cdots
"+"FIRST(X_n),if\epsilon\in FIRST(X_{n-1})

计算FOLLOW()的步骤

  1. 若S是起始符号,则"$" 属于FOLLOW(S)
  2. A\to\alpha B\beta,则FIRST(\beta)-\epsilon\subset FOLLOW(B)
  3. A\to\alpha B或者A\to\alpha B\beta, \epsilon\in FIRST(\beta),则FOLLOW(A)\subset FOLLOW(B)

计算FOLLOW()算法的伪代码:

initialize FOLLOW(X) to empty set for all non-terminals X
place $ in FOLLOW(S), where S is the start symbol
repeat
for any production X ->X_1X_2...X_m
  for j = 1 to m
    if X-j is non-terminal then:
    FOLLOW(X_j) = FOLLOW(X_j) + (FIRST(X_{j+1},...,X_m)-{\epsilon});
      if FIRST(X_{j+1},...,X_m) contains \epsilon or X_{j+1}...X_m = \epsilon then
        FOLLOW(X_j) = FOLLOW(X_j) + FOLLOW(X)
until no modification are made to any FOLLOW-set

有了FIRST()和FOLLOW()后,就可以按照以下算法构建词法分析表:

1. Repeat Steps 2 & 3 for each production rule A -> α
2. Terminal a in FIRST(α)? Add A->α to M[A,a]
3.1 ε in FIRST(α)? Add A->α to M[A,b] for all terminals b in FOLLOW(A)
3.2 ε in FIRST(α) and $ in FOLLOW(A)? Add A->α to M[A,$]

LL(1)文法

如果一个文法的词法分析表没有冲突,即每个格子里的公式都不超过两个,那么就称这个文法是LL(1)文法。
L: Scan input from Left to Right
L: Construct a Leftmost Derivation
1: Use "1" input symbol as lookahead in conjunctino with stack to decide on the parsing action

LL(1)文法的属性:

  1. 文法不会有二义性或者左递归
  2. 一个文法是LL(1)文法当且仅当,A → α | β
    其中 α 和 β 推到出的字符串不会以一个相同的终结符开始
    并且 α 和 β 中有且仅有一者能够推导出ε

根据LL(1)文法的属性可以判断一个文法是否是LL(1)文法:

  1. 含有左递归递推公式的文法不是LL(1)文法,形如A → Aα | β
  2. 含有左公因式的文法不是LL(1)文法,形如A → αa | αb

消除左递归
A \to A\alpha_1|\cdots|A\alpha_m|\beta_1|\cdots|\beta_n
改写为
A\to \beta_1 A'|\cdots|\beta_n A'
A'\to \alpha_1 A'|\cdots|\alpha_m A'|\varepsilon

消除左公因式
A\to\alpha\beta_1|\cdots|\alpha\beta_n|\gamma
改写为
A\to\alpha A'|\gamma
A'\to\beta_1|\cdots|\beta_n

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,904评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,581评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,527评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,463评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,546评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,572评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,582评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,330评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,776评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,087评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,257评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,923评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,571评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,192评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,436评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,145评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352