YACC移进规约冲突案例分析

news2024/11/27 10:21:21

总结

总结:

  • bison给出的用例是发现冲突的最便捷方法。
    • 第一种用例:明确用例(一个Example),直接反应问题。
    • 第二种用例:混淆用例(两个Example),解析器无法区分两条语句。
  • 也可以看output输出的状态机中给出的两条冲突规则,可读性比较差。
    • 方括号括起来的是冲突的路径。

总结:

  • bison给出用例的第二种情况,有时会比较难以理解。为什么呢?
  • 因为他给的用例可能是经过reduce的上层用例,真正冲突的地方在语法树下层。

案例一:返回一个Example的场景(简单)

冲突报错返回一个明确用例的场景。

sequence.y

%%
sequence:
  %empty
| maybeword
| sequence "word"
;
maybeword:
  %empty
| "word"
;

编译

$ bison -Wcex --report='cex' sequence.y
sequence.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
sequence.y: warning: 2 reduce/reduce conflicts [-Wconflicts-rr]

共有三条冲突,下面是用例:

【冲突一】

注意看用例Example,提供的是一个 "空 word"的例子。

用例说明比较清晰了,"空 word"可能被两条规则消费:

  1. “空” 被规约为sequence,sequence+"word"规约为sequence。
  2. “空” 和 “word” 都被移进位sequence
sequence.y: warning: shift/reduce conflict on t0ken  "word" [-Wcounterexamples]
  Example: . "word"
  Shift derivation
    sequence
    `-> 2: maybeword
           `-> 5: . "word"
  Reduce derivation
    sequence
    `-> 3: sequence        "word"
           `-> 1: %empty .

【冲突二】

输入空的时候,有两个规约路径。

sequence.y: warning: reduce/reduce conflict on tokens $end, "word" [-Wcounterexamples]
  Example: .
  First reduce derivation
    sequence
    `-> 1: %empty .
  Second reduce derivation
    sequence
    `-> 2: maybeword
           `-> 4: %empty .

output

下面看看output文件怎么阅读。

  • 最上面会有告警和冲突的汇总。
  • Grammar开始是规则区,y文件中的每一行规则在这里编号,后面使用时会使用编号代替。
  • State 0开始是状态区,状态转移如果不唯一的话,会在State区列出例子和冲突选项。
  • 状态机转移请看下一个例子。
$ cat sequence.output 
Rules useless in parser due to conflicts

    4 maybeword: %empty


State 0 conflicts: 1 shift/reduce, 2 reduce/reduce


Grammar

    0 $accept: sequence $end

    1 sequence: %empty
    2         | maybeword
    3         | sequence "word"

    4 maybeword: %empty
    5          | "word"


Terminals, with rules where they appear

    $end (0) 0
    error (256)
    "word" (258) 3 5


Nonterminals, with rules where they appear

    $accept (4)
        on left: 0
    sequence (5)
        on left: 1 2 3
        on right: 0 3
    maybeword (6)
        on left: 4 5
        on right: 2


State 0

    0 $accept: . sequence $end

    "word"  shift, and go to state 1

    $end      reduce using rule 1 (sequence)
    $end      [reduce using rule 4 (maybeword)]
    "word"    [reduce using rule 1 (sequence)]
    "word"    [reduce using rule 4 (maybeword)]
    $default  reduce using rule 1 (sequence)

    sequence   go to state 2
    maybeword  go to state 3

    shift/reduce conflict on t0ken "word":
        1 sequence: %empty .
        5 maybeword: . "word"
      Example: . "word"
      Shift derivation
        sequence
        `-> 2: maybeword
               `-> 5: . "word"
      Reduce derivation
        sequence
        `-> 3: sequence        "word"
               `-> 1: %empty .

    reduce/reduce conflict on t0kens $end, "word":
        1 sequence: %empty .
        4 maybeword: %empty .
      Example: .
      First reduce derivation
        sequence
        `-> 1: %empty .
      Second reduce derivation
        sequence
        `-> 2: maybeword
               `-> 4: %empty .

    shift/reduce conflict on t0ken "word":
        4 maybeword: %empty .
        5 maybeword: . "word"
      Example: . "word"
      Shift derivation
        sequence
        `-> 2: maybeword
               `-> 5: . "word"
      Reduce derivation
        sequence
        `-> 3: sequence               "word"
               `-> 2: maybeword
                      `-> 4: %empty .



State 1

    5 maybeword: "word" .

    $default  reduce using rule 5 (maybeword)


State 2

    0 $accept: sequence . $end
    3 sequence: sequence . "word"

    $end    shift, and go to state 4
    "word"  shift, and go to state 5


State 3

    2 sequence: maybeword .

    $default  reduce using rule 2 (sequence)


State 4

    0 $accept: sequence $end .

    $default  accept


State 5

    3 sequence: sequence "word" .

    $default  reduce using rule 3 (sequence)

案例二:返回两个Example的场景(复杂递归)

冲突报错返回两个混淆用例的场景(解析器无法区分两个用例)。

ids.y

%token ID
%%
s: a ID
a: expr
expr: %empty | expr ID ','

编译

$ bison -Wcex --report='cex' ids.y
ids.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
ids.y: warning: shift/reduce conflict on token ID [-Wcounterexamples]
  First example: expr . ID ',' ID $end
  Shift derivation
    $accept
    `-> 0: s                                     $end
           `-> 1: a                           ID
                  `-> 2: expr
                         `-> 4: expr . ID ','
  Second example: expr . ID $end
  Reduce derivation
    $accept
    `-> 0: s                       $end
           `-> 1: a             ID
                  `-> 2: expr .
