文法、语言、正则表达式

文法的形式定义于分类

一个上下文无关文法有四个元素组成:

  • 一个终结符号集合,也称为词法单元。
  • 一个非终结符号集合,也称为语法变量。
  • 一个产生式集合。
  • 一个开始符号。

文法G可以抽象成四元组的形式:G=(VN,VT,P,S)

其中VN表示非终结符集,VT表示终结符集,P表示产生式集,S表示开始符号。

文法G描述的语言用L(G)表示L(G)={w|w∈VT*且S=+>w}

  • 符号串w从开始符号推导出来
  • w仅由终结符号组成
  • w称为该语言的句子
  • L(G)由所有这样的句子构成

约定:

  • 大写字母A~Z表示非终结符,或用尖括号把非终结符括起来。
  • 前面的小写符号a、b、c表示单个终结符号。
  • 后面的小写字母u、v、w、x、y、z以及α、β、γ等符号表示(VT∪VN)上的符号串。

文法的分类:

  1. 0型文法:无限制文法、短语文法,α->β,α中至少含一个非终结符。
  2. 1型文法:上下文有关文法,α->β满足|α|<=|β|,对于产生式α12->α1βα2,用β替换A时,只能在上下文为α1和α2时才能进行。
  3. 2型文法:上下文无关文法,A->β,其中A为单个非终结符,当用β替换A时,与A的上下文环境无关。
  4. 3型文法:正则文法,每个产生式形为A->aB或A->a。

分别被四种自动机识别:

  1. 图灵机
  2. 线性界线自动机
  3. 下推自动机
  4. 有穷自动机

串和语言和语言上的运算

字母表是一个有限的符号集合。

某个字母表上的串是该字母表中符号的一个有穷序列。

语言是某个给定字母表上任意的可数的串集合。

串的基本术语有:前缀prefix、后缀suffix、子串substring、真前缀真后缀真子串、子序列subsequence。

定义两个串的乘积为两个串的连接。

定义指数运算:s0=ε,并且对于i>0,si为si-1s。因为εs=s,由此可知s1=s,s2=ss,以此类推。

语言上最重要的运算有:并、连接和闭包、正闭包。

例:令L表示字母的集合{A,B,...,Z,a,b,...,z},令D表示数位的集合{0,1,...,9}。将L和D看做语言,它们所有串的长度都为1。

根据运算符从L和D中构造新语言:L∪D、LD、L4、L*、L(L∪D)*、D+

正则表达式

正则表达式可以由较小的正则表达式按照如下规则递归的构建。每个正则表达式r表示一个语言L(r),这个语言也是根据r的字表达式所表示的语言递归的定义的。

归纳基础

  1. ε是一个正则表达式,L(ε)={ε}。
  2. 如果a是Σ上的一个符号,那么a是一个正则表达式,L(a)={a}。

归纳步骤

假定r和s都是正则表达式,分别表示语言L(r)和L(s),那么:

  1. (r)|(s)是一个正则表达式语言,表示语言L(r)∪L(s)。
  2. (r)(s)是一个正则表达式语言,表示语言L(r)L(s)。
  3. (r)*是一个正则表达式语言,表示语言(L(r))*。
  4. (r)是一个正则表达式语言,表示语言L(r)。

进行如下约定丢掉括号:

  1. 一元运算符*具有最高的优先级,并且是左结合的。
  2. 连接具有次高的优先级,它是左结合的。
  3. |的优先级最低,也是左结合的。

可以用一个正则表达式定义的语言叫做正则集合。如果两个正则表达式r和s表示同样的语言,则称r和s等价,记做r=s。

一些对任意正则表达式r、s、t都成立的代数定律:

  • r|s=s|r,|交换律
  • r|(s|t)=(r|s)|t,|结合律
  • r(st)=(rs)t,连接结合律
  • r(s|t)=rs|rt;(s|t)r=sr|tr,连接分配率
  • εr=rε=r,ε是连接的单位元
  • r*=(r|ε)*,闭包中一定包含ε
  • r**=r*,*具有幂等性

