Java正则判断中文字符串句型_编译原理-程序设计语言及其文法【笔记】

本文介绍了如何使用Java进行中文字符串的正则判断,并深入探讨了编译原理的基础概念,包括字母表的运算(乘积、幂、正闭包、克林闭包)、串的定义与运算(连接、幂)、文法的形式化定义、语言的推导与规约,以及文法的分类。通过实例解析了文法规则和语言的生成过程,帮助读者理解文法与正则在程序设计语言中的应用。
摘要由CSDN通过智能技术生成

5e2c7c017c75cc7fd40d9288f05ca7db.png

(一) 字母表(Alphabet)

定义:字母表∑是一个有穷符号集合

符号:字 母、数符号:字 母、数、标点符号、 标点符号、 …

说明:为保证排版兼容问题,未使用 MD,HTML 等语法,本文中上标使用 ^ 下标使用 _ 例如:2^3 , X_n

(1) 字母表上的运算

下面的几种运算,可以先看例子,再回过头看上面的定义,就其实很简单了

A:字母表 ∑1 和 ∑2 的乘积 ( product)

∑1∑2={ ab | a∈ ∑1, b∈ ∑2}

例: { 0, 1} {a, b} = {0a, 0b, 1a, 1b}

B:字母表 ∑ 的n次幂 ( power)

∑0 ={ ε }

∑n =∑n-1 ∑ , n ≥ 1

例子:{0,1}^3 = {0,1}{0,1}{0,1} = {000,001,010,011,100,101,110,111}

通过举例看到字母表(数字)的3次方,最后的结果,就是一些长度为3的数字串的集合

结论:字母表的n次幂:长度为n的符号串构成的集合

C:字母表 ∑ 的正闭包(positive closure)

∑+ = ∑ ∪ ∑2 ∪ ∑3 ∪ …

例:{a, b, c, d }+ = {a, b, c, d, aa, ab, ac, ad, ba, bb, bc, bd, …..., aaa, aab, aac, aad, aba, abb, abc, …...}

结论:字母表的正闭包:长度正数的符号串构成的集合

D:字母表 ∑ 的克林闭包(Kleene closure)

∑ = ∑0 ∪ ∑+ = ∑0 ∪ ∑ ∪ ∑2 ∪ ∑3 ∪ …*

例:{a, b, c, d }* = {ε, a, b, c, d, aa, ab, ac, ad, ba, bb, bc, bd, ...…, aaa, aab, aac, aad, aba, abb, abc, …...}

注:∑0 ={ ε }

总结:字母表的克林闭包:任意符号串(长度可以为零)构成的集合

(2) 串

设∑是一个字母表,任意x∈∑*,x称为是 ∑上的一个串

串是字母表中符号的一个有穷序列

串s的长度,通常记作|s|,是指s中符号的个数

例:|aab| = 3

空串是长度为0的串,用 ε (spsilon) 表示

|ε| = 0

A:串上的运算-连接

如果 x 和 y 是串,那么 x 和 y 的连接是把 y 附加到 x 后面形成的串,记作 xy

例: x = dog ,y = house ,xy = doghouse

空串是连接运算的单位元( identity),即,对于任何串 s 都有,εs = sε = s

设x,y,z,是三个字符串,如果x = yz,则称y是x的前缀,z是x的后缀

B:串上的运算-幂

s0= ε

sn = s^(n-1)s, n ≥1

s1 = s0 s = εs = s,s2 = ss,s3 = sss,…

例:如果 s =ba,那么s1= ba,s2=baba, s3=bababa,…

结论:串s的n次幂:将n个s连接起来

(二) 文法

(1) 文法的形式化定义

G = (V_T , V_N , P , S )

A:V_T:终结符集合

终结符(terminal symbol)是文法所定义的语言的基本符号,有时也称为token

例: V_T = { apple, boy, eat, little }

B:V_N:非终结符集合

非终结符(nonterminal) 是用来表示语法成分的符号,有时也称为“ 语法变量”

➢例:V_N = { , , , , … }

C:P :产生式集合

产生式( production)描述了将终结符和非终结符组合成串的方法

产生式的一般形式:α→β 读作:α 定义为 β

α∈(V_T∪V_N)+:且α中至少包含V_N中的一个元素:称为产生式的头 (head )或左部(left side)

β∈(V_T∪V_N)* :称为产生式的体(body)或右部(right side)

D:S :开始符号

S∈VN

开始符号(start symbol)表示的是该文法中最大的语法成分

