YACC移进规约冲突案例分析(二)output中状态机转移步骤详解

news2025/1/23 17:45:49

案例

calc.y

%union
{
  int ival;
  const char *sval;
}
%token <ival> NUM
%nterm <ival> exp
%token <sval> STR
%nterm <sval> useless
%left '+' '-'
%left '*'
%%
exp:
  exp '+' exp
| exp '-' exp
| exp '*' exp
| exp '/' exp
| NUM
;
useless: STR;
%%

编译

$ bison --report=state calc.y
calc.y: warning: 1 nonterminal useless in grammar [-Wother]
calc.y: warning: 1 rule useless in grammar [-Wother]
calc.y:20.1-7: warning: nonterminal useless in grammar: useless [-Wother]
   20 | useless: STR;
      | ^~~~~~~
calc.y: warning: 7 shift/reduce conflicts [-Wconflicts-sr]
calc.y: note: rerun with option '-Wcounterexamples' to generate conflict counterexamples

Output文件分析

$ cat calc.output 

第一部分:无用tokens

Nonterminals useless in grammar

    useless


Terminals unused in grammar

    STR


Rules useless in grammar

    6 useless: STR

第二部分:冲突总结

State 8 conflicts: 1 shift/reduce
State 9 conflicts: 1 shift/reduce
State 10 conflicts: 1 shift/reduce
State 11 conflicts: 4 shift/reduce

第三部分:打印语法树

Grammar

    0 $accept: exp $end

    1 exp: exp '+' exp
    2    | exp '-' exp
    3    | exp '*' exp
    4    | exp '/' exp
    5    | NUM

第四部分:tokens的使用情况报告

POSIX只允许%type表示终结符,但是bison也允许%nterm标记终结符。

含义: 终结符符号 |(ASCII码)| 在几号语法规则中用到了

Terminals, with rules where they appear

    $end (0) 0
-- 实例: '*'                 (42)          3
-- 含义: 终结符乘号           (ASCII42)    在3号语法规则中用到了

    '+' (43) 1
    '-' (45) 2
    '/' (47) 4
    error (256)
    NUM <ival> (258) 5
    STR <sval> (259)


Nonterminals, with rules where they appear

    $accept (9)
        on left: 0
    exp <ival> (10)
        on left: 1 2 3 4 5
        on right: 0 1 2 3 4

第五部分:状态0

  1. 进入状态机。
  2. 每个item都用”点规则“描述状态。
  3. 点规则即:使用"•"标记输入位置的规则。

状态0:

  • 当前在exp之前的位置,进入状态0。
  • 在状态0时,收到了一个reduce出来的exp,状态机进入状态2。
  • 如果没有非终结符exp上来,向前看是一个number,则符号发生移进,进入解析堆栈,状态机进入状态1。
State 0

    0 $accept: • exp $end

    NUM  shift, and go to state 1

    exp  go to state 2

第六部分:状态1

状态1:

  • 注意•的位置!输入的位置在后面,说明规则5:5 exp: NUM •已经匹配上了。不管lookahead是什么,解析器都会开始规约。
  • 如果他是从状态机0过来的,规约完成了会跳回状态0。状态0收到exp后会跳到状态2。

$default表示任何向前看lookahead的字符(•位置表示的字符)是什么都能匹配上后面的规则。

State 1

    5 exp: NUM •

    $default  reduce using rule 5 (exp)

第七部分:状态2

状态2:注意dot的位置。

  • 状态2只能移进一个符号。
  • 比如exp • '+' expdot向前看来了一个'+',则移进解析堆栈,转移到状态4。
  • 没有default,如果匹配补上,直接syntax error
State 2

    0 $accept: exp • $end
    1 exp: exp • '+' exp
    2    | exp • '-' exp
    3    | exp • '*' exp
    4    | exp • '/' exp

    $end  shift, and go to state 3
    '+'   shift, and go to state 4
    '-'   shift, and go to state 5
    '*'   shift, and go to state 6
    '/'   shift, and go to state 7

