程序语言的语法描述

程序语言的语法描述

该系列博文都是对网上的一些学习资料的总结,特别感谢吴伟大佬和王挺老师的课程资源,以及网上其他大佬的博文分享。这里放出一些链接:

1. 一些基本概念

1.1 字的概念

  • 考虑一个有穷字母表 Σ \Sigma Σ字符集

  • 其中每一个元素称为一个字符

  • Σ \Sigma Σ上的(也叫字符串)是指由 Σ \Sigma Σ中的字符所构成的一个有穷序列

  • 不包含任何字符列的序列称为空字,记为 ε \varepsilon ε

  • Σ ∗ \Sigma^* Σ表示 Σ \Sigma Σ上的所有字的全体,包含空字 ε \varepsilon ε

  • 例如:设 Σ = { a , b } \Sigma=\{a,b\} Σ={a,b},则

Σ ∗ = { ε , a , b , a a , a b , b a , b b , a a a , . . . } \Sigma^* = \{\varepsilon, a, b, aa, ab, ba, bb, aaa, ...\} Σ={ε,a,b,aa,ab,ba,bb,aaa,...}

  • Σ ∗ \Sigma^* Σ的子集U和V的连接(积)定义为
    U V = { α β ∣ α ∈ U & β ∈ V } UV = \{\alpha\beta|\alpha\in U \& \beta \in V\} UV={αβαU&βV}

  • V V V自身的n次积记为

V n = V V V . . . V V^n = VVV...V Vn=VVV...V

  • 规定 V 0 = { ε } V^0=\{\varepsilon\} V0={ε}
  • V ∗ = V 0 ∪ V 1 ∪ V 2 . . . V^* = V^0\cup V^1 \cup V^2 ... V=V0V1V2... V ∗ V^* V V V V的闭包
  • V + = V V ∗ V^+ = VV^* V+=VV, 称 V + V^+ V+ V V V的正规 闭包

这里正规闭包其实和闭包的区别在于空字,如果V本身不包含空字,V的闭包是包含空字的,但是V的正则闭包不包含空字。如果V本身就包含空字,则V的闭包和正则闭包是完全一样的。

1.2 上下文无关文法

  • 文法:描述语言的语法结构和形式规则

  • 上下文无关文法G是一个四元式

G = ( V T , V N , S , P ) G=(V_T, V_N, S,P) G=(VT,VN,S,P)

  • 其中:

    • V T V_T VT终结符集合(非空)
    • V N V_N VN: 非终结符集合(非空),且 V T ∩ V N = ∅ V_T \cap V_N=\emptyset VTVN=
    • S S S : 文法的开始符号 S ∈ V N S \in V_N SVN
    • P P P : 产生式集合(有限), 每个产生式形式为
      • P → α , P ∈ V N , α ∈ ( V t ∪ V N ) ∗ P \rightarrow \alpha, P \in V_N, \alpha \in (V_t \cup V_N)^* Pα,PVN,α(VtVN)
  • → \rightarrow 也可以用 : : = ::= ::=表示,这种表示称为巴克斯范式(BNF)

  • 几点约定

    • P → α 1 P \rightarrow \alpha_1 Pα1

      P → α 2 P \rightarrow \alpha_2 Pα2 可以缩写为 P → α 1 ∣ α 2 ∣ . . . ∣ α n P \rightarrow \alpha_1|\alpha_2|...|\alpha_n Pα1α2...αn

    其中,“|"读成或, 称 α i \alpha_i αi P P P的一个候选式

  • 定义: 称 α A β \alpha A \beta αAβ直接退出 α γ β \alpha \gamma \beta αγβ,即

α A β ⇒ α γ β \alpha A \beta \Rightarrow \alpha\gamma\beta αAβαγβ

​ 仅当 A → γ A \rightarrow \gamma Aγ是一个生产式,且 α , β ∈ ( V T ∪ V N ) ∗ \alpha, \beta \in (V_T \cup V_N)^* α,β(VTVN)

  • 如果 α 1 ⇒ α 2 ⇒ . . . ⇒ α n \alpha_1 \Rightarrow \alpha_2 \Rightarrow ... \Rightarrow \alpha_n α1α2...αn,则我们称这个序列是从 α 1 \alpha_1 α1 α n \alpha_n αn推导,则称 α 1 \alpha_1 α1可以推导 α n \alpha_n αn
  • 对文法 G ( E ) : E → i ∣ E + E ∣ E ∗ E ∣ ( E ) G(E): E \rightarrow i| E+ E| E*E| (E) G(E):EiE+EEE(E) (需要标明开始符号)
  • 通常,用 α 1 ⇒ + α n \alpha_1 \Rightarrow ^+ \alpha_n α1+αn表示从 α 1 \alpha_1 α1出发,经过一步或若干步,可以推出 α n \alpha_n αn
  • α 1 ⇒ ∗ α n \alpha_1 \Rightarrow ^ * \alpha_n α1αn表示,从 α 1 \alpha_1 α1出发,经过0步或若干步,可以推出 α n \alpha_n αn
  • 从一个句型到另一个句型的推导往往不唯一
  • 最左推导:任何一步 α ⇒ β \alpha \Rightarrow \beta αβ都是对 α \alpha α中最左非终结符进行替换
  • 最右推导:任何一步 α ⇒ β \alpha \Rightarrow \beta αβ都是对 α \alpha α中最右非终结符进行替换
  • 定义:假定一个G是一个文法, S是它的开始符号。如果 S ⇒ ∗ α S \Rightarrow ^* \alpha Sα,则称 α \alpha α是一个句型。仅包含终结符号的句型是一个句子。文法G产生的句子的全体是一个语言。将它记为L(G)。

L ( G ) = { α ∣ S ⇒ α , α ∈ V t ∗ } L(G) = \{ \alpha | S \Rightarrow \alpha, \alpha \in V ^*_t\} L(G)={αSα,αVt}

1.2.1 例题
  • 文法 G ( A ) : A → c ∣ A b G(A): A \rightarrow c| Ab G(A):AcAb, G(A)的语言?

​ cbb…b 即 以c开头,后面接任意个b

  • 文法 G ( S ) : G(S): G(S):

    S → A ∣ B S \rightarrow A|B SAB

    A → a A ∣ a A \rightarrow aA|a AaAa

    B → b B ∣ b B \rightarrow bB|b BbBb

aaa…ab…b 即以n个a开始(n>1) 后接m个b(m>1)

  • 给出产生语言为 { a n b n ∣ n ≥ 1 } \{a^nb^n|n \ge 1\} {anbnn1}的文法

G ( S ) : S → a S b ∣ a b G(S): S \rightarrow aSb | ab G(S):SaSbab

  • 给出产生语言为 { a m b n ∣ 1 ≤ n ≤ m ≤ 2 n } \{a^mb^n|1\le n\le m \le 2n\} {ambn1nm2n}的文法

G ( S ) : S → a b ∣ a a b ∣ a S b ∣ a a S b G(S): S \rightarrow ab|aab |aSb|aaSb G(S):SabaabaSbaaSb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值