ids.y:4.4-7: warning: rule useless in parser due to conflicts [-Wother]
    4 | a: expr
      |    ^~~~

在这里插入图片描述

复杂递归的规则,bison无法计算出一个冲突的例子。

所以解析器只能给出两个反例,含义是他无法区分这两个例子的区别。

解析器需要一个look ahead token,来知道逗号是否跟在expr ID后面。

修复的方法是:expr: ID | ',' expr ID.

ids.y

%token ID
%%
s: a ID
a: expr
expr: ID | ',' expr ID

在这里插入图片描述

注意:

  • 修复前,expr ID的解析是有歧义的,如果后面有逗号,应该走上面的例子;如果后面没逗号,应该走下面的例子。
  • 修复后,expr ID的解析是稳定的,肯定会走expr reduce a; then shift ID
    在这里插入图片描述

从Output来看,主要问题是无法确定:

  • 选路径1:ID shift, and go to state 6
    • state 6:4 expr: expr ID . ',' -> ',' shift, and go to state 7
    • 即ID参与`expr: expr ID . ‘,’``规则的shift。
  • 还是选路径2:ID [reduce using rule 2 (a)]
    • rule2: a: expr
$ cat ids.output 
Rules useless in parser due to conflicts

    2 a: expr


State 3 conflicts: 1 shift/reduce


Grammar

    0 $accept: s $end

    1 s: a ID

    2 a: expr

    3 expr: %empty
    4     | expr ID ','


Terminals, with rules where they appear

    $end (0) 0
    ',' (44) 4
    error (256)
    ID (258) 1 4


Nonterminals, with rules where they appear

    $accept (5)
        on left: 0
    s (6)
        on left: 1
        on right: 0
    a (7)
        on left: 2
        on right: 1
    expr (8)
        on left: 3 4
        on right: 2 4


State 0

    0 $accept: . s $end

    $default  reduce using rule 3 (expr)

    s     go to state 1
    a     go to state 2
    expr  go to state 3


State 1

    0 $accept: s . $end

    $end  shift, and go to state 4


State 2

    1 s: a . ID

    ID  shift, and go to state 5


State 3

    2 a: expr .
    4 expr: expr . ID ','

    ID  shift, and go to state 6

    ID  [reduce using rule 2 (a)]

    shift/reduce conflict on token ID:
        2 a: expr .
        4 expr: expr . ID ','
      First example: expr . ID ',' ID $end
      Shift derivation
        $accept
        `-> 0: s                                     $end
               `-> 1: a                           ID
                      `-> 2: expr
                             `-> 4: expr . ID ','
      Second example: expr . ID $end
      Reduce derivation
        $accept
        `-> 0: s                       $end
               `-> 1: a             ID
                      `-> 2: expr .



State 4

    0 $accept: s $end .

    $default  accept


State 5

    1 s: a ID .

    $default  reduce using rule 1 (s)


State 6

    4 expr: expr ID . ','

    ','  shift, and go to state 7


State 7

    4 expr: expr ID ',' .

    $default  reduce using rule 4 (expr)

修复后