E:例子

例:G =( { id, +, *, (, ) }, {E}, P, E )

P ={

E → E + E ,

E → E * E ,

E → ( E ) ,

E → id }

约定:不引起歧义的前提下,可以只写产生式

G : E → E + E E → E * E E → ( E ) E → id

F:产生式的简写

对一组有相同左部的α产生式

α→β1, α→β2, … , α→βn

可以简记为:

α→β1| β2| … | βn

读作:α定义为β1,或者β2,…,或者βn 。 β1,β2,…,βn称为α的候选式(Candidate)

把上面的例子,再简写一下

E → E + E E → E * E E → ( E ) E → id

E → E + E | E * E | ( E ) | id

(2) 符号约定

A:终结符

① 字母表中排在前面的小写字母,如a,b,c

② 运算符,如 +、*等

③ 标点符号,如括号,逗号等

④ 数字0,1、…、9

⑤ 粗体字符串,如id,if等

B:非终结符

① 字母表中排在前面的大写字母,如A、B、C

② 字母S,通常表示开始符号

③ 小写、斜体的名字、如expr、stmt等

④ 代表程序构造的大写字母。如E(表达式)、T(项)、F(因子)

C:文法符号

① 字母表中排在后面的大写字母(如X、Y、Z)

D:终结符号串

① 字母表中排在后面的小写字母(u、v、…、z) (包括空串)

E:文法符号串

小写希腊字母,如α、β、γ (包括空串)

第一个产生式的左部就是开始符号

(三) 语言

(1) 推导和规约

给定文法G=(VT , VN , P , S ),如果 α→β ∈ P,那么可以将符号串γαδ中的α替换为β,也就是说,将γαδ,重写(rewrite)为γβδ,记作 γαδ ==> γβδ

此时,称文法中的符号串 γαδ 直接推导(directly derive)出 γβδ

简而言之,就是用产生式的右部替换产生式的左部

7e22c6f7632409d19ba2e075088563b2.png

25b39752f82742134871ad7ee5b72889.png

(2) 句型和句子

一个开始符号 S 通过若干步,可以推导出 α,则称 α 是G的一个句型

α 是一个文法符号串

如果 α 中的每一个 都是终结符,经过若干部可以推导出一个终结符号串 w,称 w 是 G 的一个句子

eb769e32cda72e5981f573b098838eda.png

17d985e58583f567a73f1e3116d1f43f.png

(3) 语言的形式化定义

b9facdf268311a553fdd72aa60561868.png

例如下面的例子: D 可以是0或1或2... 说明其定义为数字,同理L为字母

而T的定义,可以是 L(字母)、D(数字)、TL、TD,通过右侧的推导(一直替代T)可得,最后的形式是一个字母数字串

而 S 可推出,是一个字母开头的字母数字串

84fda5e600da10abdd5da4ed8c63719d.png

6293ed1b5d54730aec98342f25d797e0.png

(4) 文法的分类

A:0型文法

α --> β

无限制文法

∀ α --> β ∈ P,α中至少包含一个非终结符

0型语言

由0型文法G生成的语言L(G)

B:1型文法

上下文有关文法

∀ α --> β ∈ P,|α|≤|β|

产生式的一般形式:α1 A α2 --> α1 β α2

上下文有关语言

由上下文有关文法G构成的语言L(G)

不包含 ε-产生式

C:2型文法

上下文无关文法

∀α → β ∈P,α ∈ 非终结符

产生式的一般形式:A --> β

上下文无关语言

由上下文无关文法G构成的语言L

D:3型文法

正则文法

右线性文法:A --> wB 或 A --> w

左线性文法:A --> Bw 或 A --> w

ea9134b0b60dbe645876cebe5c06413d.png

(5) 四种文法的关系

87b02954813b618b617316db1b6bfab0.png

(四) CFG 的分析树

a59391b0595daaba6156076f2287fcd1.png

根节点的标号为文法开始符号

内部节点表示对一个产生式 A–> β 的应用,该节点的标号是此产生式左部A。该节点的子节点的标号从左到右构成了产生式的右部 β

叶节点的标号既可以是非终结符,也可以是终结符。从左到右排列叶节点得到的符号串称为这棵树的产出或边缘

(1) 分析树是推导的图形化表示

d514c7aea21a89122cf1cee9ef870611.png

(2) (句型的)短语

给定一个句型,其分析树中的每一棵子树的边缘称为该句型的一个短语

