Recursive Descent and LL Grammar

A Reminder

LL (1):

•Left-to-right token processing

•Leftmost derivation

•Top-down parsing

•One lookahead token

LL(1) 文法解析详细解读

LL(1) 的基本概念

  1. L (第一个 L)

• 表示从左到右对输入的token进行扫描和处理。

Left-to-right:解析器会按照输入字符串从左到右依次读取每个字符或 token。

  1. L (第二个 L)

• 表示生成最左推导(Leftmost Derivation)。

Leftmost Derivation:在解析过程中,每次优先替换推导出最左侧的非终结符

  1. (1)

• 表示一个符号的前瞻(Lookahead)。

One Lookahead Token:在决定选择哪个产生式时,解析器只需要查看下一个输入的 token,而不需要回溯或查看多个符号。

LL(1) 的特征

  1. 左到右解析(Left-to-right)

• 输入流被从左到右逐个符号进行扫描。

• 这种顺序确保了解析过程的连续性和有序性。

  1. 最左推导(Leftmost Derivation)

• 推导过程中,优先替换最左侧的非终结符。

• 例如,给定文法:$S \rightarrow A \ B, \quad A \rightarrow a, \quad B \rightarrow b$

对于输入字符串  ab ,推导过程如下:

Step 1:  $S \Rightarrow A B$

Step 2:  $A \Rightarrow a$  (替换最左侧的  A )

Step 3:  $B \Rightarrow b$

• 完成推导: $S \Rightarrow a b$

  1. 自顶向下解析(Top-down Parsing)

Top-down 表示从起始符号(Start Symbol)开始,根据文法规则逐步推导出目标字符串。

• 构建语法树时,从树的根节点开始逐层向下扩展到叶子节点。

• 每一步都使用输入符号和预测选择的产生式进行匹配,直到所有的符号匹配完毕。

  1. 单符号前瞻(One Lookahead Token)

• 在选择产生式时,解析器只需要查看下一个输入符号(lookahead token)。

• 如果每个非终结符的产生式满足 LL(1) 文法的要求(无二义性、FIRST 和 FOLLOW 集合冲突消除),则只需通过下一个 token 唯一确定解析路径。

总结

LL(1) 解析器的特点:

L1:输入字符串从左到右扫描。

L2:推导生成最左推导

1:每次选择产生式时,最多前瞻一个 token(One Lookahead)。

自顶向下解析(Top-down Parsing):从起始符号开始逐步向下展开文法规则。

优势

• 简单高效,不需要回溯。

• 使用 FIRST 和 FOLLOW 集合预测下一步选择的产生式。

适用场景

• 适用于无二义性的上下文无关文法,且文法规则满足 LL(1) 条件。

Aims

o What is a recursive descent parser

o How does it work?Why does it work?

o How to process a non-terminal

o Work out examples

Top-down parsing

o Constructing the parsing tree from top (root) to bottom(leaves)

o From the start S derives strings (w)

Top-Down Parsing 详细解读

概述

Top-down parsing 是一种从语法树的根节点(起始符号 )开始,逐步向下扩展到叶子节点的解析方法。

工作原理

  1. 从根节点开始

• 根节点对应文法的起始符号  $S$ 。

• 目标是通过一系列推导,生成符合输入字符串  $w$  的语法树。

  1. 逐步展开

• 选择当前非终结符的合适产生式进行替换。

• 每一步解析时,检查输入流中的符号,匹配合适的文法规则。

  1. 从左到右扫描

• Top-down parsing 按照输入字符串从左到右的顺序进行匹配,逐个处理输入的符号。

  1. 递归展开

• 在处理非终结符时,递归调用,展开对应的产生式,逐步构建解析树。

• 例如对于产生式  $S \rightarrow A B$ :

• 先展开  $A$

• 然后展开  $B$

过程示例

给定文法  $G$  和输入字符串  $w$ :

• 文法规则:$S \rightarrow A B, \quad A \rightarrow a, \quad B \rightarrow b$

• 输入字符串  $w = “ab”$ 。

步骤解析

  1. Step 1: 从起始符号  S  开始:$S \Rightarrow A B$

  2. Step 2: 替换  A :

• 根据  $A \rightarrow a$ ,得到:$A \Rightarrow a$

所以, S  推导为:$S \Rightarrow a B$

  1. Step 3: 替换  B :

• 根据  $B \rightarrow b$ ,得到:$B \Rightarrow b$

所以,最终推导完成:$S \Rightarrow a b$

Top-down Parsing 特点

  1. 自顶向下(Top-down):

• 从文法的起始符号开始,逐步展开产生式,构建语法树。

  1. 逐步匹配

• 每次只处理当前的非终结符输入符号,选择合适的产生式进行替换。

  1. 递归调用

• 对非终结符的展开通过递归实现,直到所有非终结符被终结符替代为止。

  1. 无回溯(LL(1))

• 如果文法满足 LL(1) 条件,每一步替换都是确定的,不需要回溯。

Top-down Parsing 优势

  1. 直观易懂

• 解析过程直接对应语法树的生成过程,自顶向下构建树结构。

  1. 简单实现

• 通过递归函数或预测表(如 LL(1) 解析器)可以实现。

  1. 适用于 LL(1) 文法

• 在满足 LL(1) 条件的文法中,Top-down parsing 可以高效、准确地解析输入字符串。

总结

Top-down parsing 的核心思想是自顶向下逐步展开文法规则:

根节点:起始符号  $S$ 。

中间节点:非终结符,通过产生式替换展开。

叶子节点:终结符,最终匹配输入字符串中的符号。

这种方法适用于结构清晰、无二义性的上下文无关文法,尤其是 LL(1) 文法。

We have a grammar: G (E)

截屏2024-12-16 22.28.49.png