如果∑是基本符号的集合,那么一个正则定义是具有如下形式的定义序列:di=ri(1<=i<=n)

  • 每个di都是一个新符号,它们都不在∑中,并且各不相同。
  • 每个ri是字母表∑∪{d1,...,di-1}上的正则表达式。避免递归定义问题。
时间: 2024-10-06 20:04:49

文法、语言、正则表达式的相关文章

笔记整理——Linux下C语言正则表达式

Linux下C语言正则表达式使用详解 - Google Chrome (2013/5/2 16:40:37) Linux下C语言正则表达式使用详解 2012年6月6日Neal627 views发表评论阅读评论 标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库,许多Linux发行版本都带有这个函数库. C语言处理正则表达式常用的函数有regcomp

C语言正则表达式

#include <sys/types.h> #include <regex.h> int regcomp(regex_t *preg, const char *regex, int cflags); int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags); size_t regerror(int errcode, const regex

cocos2dx下C++11正则表达式和android下C语言正则表达式的使用--------案例密码校验

/************************************************************************/ /* 密码校验 */ /* C++11下没有问题,但是C语言是有问题的 */ /* 错误案例:^[[email protected]#$%^&*()_+`\\-={}\\[\\]:\";'<>?,.\\/]{6,20}$ 正确案例:^[][email protected]#$%^&*()_+`={}:;'<>

C语言正则表达式详解 regcomp() regexec() regfree()详解

标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库,许多Linux发行版本都带有这个函数库. C语言处理正则表达式常用的函数有regcomp().regexec().regfree()和regerror(),一般分为三个步骤,如下所示: C语言中使用正则表达式一般分为三步: 编译正则表达式 regcomp() 匹配正则表达式 regexec() 释

R语言-正则表达式1

R语言的正则表达式主要用来处理文本资料,比如进行查找.替换等等. 首先是一些处理文本时会用到的函数: 字符串分割:strsplit() 字符串连接:paste(),paste0() 计算字符串长度:nchar(),length() 字符串截取:substr(),substring() 查看是否存在某个字符:grep(p,x) <返回匹配到的元素的下标(位置),p是一个正则表达式 grepl(p,x)<返回逻辑值false or true 举个栗子: s<-c("123abc\\

go语言正则表达式-实践教程

正则表达式处理使用到的库 regexp 使用到regexp库函数有 MustCompile 和 Compile MustCompile 的作用和 Compile 一样, 将正则表达式编译成一个正则对象(使用 PERL 语法). 该正则对象会采用"leftmost-first"模式.选择第一个匹配结果.如果正则表达式语法错误,则返 回错误信息.不同的是,当正则表达式 str 不合法时,MustCompile 会抛出异常,而 Compile 仅返回一个 error 值 FindString

各语言正则表达式

韩语正则 [\uAC00-\uD7A3] 阿拉伯语正则 1:[\x{0600}-\x{06FF}] 2:[?-?] 点击我 在点我 hello world!

Go语言之正则表达式

[TOC] Go语言正则表达式 方式一:使用Compile package main import ( "fmt" "regexp" ) const text = "my email is [email protected]" func main() { //re 是 正则表达式的匹配器 re, err := regexp.Compile("[email protected]") if err != nil { panic(e

南瓜不说话(M01)-正则表达式原理

文法 一个文法可以用一个四元来定义,G = {Vt,Vn,S,P} Vt:一个非空有限的符号集合,它的每个元素称为终结符号; Vn:一个非空有限的符号集合,它的每个元素称为非终结符号,并且Vt∩Vn=Φ; S∈Vn,称为文法G的开始符号; P是一个非空有限集合,它的元素称为产生式; 产生式是指,其形式为α→β,α称为产生式的左部,β称为产生式的右部,符号"→"表示"定义为",并且α.β∈(Vt∪Vn)*,α≠ε,即α.β是由终结符和非终结符组成的符号串; 开始符S必

JS正则表达式大全(整理详细且实用)

JS正则表达式大全(整理详细且实用).需要的朋友可以过来参考下,希望对大家有所帮助!! 正则表达式中的特殊字符 字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界. -或- 对正则表达式功能字符的还原,如"*"匹配它前面元字符0次或多次,/a*/将匹配a,aa,aaa,加了"\"后,/a\*/将只匹配"a*".