Grammar

    0 $accept: s $end

    1 s: a ID

    2 a: expr

    3 expr: ID
    4     | ',' expr ID


Terminals, with rules where they appear

    $end (0) 0
    ',' (44) 4
    error (256)
    ID (258) 1 3 4


Nonterminals, with rules where they appear

    $accept (5)
        on left: 0
    s (6)
        on left: 1
        on right: 0
    a (7)
        on left: 2
        on right: 1
    expr (8)
        on left: 3 4
        on right: 2 4


State 0

    0 $accept: . s $end

    ID   shift, and go to state 1
    ','  shift, and go to state 2

    s     go to state 3
    a     go to state 4
    expr  go to state 5


State 1

    3 expr: ID .

    $default  reduce using rule 3 (expr)


State 2

    4 expr: ',' . expr ID

    ID   shift, and go to state 1
    ','  shift, and go to state 2

    expr  go to state 6


State 3

    0 $accept: s . $end

    $end  shift, and go to state 7


State 4

    1 s: a . ID

    ID  shift, and go to state 8


State 5

    2 a: expr .

    $default  reduce using rule 2 (a)


State 6

    4 expr: ',' expr . ID

    ID  shift, and go to state 9


State 7

    0 $accept: s $end .

    $default  accept


State 8

    1 s: a ID .

    $default  reduce using rule 1 (s)


State 9

    4 expr: ',' expr ID .

    $default  reduce using rule 4 (expr)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/143178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jenkins 节点部署

1、节点注册 登陆jenkins master界面 路径:首页-->系统管理--> 节点管理-->新建节点(New Node) 插曲:我在新的服务器部署master节点,显示剩余交换空间为0B 处理方式请查看:Jenkins - Free Swap…

关于MCU的BootLoader的一些理解

一、关于STM32单片机IAP升级中if(((*(__IO uint32_t*)Addr_App) & 0x2FFE0000) 0x20000000)语句的理解 参考自:https://blog.csdn.net/weixin_45394120/article/details/122732203?spm1001.2014.3001.5502 疑问: 1、为什么要用Addr_App里的数据…

Web操作系统漏洞发现——工具使用总结

目录 (一)web层面 1、信息收集 0x01 网站源码自己开发 0x02 网站源码使用开源CMS 2、可维护Poc 0x01 pocassist 0x02 afrog 3、APP渗透 0x01 在BP上添加转发端口 0x02 Xray进行监听 0x03 触发数据 4、Goby (二)操作系统层…

xss.haozi靶场通关

做完xss-labs靶场后,再继续做这个靶场,感觉这个不是很难,毕竟在第一个靶场也获取了一些经验,但是这个靶场偏向技巧,所以还是以了解为主。 0x00: 分析:对我们的代码未作出限制,因此这里可以使用…

如何用 nodejs 进行 sha1 加密验证,微信公众号开发验证

如何用 nodejs 进行 sha1 加密验证,微信公众号开发验证 一、问题 今天在摆弄微信公众号的时候,遇到这样一个问题: 我的后台是 nodejs 写的,express 框架,官方开发接入的验证代码是 php 写的,其中有一个部…

C语言之蓝桥杯习题(3)☞暴力求解版(思路写在解题过程中)

第一题.1.问题:小蓝数字卡片题小蓝有很多数字卡片,每张卡片上都是数字0到9。 小蓝准备用这些卡片来拼一些数,他想从1开始拼现在小蓝手里有0到9的卡片各2021张,共20210张,请问小蓝可以从1拼到多少?2.解题过程&#xff…

【Docker】(三)使用registry远程镜像仓库管理镜像

1.前言 本系列文章记录了从0开始学习Docker的过程,Docker系列历史文章: (一)基本概念与安装使用 (二)如何使用Docker发布一个SpringBoot服务 在上一篇中留下了一个问题,使用Docker发布服务的方…

【开源代码 | MATLAB线性阵列仿真】

本文编辑:调皮哥的小助理 1、16阵元均匀线阵方向图 %8阵元均匀线阵方向图,来波方向为0度 clc; clear all; close all; element_num16;%阵元数为16 d_lamda1/2;%阵元间距d与波长lamda的关系 thetalinspace(-pi/2,pi/2,200); theta0[0.2 0.1];%来波方向 w…

systemd wsl 测试笔记

