2 文法和语言
发布日期:2021-06-29 18:38:27 浏览次数:2 分类:技术文章

本文共 6003 字,大约阅读时间需要 20 分钟。

文章目录

  • 一个程序语言是一个记号系统,
  • 如同自然语言,它完整定义包括语法和语义。
  • 语法指一组规则,
    • 用它可形成和产生一个合适的程序。
    • 目前广泛使用的手段是上下文无关文法,
    • 即用上下文无关文法作为
      • 程序设计语言语法的描述工具。
  • 语法只定义什么样的符号序列是合法的,与这些符号的含义毫无关系,
  • 对Pascal,一个上下文无关文法可定义符号串A:=B+C是合乎语法的,A:=B+不。
  • 若B实型,C布尔,或B、C中任何一个没事先说明,
    • 则A:=B+C仍错,
    • 也就是说程序结构上的这种特点
      • 类型匹配、变量作用域等
      • 无法用上下文无关手段检査的,
      • 这些属语义分析
  • 程序语言的语义分两:静态语义和动态语义
  • 静态语义是一系列限定规则
    • 并确定哪些合乎语法的程序是合适的;
  • 动态语义也称运行语义或执行语义,
    • 表明程序要做啥,要计算啥。

语言的完整含义包括语法和语义

语法只定义什么样的符号序列是合法的

  • 阐明语法的一个工具是文法,
  • 这是形式语言理论的基本概念。
  • 本章介绍文法和语言的概念,
    • 重点论上下文无关文法及其句型分析中的有关问题

文法是一个工具,来阐明语法

上下文无关文法看来是文法这个工具的一种啊哈哈哈

  • 阐明语义比阐明语法困难,
  • 形式语义学的研究取大进展,
  • 但仍没有哪一种公认的形式系统
    • 可用来自动构造正确的编译系统。
  • 本书不对形式语义学介绍。

2.1 文法的直观概念

  • 给出文法和语言的定义前,先直观认识文法的概念。

  • 当表述一种语言时,
  • 无非是说明这种语言的句子,
    • 如果语言只含有穷多个句子
    • 则只需列出句子的有穷集就行,
  • 但对有无穷多个句子的语言
    • 如何给出它的有穷表示

  • 自然语言
  • 无法列出全部句子,但可给出一些规则,用这些规则来说明(或定义)句子的组成结构,
  • “我是大学生”是个句子。
  • 汉语句子可由主语后随谓语而成,
    • 构成谓语的是动词和直接宾语,
  • 用1章的EBNF表示这种句子的构成规则

句子由主语和谓语组成

主语又有谁啊???

一个一个套下去啊

  • “我是大学生”符合上规
    • “我大学生是”不符合,即它不是句子
    • 这些规则成为判别句子结构合法与否的依据,换句话说,将这些规则看成是一种元语言,用它描述汉语
    • 这里仅仅涉及汉语句子的结构描述。
    • 这样的语言描述称为文法

这特妈叫文法啊?

这些规则就特码叫文法啊?

有了规则,我就能生成一个句子了哈哈哈

  • 一旦有了一组规则后,如下方式用它们去推导或产生句子。
  • 开始去找::=左端的带有<句子>的规则
    • 并把它表示成::=右端的符号串,
    • 这个动作表示成:<句子> ⇒ \Rightarrow <主语><谓语>,
    • 然后在得到的串<主语><谓语>中,选取<主语>或<谓语>,
    • 再用相应的规则::=右端代替
  • 选取<主语>,并用规则<主语>::=<代词>,得到
    • <主语><谓语> ⇒ \Rightarrow <代词><谓语>
    • 重复做下去,得到句子“我是大学生”的全部动作过程如下
  • ⇒ \Rightarrow
    • 使用一条规则,代替其左端的某个符号,产生其右端的符号串。

  • 按上述办法,不仅生成“我是大学生”这样的句子
  • 还可生成“王明是大学生”,王明学习英语”等其他句子
  • 用文法作为工具,不仅为严格定义句子结构,也是为了用适当条数的规则把语言的全部句子描述出来
    • 可以说文法是以有穷的集合刻画无穷的集合的一个工具。

文法是以有穷的方式刻画无穷集合的工具

2.2符号和符号串

  • 英语是由句子组成的集合
    • 句子由单词和标点符号组成的序列
  • Pascal或C是由一切Pascal程序或C程序组成的集合
    • 程序由if begin、end的符号及字母和数字基本符号组成
    • 字面上每个程序都是个“基本符号”串,
  • 设有一基本符号集,
    • Pascal或C可看成是在这个基本符号集上定义的、按一定规则构成的一切基本符号串组成的集合
  • 为给出语言的形式定义,先讨论符号和符号串

1.字母表

  • 是元素的非空有穷集合,字母表中的元素称为符号,因此字母表也称为符号集
  • C的字母表由字母、数字、若干专用符号及char、 struct、if、do之类的保留字组成。

C 的字母表是啥