第八部分:状态3

状态3:

  • 最终状态 或 accepting状态。
  • 初始规则匹配完成,解析成功并退出。
State 3

    0 $accept: exp $end •

    $default  accept

第九部分:状态4-7

状态4:

  • 如果dot后面是num,移进解析堆栈后转移到状态1。
  • 如果dot后面是非终结符exp,进入状态8。
State 4

    1 exp: exp '+' • exp

    NUM  shift, and go to state 1

    exp  go to state 8


State 5

    2 exp: exp '-' • exp

    NUM  shift, and go to state 1

    exp  go to state 9


State 6

    3 exp: exp '*' • exp

    NUM  shift, and go to state 1

    exp  go to state 10


State 7

    4 exp: exp '/' • exp

    NUM  shift, and go to state 1

    exp  go to state 11

第十部分:状态8

回忆下所有rules:

Grammar

    0 $accept: exp $end

    1 exp: exp '+' exp
    2    | exp '-' exp
    3    | exp '*' exp
    4    | exp '/' exp
    5    | NUM

状态8

  • 产生冲突的符号是出现两次的'\'
    • '\'的第一个选择:走rule4,把’'移进解析堆栈。
    • '\'的第二个选择:走rule1把前面的exp'+'exprecude掉,再处理后面的’'。
  • 上述问题原因是'\''+'之间没有优先级,可能出现:
    • NUM + (NUM / NUM)
    • (NUM + NUM) / NUM
State 8

    1 exp: exp • '+' exp
    1    | exp '+' exp • [$end, '+', '-', '/']   (使用--report=lookahead能看到末尾dot代表的字符)
    2    | exp • '-' exp
    3    | exp • '*' exp
    4    | exp • '/' exp

    '*'  shift, and go to state 6
    '/'  shift, and go to state 7

    '/'       [reduce using rule 1 (exp)]
    $default  reduce using rule 1 (exp)


State 9

    1 exp: exp • '+' exp
    2    | exp • '-' exp
    2    | exp '-' exp •
    3    | exp • '*' exp
    4    | exp • '/' exp

    '*'  shift, and go to state 6
    '/'  shift, and go to state 7

    '/'       [reduce using rule 2 (exp)]
    $default  reduce using rule 2 (exp)


State 10

    1 exp: exp • '+' exp
    2    | exp • '-' exp
    3    | exp • '*' exp
    3    | exp '*' exp •
    4    | exp • '/' exp

    '/'  shift, and go to state 7

    '/'       [reduce using rule 3 (exp)]
    $default  reduce using rule 3 (exp)

第十一部分:状态11

状态11:

  • 除了缺乏优先级外,也缺失结合性。
  • (1/2)/31/(2/3)无法区分。
    • 选择:'/' shift, and go to state 7
    • 还是选择:'/' [reduce using rule 4 (exp)]

State 11

    1 exp: exp • '+' exp
    2    | exp • '-' exp
    3    | exp • '*' exp
    4    | exp • '/' exp
    4    | exp '/' exp •

    '+'  shift, and go to state 4
    '-'  shift, and go to state 5
    '*'  shift, and go to state 6
    '/'  shift, and go to state 7

    '+'       [reduce using rule 4 (exp)]
    '-'       [reduce using rule 4 (exp)]
    '*'       [reduce using rule 4 (exp)]
    '/'       [reduce using rule 4 (exp)]
    $default  reduce using rule 4 (exp)

bison --report=statelookahead的区别

lookahead会补充最后的dot,列出可能性。
在这里插入图片描述

bison --report=stateitemset的区别

itemset会展开item项目,展开非终结符,补充非终结符的内容。
在这里插入图片描述

bison --report=statesolved的区别

solved会尝试给出解决方法。
在这里插入图片描述

bison --report=statecounterexamples的区别

counterexamples会给出用例。
在这里插入图片描述

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

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

相关文章

恭喜龙蜥获得中国开源云联盟2022年度中国“最佳开源实践案例”和“杰出开源贡献者”奖项

