文章目录

  • 一、二义性
    • 1.定义
    • 2.原因
  • 二、二义性的消除
    • 1.改写二义文法为非二义文法
      • (1)步骤
      • (2)例子
      • (3)缺点
    • 2.为文法符号规定优先级和结合性
    • 3.修改语言的语法(表现形式被改变)

【编译原理博客列表】》》》》》》


一、二义性

1.定义

定义3.7
若文法G对同一句子产生不止一棵分析树,则称G是二义的。

例3.7 句子id+id*id和id+id+id可能的分析树
E→E+E | E*E |(E)| -E | id

深度越深,越远离开始节点,优先级越高。
非终结符在终结符(如+)的左边是左结合,右边是右结合。

“悬空(dangling)else”问题
例3.8 条件语句 if x<3 then if x>0 then x:=5 else x:=-5
S → if C then S (1)
| if C then S else S (2)
| id := E (3)
C → E = E | E < E | E > E (4)…(6)
E → E + E | - E | id | n (7)…(10)


2.原因

原因:在产生句子的过程中某些直接推导有多于一种选择

注意:
明确最终分析树的形状,仅与文法有关,而与推导方法无关\textcolor{red}{最终分析树的形状,仅与文法有关,而与推导方法无关}最终分析树的形状,仅与文法有关,而与推导方法无关
一个句子有多于一棵分析树,是因为文法中缺少对文法符号优先级和结合性的规定

二、二义性的消除

消除文法二义的两种方法:
① 改写二义文法为非二义文法;
② 规定二义文法中符号的优先级和结合性,使仅产生一棵分析树。

左结合性:
对于A→αAβ,若A(左右都有的非终结符)在终结符(即终结符在β中)左边出现,则A产生式具有左结合性质。
如:

  • E → E + T是左结合(EA+是终结符)。
  • F → (E) | -F是右结合(FA-是终结符)

1.改写二义文法为非二义文法

(1)步骤

改写二义文法的关键步骤:

  • 划分优先级和结合性
  • 引入一个新的非终结符,增加一个子结构并提高一级优先级(优先级的判断);
  • 递归非终结符在终结符左边,运算具有左结合性,否则具有右结合性。

(2)例子

例3.10 改写二义文法
E→E+E | E*E |(E)| -E | id

  1. 优先级从低到高: [+][*][( ), -, id]
  2. 结合性:
    左结合[+, *]
    右结合[-]
    无结合[id]
  3. 非终结符与运算:
    E:+ (E产生式,左递归)
    T:* (T产生式,左递归)
    F:-,( ),id (F产生式,右递归)
E → E + T | T
T → T * F | F
F → (E) | -F | id

解决“悬空(dangling)else”问题
例3.8 条件语句 if x<3 then if x>0 then x:=5 else x:=-5
S → if C then S (1)
| if C then S else S (2)
| id := E (3)
C → E = E | E < E | E > E (4)…(6)
E → E + E | - E | id | n (7)…(10)

分析原因:if-then-else和if-then:在一个复合if语句中,可能then多于else,使得else不知与哪个then结合

一般原则是右结合,即else与其左边最靠近的then结合。
改写文法的根据是将S分为 完全匹配(MS)不完全匹配(UMS) 两类,并且在UMS中规定 else右结合

S  → MS             (1)| UMS            (2)
MS → if C then MS else MS   (3)| id := E              (4)
UMS→ if C then S           (5)    (G3.5)| if C then MS else UMS  (6)
C  → E = E | E < E | E > E  (7)...(9)
E  → E + T | T        (10)...(11)
T  → (E) | -T | id | n       (12)...(15)

(3)缺点

  • 非终结符的引入,增加了推导步骤(分析树增高)
  • 更不容易理解

2.为文法符号规定优先级和结合性

YACC(生成 词法分析器 和 语法分析器 的工具)就是采用这种方法:

%left '+'
%left '*'
%right '-'
E  :  E '+' E | E '*' E | '-' E | '(' E ')' | id

简单

3.修改语言的语法(表现形式被改变)

① 明确给出结束标志,如Ada中用end if,于是有:

if x<3 then if x>0 then x:=5; end if; else x:=-5; end if;
if x<3 then if x>0 then x:=5; else x:=-5; end if; end if;


② 给表达式加括号,如Pascal中逻辑和算术运算:(a+b)>(c*d)

