编译原理学习笔记之上下文无关文法

编译原理学习笔记之上下文无关文法一 上下文无关文法 1 定义上下文无关文法是这样一个四元组 VT VN S P VT 终结符集合 非空有限集合 记号名是其同义词 VN 非终结符集合 非空有限集合且 VT VN S 开始符号 P 产生式集合 形如 A gt a A VN a VN VT 其中 终结符可以理解为词法单元 即是符号的最终形式 非终结符就是匹配终结符过程中引入的中间量 例 i

一、上下文无关文法

1.定义

上下文无关文法是这样一个四元组VT , VN , S, P

VT:终结符集合,非空有限集合,记号名是其同义词

VN:非终结符集合,非空有限集合且VT∩VN=Φ

S:开始符号

P:产生式集合,形如A -> a,A∈VN,a∈(VN∪VT)*

其中,终结符可以理解为词法单元,即是符号的最终形式,非终结符就是匹配终结符过程中引入的中间量,

({
id, +, *, , (, )}, {
expr,op}, expr,P )

编译原理学习笔记之上下文无关文法

以下符号通常表示终结符:

  • 字母表中前面的小写字母,如a,b,c
  • 黑体串,idwhile
  • 数字 0,1,,9
  • 标点符号,如括号,逗号等
  • 运算符号,如+,-

以下符号通常表示非终结符

  • 字母表中前面的大写字母,如A,B,C
  • 字母S, 通常它表示开始符号
  • 小写字母的名字,如exprstmt

2.上下文无关文法与正规式比较

上下文无关文法:

E -> E A E | (E ) | E | id

A -> + | *

正规式:

letter ->[A-Za-z]

digit ->[0-9]

id ->letter(letter|digit)*

  • 正规式来定义一些简单的语言能表示给定结构的固定次数的重复或者没有指定次数的重复
  • 正规式不能用于描述配对或嵌套的结构例如配对括号串的集合

因此通过引入上下文无关文法来进行语法分析

3.推导

推导:用于确定符合文法规则所规定的结构的串的集合(用来确定一个语言)

推导从一个结构名字开始,并在得到记号串作为结束

把产生式看成重写规则,把符号串中的非终结符用其产生式右部的串来代替

例:E -> E + E | E * E | (E ) | E | id

E — E (E) (E + E) -(id + E) (id + id)

上下文无关语言:由一个文法推导出来的结果

句型:包含非终结符的推导结果

句子:全部为终结符的推导结果-》即最终结果

推导就是一个把上下文无关文法转化为句子的过程

在推到的过程中涉及到同级别表达式的替换,因此按推到顺序可以分为最左推导最右推导,顾名思义:

最左推导:推导过程中始终最先代换最左侧的文法

最右推导:推导过程中始终最先代换最右侧的文法

举个例子:

编译原理学习笔记之上下文无关文法

编译原理学习笔记之上下文无关文法

可以看出最左推导和最右推导产生的分析树结构是不一样的,为什么会产生这种情况,就是因为文法的二义性

4.二义性

文法的二义性,是指对于符合文法规则的同一个句子,存在两种可能的分析树

产生原因

类似+ 和*这种不同的优先级在文法中没有得到体现

消除方法

用层次的观点看待表达式

根据运算符优先级不同,引入新的非终结符

比如将上式产生二义性的文法引入一个中间量

E ->E + T | T

  T -> T * F | F

  F -> id | (E)

 

5.分析树

上文中多次涉及分析树,其实分析树就是根据推导过程建立的树形结构,他的所有叶子节点都是终结符,所有非叶子结点都是非终结符,根节点是文法的开始符号

6.上下文无关文法的优缺点

优点:

  • 给出了精确的,易于理解的文法说明
  • 自动产生高效的分析器
  • 可以给语言定义出层次结构
  • 以文法为基础的语言实现便于语言的修改

缺点:

文法只能描述编程的部分语法

二、NFA->上下文无关文法

  1. 确定终结符集合
  2. 为每个状态引入一个非终结符Ai
  3. 如果状态i有一个a转换到状态j,引入产生式Ai->aAj,如果i是接受状态,则引入Ai->e(空串)

编译原理学习笔记之上下文无关文法编译原理学习笔记之上下文无关文法

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233278.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 最受欢迎的网管工具集「建议收藏」

    最受欢迎的网管工具集「建议收藏」最受欢迎的网管工具集★★★日前,美国《NetworkWorld》通过读者调查,选出了最受读者欢迎的网络管理工具,我们也将它们推荐给国内的网管员们,希望能助他们一臂之力,使他们轻松排除网络故障。工具名称:SolarWindsEngineerEdition网址:www.solarwinds.net推荐理由:有读者说:“在不到一小时的时间内,我从网站上下载并安装了SolarWinds的授权版

    2022年10月6日
    4
  • 什么是promise?

    什么是promise?什么是promise?Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,promise是一个对象,从它可以获取异步操作的的最终状态(成功或失败)。Promise是一个构造函数,对外提供统一的API,自己身上有all、reject、resolve等方法,原型上有then、catch等方法。Promise的两个特点Promise对象的状态不受外界影响pending初始状态fulfilled成功状态rejected失

    2022年6月10日
    35
  • myeclipse svn插件失效

    myeclipse svn插件失效最近经常遇到这个问题,在myeclipse2016上安装svn插件是将site目录copy到dropins目录下,可能这样做会导致以后安装其他新插件时,svn插件会失效,解决方案如下:找到myeclipse安装目录下的configuration目录下的org.eclipse.update包,然后把它删除,重启myeclipse,svn就会重新出现了!麻烦 …

    2022年7月21日
    10
  • Vue-i18n 国际化

    Vue-i18n 国际化基本使用安装npminstall–savevue-i18n创建lang文件夹index.js中引入i18n并使用importVuefrom’vue’importVueI18nfrom’vue-i18n’Vue.use(VueI18n)consti18n=newVueI18n({//设置当前语言locale:’zh’,messages:{‘zh’:{name:’..

    2022年5月2日
    171
  • 点对点通信-简介

    点对点通信-简介点对点连接是两个系统或进程之间的专用通信链路。想象一下直接连接两个系统的一条线路。两个系统独占此线路进行通信。点对点通信的对立面是广播,在广播通信中,一个系统可以向多个系统传输。电话呼叫是面向电路的两部电话机之间的点对点链路。但是,呼叫通常是通过电话公司中继线多路复用的;因此虽然电路本身可能是虚拟的,但用户在进行点对点通信会话。端到端连接是指通过交换网络的两个系统间的连接。例如,因

    2022年7月15日
    16
  • python最长回文子串动态规划_最长回文子串问题

    python最长回文子串动态规划_最长回文子串问题问题描述回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。输入一个字符串Str,输出Str里最长回文子串的长度。方法一:暴力求解遍历每一个子串,再判断这个子串是不是回文串,最后判断这个串是不是最长的回文子串。遍历子串的复杂度是O(n^2),判断是不是回文串的复杂度是O(n),所以这个算法的复杂度是O(n^3)。方法二:动态规划法用一个二维的数组ai来表示从第i位到第j位的子…

    2022年6月1日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号