近日&#xff0c;由工信部中国电子技术标准化研究院主办的 2022 木兰峰会在北京圆满举办&#xff0c;峰会上正式公布了中国开源云联盟(China Open Source Cloud League&#xff0c;简称“COSCL”) 2022 年度评选名单&#xff0c;龙蜥社区荣获中国“最佳开源实践案例”和“杰出开…

仪器设备使用

NI DcpowerSwitchDigitalDMMFgenScope名称直流电源&#xff08;SMU&#xff09;继电器PPMU数字万用表信号发生器示波器版本PXI-4147PXI-2567PXI-6571PXI-4070PXI-4463PXI-5160 1.Scope 示波器是一种电子测量仪器&#xff0c;可以在无干扰的情况下监控输入信号&#xff0c;随后…

Go结构体(struct)

文章目录Struct定义struct构造struct实例struct的值和指针在与函数共用时&#xff1a;匿名字段和嵌套struct嵌套struct的名称冲突问题Struct 是一个值类型的 定义struct type identifier struct {field1 type1field2 type2… } // 或者 type T struct { a, b int }理论上&am…

JAVA多线程初阶(1)

目录JAVA多线程(1)1.Thread类创建与使用1.1 继承Thread类1.2 实现并发关于sleep()1.3 Runnable创建线程1.4 匿名内部类创建线程1.5 lamda表达式创建线程2.多线程提高效率3.Thread类属性和方法3.1 Thread(String name)3.2 isDaemon()3.3 isAlive()3.3 线程的重要方法3.4 中断线程…

数据结构:图

文章目录图内存中存储图数据结构邻接矩阵存储方法用邻接矩阵&#xff08;Adjacency Matrix&#xff09;来表示一个图的缺点&#xff1a;浪费空间优点邻接表存储方法&#xff08;Adjacency List&#xff09;广度优先算法Breadth-First-Search&#xff08;BFS&#xff09;深度优先…

Android——GT库-日志工具

GT库在创造出来初期&#xff0c;里面的日志工具就一直存在的&#xff0c;经历了很久的迭代变更&#xff0c;当目前的最新版本&#xff0c;日志工具已经创造出更高级的调试日志方式了&#xff0c;接下来咋们来看看GT库中的日志工具具体使用方法吧。 使用GT库里的&#xff0c;当然…

web表单设计器的优点体现在哪?

在数字化管理越来越规范的当下&#xff0c;拥有一款优质高效的低代码开发平台&#xff0c;确实能给企业提质增效带来更大的帮助。很多客户朋友会问道&#xff1a;web表单设计器都有哪些特点&#xff1f;为什么能在企业的现代化办公管理中起到巨大的作用&#xff1f;今天&#x…

Linux终端远程工具xshell,xftp,mobasterm

目录 软件介绍 1.xshell 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a; 第5步&#xff1a; 2.xftp 第一步&#xff1a; 第二部&#xff1a; 第三步&#xff1a; 3.mobasterm 全能终端神器——MobaXterm 第一步&#xff1a; 第二步&a…

C1083无法打开包括文件: “atlbase.h”: No such file or directory

在打开别人的项目的过程中遇到了“atlbase.h”无法打开的问题&#xff0c;在此记录一下。1.下载ATL生成工具与缓解只下载ATL生成工具后面还会报错&#xff0c;直接下载下载ATL生成工具与缓解一步到位。下载的入口在&#xff1a;工具--->获取工具与功能。需要注意的是&#x…

Guitar Pro2023Win/Mac中文吉他/贝斯打谱识谱软件

Guitar Pro 是一款曲谱阅读器。以 GTP 结尾的曲谱文件都必须用 Guitar Pro 才能打开。Guitar Pro 凭借着其便利的制谱和读曲谱环境&#xff0c;在各大谱库论坛里都占据着一席之地&#xff0c;喜欢吉他的朋友一定略有耳闻。早几年该作者将它移植到了移动平台&#xff0c;现在你也…

7-2国王游戏