编译原理(三)语法分析:3.二义性与二义性的消除相关推荐

  1. 跟vczh看实例学编译原理——三:Tinymoe与无歧义语法分析

    文章中引用的代码均来自https://github.com/vczh/tinymoe. 看了前面的三篇文章,大家应该基本对Tinymoe的代码有一个初步的感觉了.在正确分析"print su ...

  2. 编译原理之语法分析(预测分析法)

    编译器之语法分析 自顶向下 上下文无关文法 语法树 NFA→CFG 预测分析法 改写CFG 原因 消除二义性 消除左递归 消除左公因子 消除空产生式 消除回路 自顶向下 上下文无关文法 CFG本质上就 ...

  3. 编译原理2-Bison语法分析

    ps:补上了图 实验要求 了解 Bison 基础知识和理解 Cminus-f 语法(重在了解如何将⽂法产⽣式转换为 Bison 语句) 阅读 /src/common/SyntaxTree.c ,对应头 ...

  4. 编译原理——自上而下语法分析

    自上而下分析面临的问题 回溯 (当候选有多个的时候,匹配失败会造成回溯) 文法左递归问题 那么他这个语法树就会无限增长但是分析并没有继续进行下去,就会导致分析进入死循环中 LL1文法消除左递归 消除直 ...

  5. 编译原理之语法分析(自底向上)(包含源码)

    编译器之语法分析 自底向上 基本概念 算符优先 SLR 规范LR LALR 自底向上 基本概念 自底向上形成语法树的过程就是及逆行归约,将一堆单词串放在一起,形成某个产生式的样子,然后规约成某个产生式 ...

  6. 编译原理词/语法分析

    效果: 代码: 1: using System; 2: using System.Collections.Generic; 3: using System.ComponentModel; 4: usi ...

  7. 计算机语法分析,电子科技大学-计算机学院-编译原理实验-语法分析.pdf

    // SyntaxAnalyzer.cpp : 定义控制台应用程序的入口点. // #include #include #include #define MAX_COUNT 1024 #define ...

  8. 语言的二义性——编译原理

      写这篇文章的初衷是在复习编译原理时,对于文法的二义性和语言的二义性的区别产生了疑问.其中对于语言的二义性的定义不甚理解,且国内网上的文章对于语言的二义性定义描述较为简单.因此,为了更好的理解语言的 ...

  9. 【编译原理】Python语法分析LL(1)、LR(1)

    目录 一.实验目的 二.实验任务 三.实验原理 1  LL(1)文法 2  LR文法 四.实验过程 1  LL(1)文法 2  LR文法 五.实验结果 1  LL(1)文法 2  LR(0)文法 3 ...

  10. 三万五千字长文!让你懂透编译原理(六)——第六章 属性文法和语法制导翻译

    三万五千字长文!让你懂透编译原理(六)--第六章 属性文法和语法制导翻译 长文预警 系列文章传送门: 万字长文+独家思维导图!让你懂透编译原理(一)--第一章 引论 万字长文!让你懂透编译原理(二)- ...

最新文章

  1. json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 问题解决
  2. Silverlight实用窍门系列:47.Silverlight中元素到元素的绑定,以及ObservableCollection和List的使用区别...
  3. pid控制从入门到精通pdf_【应用指南】PID调节让流量/压力控制又快又稳
  4. 9、10、11、12、13_添加标注 (Annotations)、添加网格线(Grid Lines)、显示中文字体、保存图形(saving Figures)、高质量矢量图输出
  5. java ref 应用类型_Java四种引用类型
  6. mysql php 变量赋值,在MySQL UPDATE(PHP / MySQL)中使用变量
  7. 字节跳动 8 年,抖音、头条的技术能力开发者都可以用起来了!
  8. 8.Redis主从复制
  9. 微信小程序自定义函数返回值
  10. 网易云音乐用户信息爬取以及可视化
  11. 【期末复习】计算机组成原理 袁春风
  12. 祝贺自己获得CSDN2018 博客之星
  13. 第一个安卓app应用的开发--环境配置和第一项目创建
  14. 打印机驱动无法安装到计算机是,打印机驱动在电脑哪个位置 打印机驱动安装不上怎么办【详解】...
  15. Typora添加参考文献
  16. 信号与系统2-连续离散系统时域分析
  17. Anchor-free目标检测综述 -- Dense Prediction篇
  18. (毕业设计资料)基于51单片机的公交自动报站系统
  19. 20141226-网易有道实习反思
  20. 程序猿电子书推荐和下载

热门文章

  1. cnn(卷积神经网络)比较系统的讲解
  2. 服务器文件夹共享到本地,云服务器共享本地文件夹
  3. 我的人生哲学(三十六岁版)
  4. 案例2:丙类仓库建筑防火案例分析
  5. 《胜负无定数,敢拼搏成七分》的读后感
  6. java控制台打印乱码_java控制台输出出现乱码怎么解决
  7. 推荐4个好用、接收邮件及时的临时邮箱
  8. 【转载】PCB设计方法和技巧
  9. zkeacms mysql_在Docker中运行纸壳CMS并配置使用MySql
  10. PX4源码分析__传感器数据“sensor_combined”的来龙去脉