文章目录systemd 简介WSL systemdsystemctljournalctlhello serviceSleep 与 Timeout 测试Requires 测试After 测试systemd 简介 Linux 从关闭到运行, 完整的启动和启动过程有三个主要部分: 硬件启动(Hardware boot): 初始化系统硬件Linux 引导(Linux boot): 加载 Linux 内核&…

基于ERNIELayoutPDFplumber-UIEX的多方案学术论文信息抽取

本项目链接:https://aistudio.baidu.com/aistudio/projectdetail/5196032?contributionType1 0.问题描述 可以参考issue: ERNIE-Layout在(人名和邮箱)信息抽取的诸多问题阐述#4031 ERNIE-Layout因为看到功能比较强大就尝试了一…

Linux安装mongodb集群整合SpringBoot

一、Mongodb集群安装 本文介绍基于mongodb的副本机制搭建集群 192.168.139.186CentOS Linux release 7.7.1908 (Core)192.168.139.187CentOS Linux release 7.7.1908 (Core)192.168.139.188CentOS Linux release 7.7.1908 (Core) 准备工作 关闭selinux,关闭防火墙…

近场通信到2027年将达到467.81亿美元

2020年,全球近场通信市场规模为178.75亿美元,预计到2027年将达到467.81亿美元,2021年至2027年的CAGR为14.8%。这是根据Market Statsville Group (MSG)的一份新报告得出的。 近场通信(NFC)是基于无线接口的一系列协议,使得通信设备…

Linux系统的优缺点

相比 Windows 系统,Linux 系统有更好的稳定性,那么除此之外,Linux 系统还有那些优点(或者不足)呢?一、大量的可用软件及免费软件Linux 系统上有着大量的可用软件,且绝大多数是免费的&#xff0c…

2021年第十二届蓝桥杯软件类省赛python组“回路计算“问题

说明 这一题我不会做,看了官方给出的标准答案之后才明白,我把我学到的思路写下来。 题目 蓝桥学院由21栋教学楼组成,教学楼编号1到21。对于两栋教学楼a和b,当a和b互质时,a和b之间有一条走廊直接相连,两个方向皆可通…

CRM之线索管理的demo搭建方法

1、简介 1.1、案例简介 本文将介绍,如何搭建CRM-线索管理。 1.2、应用场景 CRM-线索管理应用完整记录所有线索资料,合理的对线索进行领取、分配、退回、跟进,实现线索管理智能化。 2、设置方法 2.1、表单搭建 1)新建主表【新…

【日常系列】LeetCode《25·贪心2》

数据规模->时间复杂度 <10^4 &#x1f62e;(n^2) <10^7:o(nlogn) <10^8:o(n) 10^8<:o(logn),o(1) 内容 lc 976 &#xff1a;三角形的最大周长 https://leetcode.cn/problems/largest-perimeter-triangle/ 提示&#xff1a; 3 < nums.length < 10^4 1 &l…

Dubbo优雅启动(附源码分析)

Dubbo优雅启动 1. 启动有什么问题 我们知道&#xff0c;应用在运行了一段时间后&#xff0c;执行速度会比刚启动的时候要快。这是因为在 Java 里面&#xff0c;在运行过程中&#xff0c;JVM 虚拟机会把高频的代码编译成机器码&#xff0c;被加载过的类也会被缓存到 JVM 缓存中…

主数据和元数据、数据标准、数据质量有什么关系

企业数据治理涉及的工作很广&#xff0c;包括数据标准、数据质量、数据安全、数据共享机制、元数据管理、主数据管理等。主数据作为企业的黄金数据&#xff0c;对于企业信息化管理具有重要意义。本文将对主数据的概念及主数据与数据治理体系中的几个核心部分的关系和大家做一个…

oracle 查询到的结果在快捷地写入到excel过程中标题部分正确的处理方式

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤羌笛何须怨杨柳&#xff0c;春风不度玉门关。大家好&#xff0c;我是皮皮。一、前言前几天在Python最强王者交流群【粉丝】问了一个pandas数据处理的问题&…

一篇文章让你掌握HTML(上)

目录 前言 1. 基础认知 1.1 HTML概念 1.2 Web标准 2. HTML骨架结构 3. 开发工具的基本使用 4. 语法规范 4.1 HTML的注释 4.2 HTML标签的结构 4.3 HTML标签的关系 5. 排版标签 5.1 标题标签 5.2 段落标签 5.3 换行标签 5.4 水平线标签 6. 文本格式化标签…