题目&#xff1a; 恰逢 H 国国庆&#xff0c;国王邀请 n 位大臣来玩一个有奖游戏。 首先&#xff0c;他让每个大臣在左、右手上面分别写下一个整数&#xff0c;国王自己也在左、右手上各写一个整数。 然后&#xff0c;让这 n 位大臣排成一排&#xff0c;国王站在队伍的最前面。…

应用层——Web和HTTP

目录 1. HTTP概况 1.1 Web页面简介 1.2 URL-统一资源定位器 1.3 HTTP协议 2. HTTP连接的两种类型 2.1 HTTP非持久性连接(Non-persistent HTTP) 2.2 HTTP持久性连接(Persistent HTTP) 2.2.1 无流水(pipelining)的持久性连接 2.2.2 带有流水机制的持久性连接 3. HT…

一站式开发平台赋能办公全场景

近几年&#xff0c;数字化办公迎来了新的机遇&#xff0c;根据亿欧智库《2022中国数字化办公市场研究报告》推算&#xff0c;数字化办公2021年的市场规模达到973.89亿元&#xff0c;至2025年将达到1768.16亿元&#xff0c;整体增速保持平稳&#xff0c;2018-2025年的CAGR为15.8…

Mybatis 框架搭建封装JDBC,实现sql语句

目录 1、maven新建一个工程​编辑 2、添加POM.XML配置文件 3、创建实例包 4、创建一个环境资源根目录 5、配置环境文件 6、创建接口&#xff0c;添加方法 7、编写sql语句 8、创建测试类 8.1 、定义工厂模式 8.2 、定义会话 8.3、定义对象 8.5、获取Builder建造工厂 …

LAB3 EIGRP1实验

1 实验拓扑&#xff1a; 2 实验要求&#xff1a; 1>.R1-R3环回口0:192.168.100.x/32。 2>.R1上采用手动汇总的命令&#xff0c;汇总4条环回口成一条。 3>.R1上下发一条默认路由。 4>.实现R1到R2的环回口路由非等价负载。 5>.as 90都使用eigrp认证。 6>…

css动画效果之transition

transition-property规定设置过渡效果的 CSS 属性的名称。属性名属性值none没有属性会获得过渡效果。all所有属性都将获得过渡效果。property定义应用过渡效果的 CSS 属性名称列表&#xff0c;列表以逗号分隔。使用方式transition-property: width,background;/* 多个效果可用逗…

设计模式之装饰模式

1.前言 装饰模式&#xff1a;动态的给一个类添加一些额外职责&#xff0c;就增加功能来说&#xff0c;装饰模式比生成子类更加灵活。 装饰模式属于结构型模式&#xff0c;它是作为现有的 类的⼀个包装&#xff0c;允许向⼀个现有的对象添加新的功能&#xff0c; 同时⼜不改变其…

Spring创建和使用 (存储和读取) -- 1

Spring创建和使用 存储和读取 -- 1一、创建 Spring 项目1.1 创建⼀个 Maven 项目1.2 添加 Spring 框架支持1.3 添加启动类二、存储 Bean 对象2.1 创建 Bean2.2 将 Bean 注册到容器三、获取并使用 Bean 对象3.1 创建 Spring 上下文3.2 获取指定的 Bean 对象3.3 使用 Bean四、总结…

数据结构-第六期——并查集(Python)

目录 认识并查集 经典应用: 应用场景 并查集的操作 初始化 代码实现 合并 代码实现 查找 代码实现 查找代码【图解】 有多少个集&#xff08;帮派&#xff09;? 复杂度 查询的优化:路径压缩 【代码】用递归实现 并查集:初始化、查找、合并代码 蓝桥杯…

ES6之Promise

Promise是异步操作的一种解决方案 // 1.认识Promisedocument.addEventListener(click,()>{console.log(这里是异步的);});console.log(这里是同步的); Promise一般用来解决层层嵌套的回调函数&#xff08;回调地狱&#xff09;的问题 <!DOCTYPE html> <html lan…