2.符号串

  • 字母表中的符号组成的任何有穷序列称符号串
  • 符号顺序是很重要
  • 可用字母表示符号串,如x=STR表示“x是由符号S、T和R,并按此顺序组成的符号串”。

  • 某符号串 x x x中有 m m m个符号,则称其长度为m
    • ∣ x ∣ = m |x|=m x=m

  • 允许空符号串,即不含任何符号的符号串,长度为0

∣ ε ∣ = 0 |\varepsilon|=0 ε=0

头尾,固有头,固有尾

  • 1)符号串的头尾,固有头和固有尾
  • x = x y x=xy x=xy是一符号串,
    • x x x是的头, y y y是的尾,
    • 如果 x x x非空,那么 y y y是固有尾;
    • 同样,如果y非空,那么x是固有头。
  • z = a b c z=abc z=abc,
    • z z z的头是 ε \varepsilon ε, a a a, a b ab ab a b c abc abc
      • a b c abc abc外其都固有头
  • z z z的尾是 ε \varepsilon ε, c , b c 和 a b c c,bc和abc c,bcabc;
    • 固有尾: ε \varepsilon ε, c c c, b c bc bc

  • 对符号 z = x y z=xy z=xy的头感兴趣其余不感兴趣时
    • z = x . . . z=x... z=x...
  • 只强调 x x x在符号串 z z z中的某处出现,
    • z = . . . x . . . z=...x... z=...x...
  • 符号 t t t是符号串 x x x的第一个符号,则 x = t . . . x=t... x=t...

  • 2)符号串的连接
  • x = S T x=ST x=ST, y = a b u y=abu y=abu,
  • 则它们的连接 x y xy xy= S T a b u STabu STabu,
  • 看出 ∣ x ∣ = 2 , ∣ y ∣ = 3. ∣ x y ∣ = 5 |x|=2,|y|=3.|xy|=5 x=2,y=3.xy=5
  • 显然 ε x = x ε = x \varepsilon x=x \varepsilon=x εx=xε=x

  • 3)符号串的方幂
  • x x x是符号串,把 x x x自身连接 n n n次得到符号串 x x x,即 z = x x … x x z=xx…xx z=xxxx,称为符号串 x x x的方幂, z = x n z=x^n z=xn
  • x = A B x=AB x=AB,
    • x 0 = ε x^0=\varepsilon x0=ε
  • 对于n>0有

x n = x n − 1 x = x x n − 1 x^n=x^{n-1}x=xx^{n-1} xn=xn1x=xxn1

符号串集合

  • 4)符号串集合
  • 若集合 A A A中的元素都是某字母表上的符号串
    • 则称A为该字母表上的符号串集合
  • 符号串集合 A A A B B B乘积

这里有一点没写啊

  • 指定字母表 Σ \Sigma Σ
    • Σ ∗ \Sigma^* Σ表示 Σ \Sigma Σ上所有有穷长的串的集合。
  • {0,1}
    Σ ∗ \Sigma^* Σ={ ε \varepsilon ε,0,1,00,01,10,11,000,001,010,…},
  • 也可表为字母表的方幂形式
  • Σ ∗ \Sigma^* Σ称为集合 Σ \Sigma Σ的闭包

  • Σ ∗ \Sigma^* Σ有可数的无穷数量的元素。
  • 对所有的 Σ \Sigma Σ,有 ε ∈ Σ ∗ \varepsilon\in\Sigma^* εΣ

这里还有可数啊

2.3文法和语言的形式定义

  • 这里用2.2节所引用的术语,
    • 将2.1节中描述汉语句子的规则加以形式化,
    • then给出文法和语言的形式定义

以前那个汉语的规则就叫文法

  • 规则,也称重写规则产生式生成式,
    • 是形如 α → β \alpha\to \beta αβ α : : = β \alpha::=\beta α::=β ( α , β ) (\alpha,\beta) (α,β)有序对,
    • 规则的左部,规则的右部。
    • → ( : : = ) \to(::=) (::=)读作“定义为”
  • A → a A\to a Aa读作“A定义为a”
    • 也把它说成是一条关于A的规则(产生式)。

关于句子的规则就是主语和谓语

  • 定义2.1
  • 文法 G G G定义为四元组 ( V N , V T , P , S ) (V_N,V_T,P,S) (VN,VT,P,S)
  • V N V_N VN为非终结符(或语法实体,或变量)集;
  • V T V_T VT为终结符集;
  • P P P为规则 ( α → β ) (\alpha\to\beta) (αβ)的集合
  • α ∈ ( V N ∪ V T ) ∗ \alpha\in (V_N\cup V_T)^* α(VNVT)且至少包含一个非终结符,
    • β ∈ ( V N ∪ V T ) ∗ \beta\in (V_N\cup V_T)^* β(VNVT)
    • V N , V T V_N,V_T VN,VT P P P是非空有穷集。
  • S S S称识别符或开始符,是非终结符,
    • 至少要在一条规则中作为左部出现
  • V N V_N VN V T V_T VT不含公共