如果子树只有父子两代结点,那么这棵子树的边缘称为该句型的一个直接短语

4391babf4261c5e09aed209c0776cbc7.png

举个例子:

c00ceb7e58d907b6f6b50c9dbc37e3ca.png

(3) 二义性文法

如果一个文法可以为某个句子生成多棵分析树,则称这个文法是二义性的

1c1b27bee53e45730bc5b19057855a7e.png

9e80cc8bb906e13dec6e3e26c60aea8f.png

(4) 二义性文法的判定

3414668e025b7061bc1e13c85ef44aba.png

(五) 例题

1、文法G[S]:S→xSx|y所描述的语言是()(n≥0)正确答案(D)

A.(xux)n

B.xyxn

C.xynx

D.xnyxn

2、给定文法A→bA|ca,为该文法句子的是( ) 正确答案(C)

A. bba

B. cab

C. bca

D. cba

3、设有文法G[S]:S®S1|S0|Sa|Sc|a|b|c,下列符号串中是该文法的句子有( ) 正确答案(D)

A. ab0

B. a0b01

C. a0b0a

D. bc10

4、文法G产生的( )的全体是该文法描述的语言 正确答案(D)

A. 句型

B. 终结符集

C. 非终结符集

D. 句子

5、若文法G定义的语言是无限集,则文法必然是( ) 正确答案(A)

A. 递归的

B. 上下文无关的

C. 二义性的

D. 无二义性的

6、乔姆斯基(Chomsky)把文法分为四种类型,即0型、1型、2型、3型。其中3型文法是( ) 正确答案(B)

A. 非限制文法

B. 正则文法

C. 上下文有关文法

D. 上下文无关文法

7、一个上下文无关文法G包括四个组成部分,它们是一组非终结符号,一组终结符号,一个开始符号,以及一组( ) 正确答案(B)

A. 句子

B. 产生式

C. 单词

D. 句型

8、若一个文法是递归的,则它所产生的语言的句子( ) 正确答案(A)

A. 是无穷多个

B. 是有穷多个

C. 是可枚举的

D. 个数是常量

9、给定文法A→bA|cc,则符号串①cc ②bcbc ③bcbcc ④bccbcc ⑤bbbcc中,是该文法句子的是( ) 正确答案(D)

A. ①

B. ③④⑤

C. ②④

D. ①⑤

10、文法E→E+E|EE|i的句子ii+i*i有( )棵不同的语法树 正确答案(C)

A. 1

B. 3

C. 5

D. 7

11、文法 S→aaS|abc 定义的语言是( ) 正确答案(C)

A. {a^(2k)bc|k>0}

B. {a^(k)bc|k>0}

C . {a^(2k-1)bc|k>0}

D . {a(k)a(k)bc|k>0}

12、文法G:S→xSx| xS|y所识别的语言是() 正确答案(A)

A.

a0073c6664349ece7cd2e86a24f645a7.png

B.

a6f01f0ab636308b42a090d4190eeae3.png

C.

d866697f0ab8cdd921ca253e16335a1d.png

D.

1949caf95388435e0e4d06fc2d1f4510.png

13、由文法的开始符号出发经过若干步(包括0步)推导产生的文法符号序列称为( ) 正确答案(B)

A. 语言

B. 句型

C. 句子

D. 句柄

14、下列符号串不可以由符号集S={a,b}上的正闭包运算产生的是( ) 正确答案(A)

A. ε

B. a

C. aa

D. ab

15、文法G:S → x xS | y 所识别的语言是( ) 正确答案(D)

A.

b942e314f33013487af6ed61a92682d1.png

B.

288bec707cbe49d33ea8cc046c833de6.png

C.

1e9f593884deeba02134e9008cbc1d24.png

D.

ab7c31002864b67b7e7507c94cc4c7a2.png

16、文法G:S → xS | y 所识别的语言是( ) 正确答案(D)

A.

ef10c262f211982f0a7ef4651ec080e1.png

B.

be0fb6457430ed2d6763370afdbfe423.png

C.

1e9f593884deeba02134e9008cbc1d24.png

D.

690e48b93b5d02da67eace2f7e261085.png

(十) 结尾

如果文章中有什么不足,欢迎大家留言交流,感谢朋友们的支持!

如果能帮到你的话,那就来关注我吧!如果您更喜欢微信文章的阅读方式,可以关注我的公众号

在这里的我们素不相识,却都在为了自己的梦而努力 ❤

一个坚持推送原创开发技术文章的公众号:理想二旬不止

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值