编译原理:一个简单的语法制导翻译器

2.2 文法的形式化描述

  • 一个文法包括若干产生式,产生式耶称重写规则规则
  • (上下文无关文法)的产生式写作:

U : : = u 或者 U → u

其中:
U是一个文法符号,称为左部
u是有穷文法符号串,称为右部

文法的形式化描述
巴科斯-瑙尔范式(Backus-Naur Form, BNF)
用尖括号包围非终结符来标记非终结符
终结符带有下划线
符号::=表示“推导出”
符号|表示“还能推导出”
在这里插入图片描述

上下文无关文法

  • 是四元组,包括:
    终结符(terminal)集
    文法所定义语言的基本符号的集合
    仅仅出现在产生式右部(体)
    非终结符(non-terminal)集
    在某个产生式的左部出现过的文法符号
    产生式(production)集
    开始符(start symbol)
    两种说明方式:
    (1) 明确指出,如G[A]
    (2) 第1条产生式规则左部的文法符号

例子
在这里插入图片描述
在这里插入图片描述

推导

  • 开始符出发,不断将某个非终结符替换为该非终结符的某个产生式的右部。
  • 推导的符号:在这里插入图片描述
  • 语言:从开始符出发,利用推导能得到的所有终结符号串的集合
  • 上下文无关文法生成的语言称为上下文无关语言

在这里插入图片描述

  • 符号的有穷序列
  • 串的表示:
    • a2 表示 aa
    • a2b2 表示 aabb
    • 闭包:a*表示{ε, a, aa, aaa, aaaa, …}
    • 正闭包:a+表示{a, aa, aaa, aaaa, …}
    • 设A={a,b,c},则A*表示{ε,a,b,c,aa,ab,ac,ba,bb,bc,ca,cb,cc,aaa,…}
  • 串的长度:串中含有的符号个数

句型和句子

在这里插入图片描述

文法和语言

  • 文法和语言的关系
    • 给定文法,就唯一地确定语言
    • 给定语言,能给出文法,但文法不唯一
  • 等价文法
    • G1G2是两个文法,若L(G1)=L(G2),则称G1G2为等价文法。

例子1
(1)文法A→ aAb | ab对应的语言为:
L(G[A])={anbn|n≥1}

(2) 文法S:S→xSx| xS|y所识别的语言为:
L(G[S])={xmyxn|m≥n≥0}

(3) 文法G:S → xxS | y 所识别的语言为:
L(G[S])={x2ny|n≥0}
也可以写成 *L(G[S])=(xx)y

例子2
(1) 语言L={abna|n≥1}对应的文法可以为:
A → aBa B → b|bB 或
A → aB B → ba|bB 或……
(2) 语言L={a2nb|n≥1}对应的文法可以为:
A →Bb B → aa|aaB 或
A → aab | aaA 或……
(3) 语言L={ambnck|m=n或n=k}对应的文法可以为:
S → AB | DE A → aAb | ε B → cB | ε
D → aD | ε E → bEc | ε

语法分析树

  • 以图形方式描述推导过程
  • 语法分析树的构成:
    • 根节点是开始符
    • 叶节点是终结符( token)和 ε
    • 内部节点(非叶结点)是非终结符
    • 如果应用了规则A → x1x2…xn, 则A是内部结点; **x1 , x2 , … ,xn**是子结点
      在这里插入图片描述

综合例

考虑文法:S → SS+ | SS* | a
1)试推导出串aa+a*
(先推出SS*)
在这里插入图片描述
2)试为这个串构造一棵语法分析树
3)该文法生成的语言是什么?
后缀表达式

二义性

基于一个文法,若有多棵分析树生成同一个终结符号串,则此文法具有二义性。
本课程只讨论文法二义,不涉及语义二义。
语义二义例:Jack said Tom left his assignment at home.

可能基于优先级结合性来构建无二义的文法

  • 四则运算存在两个优先级,所以可引入两个非终结符expr和term来对应不同的抽象层级
  • 四则运算均为左结合,因此每条规则中,更为抽象的非终结符应位于左边
    在这里插入图片描述
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_71290816/article/details/129281172
今日推荐