特码的,为啥左边至少包含一个非终结符,而且S至少要出现在一条规则的左部

  • 常用 V V V表示 V N ∪ V T V_N\cup V_T VNVT,
  • V V V称为文法 G G G的字母表或字汇表

  • 例2.1
  • 文法 G = ( V N , V T , P , S ) G=(V_N,V_T,P,S) G=(VN,VT,P,S)
    • V N = { S } V_N=\{S\} VN={
      S}
      , V T = { 0 , 1 } V_T=\{0,1\} VT={
      0,1}
    • P = { S → 0 S 1 , S → 01 } P=\{S\to 0S1,S\to 01\} P={
      S
      0S1,S01}
    • 非终结符集中只含一个元素S;
    • 终结符集由两元素0和1
    • 有两条产生式;
    • 开始符是S

  • 例2.2
  • V N = { 标 识 符 , 字 母 , 数 字 } V_N=\{标识符,字母,数字\} VN={
    ,,}
  • V T = { a , b , c , … , x , y , z , 0 , 1 , … , 9 } V_T=\{a,b,c,…,x,y,z,0,1,…,9\} VT={
    a,b,c,,x,y,z,0,1,,9}
  • 尖括号括起非终结符。

尖括号括起的都是 V N V_N VN

草他妈的,不是说 V N V_N VN V T V_T VT不相交的吗

特码的,非终结符应该指的是标识符,字母,数字这三个东西,现在你理解了为啥 V N V_N VN V T V_T VT不相交了吧

  • 不将文法G的四元组显式表示出,只将产生式写出
  • 约定,第1条产生式的左部是识别符
  • 尖括号括起的非终结符,
    • 不用尖括号括起来的是终结
  • 或用大写非终结符,小写终结符。
  • 也有习惯,将 G G G写成 G [ S ] G[S] G[S],
    • S S S是识别符

不是说,S是开始符,识别符就是开始符啊!

  • 例2.1写成

G : S → 0 S 1 G:S\to 0S1 G:S0S1

S → 01 S\to 01 S01

G [ S ] : S → 0 S 1 G[S]:S\to 0S1 G[S]:S0S1

S → 01 S\to 01 S01

  • 为定义文法所产生的语言,还需引入推导的概念

  • 定义 V ∗ V^* V中的符号之间的关系

  • 直接推导 ⇒ \Rightarrow

  • 长度为 n ( n ≥ 1 ) n(n≥1) n(n1)的推导 ⇒ + \stackrel{+}{\Rightarrow} +

  • 和长度为 n ( n ≥ 0 ) n(n≥0) n(n0)的推导 ⇒ ∗ \stackrel{*}{\Rightarrow}

  • 定义2.2
  • α → β \alpha\to \beta αβ
  • 文法 G = ( V N , V T , P , S ) G=(V_N,V_T,P,S) G=(VN,VT,P,S)的规则(或说是 P P P中的一个产生式)
  • γ \gamma γ δ \delta δ V ∗ V^* V中任意符号
  • 若有符号串 v , w v,w v,w满足

v = γ α δ v=\gamma \alpha \delta v=γαδ

w = γ β δ w=\gamma \beta \delta w=γβδ

  • 则说 v v v(应用规则谁)直接产生 w w w,
  • w w w v v v的直接推导,
  • w w w直接归约到 v v v v ⇒ w v\Rightarrow w vw

  • 例2.1的文法G,直接推导的例子
  • v = 0 S 1 v=0S1 v=0S1, w = 0011 w=0011 w=0011,直接推导:
    • 0 S 1 ⇒ 0011 0S1\Rightarrow 0011 0S10011,
    • 使用的规则: S → 01 S→01 S01, γ = 0 , δ = 1 \gamma=0,\delta=1 γ=0,δ=1
  • S , 0 S 1 S,0S1 S,0S1,规则: S → 0 S 1 S→0S1 S0S1
    • ϵ \epsilon ϵ
  • 0S1,00S11,
    • 规则:S→0S1

  • 例2.2的文法G直接推导例子

  • 定义2.3
  • 存在直接推导的序列

v = w 0 ⇒ w 1 ⇒ w 2 ⋯ ⇒ w n = w ( n > 0 ) v=w_0\Rightarrow w_1 \Rightarrow w_2\cdots \Rightarrow w_n =w(n>0) v=w0w1w2wn=w(n>0)

  • 则称 v v v推导出(产生) w w w(推导长度为),
  • 或称 w w w归约到 v v v
  • v ⇒ + w v\stackrel{+}{\Rightarrow}w v+w

  • 定义2.4
  • v ⇒ + w v\stackrel{+}{\Rightarrow}w v+w,或 v = w v=w v=w,
  • 则记作 v ⇒ ∗ w v\stackrel{*}{\Rightarrow}w vw

转载地址:https://cyj666.blog.csdn.net/article/details/103228185 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:const char *p和char * const p和啥巴拉巴拉
下一篇:route

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月12日 04时07分22秒