Bison遇到冲突的默认行为用户自定义优先级

news/2024/10/14 14:17:17

Bison遇到冲突的默认行为&用户自定义优先级

在使用 Bison 进行语法分析时,如果在语法规则中存在冲突,Bison 会根据默认的优先级结合性规则进行决策,选择某个特定的行为来解决冲突。Bison 中常见的冲突主要包括两类:

  1. 移入-规约冲突(shift-reduce conflict)
  2. 规约-规约冲突(reduce-reduce conflict)

Bison 对这些冲突的处理有一定的优先策略。以下是详细解释:

详细解释

1. 移入-规约冲突(shift-reduce conflict)

移入-规约冲突 是最常见的冲突之一。它发生在某个时刻,语法分析器既可以选择移入(读取更多输入符号),也可以选择规约(使用当前符号规约为某个非终结符)。例如:

stmt: expr ';'| expr '+' expr ';';

在这种情况下,当看到 expr 后,有可能既可以选择规约stmt,也可以选择移入以继续处理 + 符号并形成 expr '+' expr 的结构。这就导致了移入-规约冲突。

Bison 的优先行为:

  • 默认行为:Bison 会优先选择移入(shift),而不是规约(reduce)。Bison 默认认为继续读取输入符号可能会得到更多信息,避免过早规约导致后续无法正确处理输入。

    这个策略通常会产生正确的行为,尤其是在像表达式解析这种场景下,移入操作能够捕获更多的输入,并正确地生成更大的表达式。

结合性和优先级的影响:

  • Bison 允许通过指定运算符的优先级和结合性来控制移入和规约的冲突。通过使用 %left%right%nonassoc 关键字声明运算符的优先级和结合性,可以帮助解析器解决冲突。

    示例:

    %left '+' '-'
    %left '*' '/'expr: expr '+' expr| expr '*' expr| '(' expr ')'| NUM;
    

    在这个例子中,*/ 的优先级高于 +-,因此如果有 expr + expr * expr,Bison 会先移入 *,然后规约 expr * expr,再规约 +

2. 规约-规约冲突(reduce-reduce conflict)

规约-规约冲突 发生在解析器可以根据多条规则规约当前的符号。也就是说,两个或多个规则都可以适用于当前的输入,但 Bison 无法确定使用哪个规则来规约。

示例:

stmt: expr ';'| var_decl ';';var_decl: TYPE ID;expr: ID;

在这种情况下,如果解析器看到 ID 后,不确定是否要将其规约为 expr 还是 var_decl,则会产生规约-规约冲突。

Bison 的优先行为:

  • 默认行为:对于规约-规约冲突,Bison 会根据文法的书写顺序来选择使用最早声明的规则进行规约。也就是说,如果两个规约规则产生冲突,Bison 将选择在定义中出现顺序靠前的那个规则。

3. 运算符优先级和结合性

Bison 提供了一种机制,通过定义运算符的优先级和结合性来解决移入-规约冲突。这通常用于消除表达式解析中的冲突问题。

  • 优先级(precedence):优先级用于决定两个运算符的顺序问题。如果有两条规则冲突,Bison 会根据优先级来决定是先移入还是先规约。高优先级的运算符会优先执行。

  • 结合性(associativity):结合性用于处理多个同级运算符的顺序问题。结合性可以是:

    • 左结合(left-associative):从左往右结合,比如 a - b - c 应该解析为 (a - b) - c
    • 右结合(right-associative):从右往左结合,比如 a = b = c 应该解析为 a = (b = c)
    • 非结合(non-associative):如果两个同级运算符不能连用,则称为非结合。

定义优先级和结合性示例:

%left '+' '-'
%left '*' '/'
%right '^'    // 右结合的运算符
%nonassoc '<' '>'  // 非结合的运算符

通过这种方式,Bison 会根据优先级和结合性来确定如何处理移入-规约冲突,从而生成正确的解析结果。

总结

Bison 在处理语法规则冲突时,采用以下默认的优先行为:

  1. 移入-规约冲突:Bison 默认会选择移入操作(shift),而不是规约。如果定义了运算符的优先级和结合性,Bison 会根据这些信息决定是移入还是规约。
  2. 规约-规约冲突:Bison 会选择最早定义的规则进行规约。
  3. 优先级和结合性:可以通过 %left%right%nonassoc 定义运算符的优先级和结合性,进一步控制冲突的处理方式。
  4. 自定义优先级:通过%left%right等语法定义的优先级,写在越后面,优先级越高。

通过这些机制,Bison 能够有效地解析复杂的文法,并解决解析过程中可能出现的冲突。

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

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

相关文章

测试一下博客园的xss攻击防御,无恶意

★~!@#$%^&*()_+<>,./?;"[]{}- ★%3Cinput /%3E ★%3Cscript%3Ealert(XSS1)%3C/script%3E ★ ★ ★<input/ ★ ★ ★ ★javascript:alert(/xss5/) ★javascript:alert(/xss6/) ★ ★ ★<img src="#"/**/onerror=alert(/xss9/) width=100> ★…

使用 acme.sh 生成免费 90 天的 SSL 泛域名证书

原文地址求你点进去看,给自己的博客加加热度 https://typecho.hanzhe.site/archives/13.htmlacms.sh 是 Github 上开源的一款 SSL 证书申请工具,该工具安装配置完成后可帮我们申请免费 SSL 证书,并通过定时任务实现证书自动续期,理论上配置一次终生实用,官方有提供了中文文…

idea社区版配置springboot项目问题分析及处理

前言 记录一次使用IDEA社区版配置SpringBoot项目的经历,包括遇到的问题及解决过程 IDEA版本:IntelliJ IDEA 2024.2.3 (Community Edition) 问题描述1 IDEA社区版中并不支持Spring项目的创建等其他操作,在导入项目后无法自动识别,需要手动进行配置 解决过程1 项目导入后,在…

css图像

1.利用width,height属性控制图像的大小。 <!DOCTYPE html> <html><head><title>Image Sizes</title><style type="text/css">img.large {width: 500px;height: 500px;}img.medium {width: 250px;height: 250px;}img.small {widt…

AvaloniaTCP-v1.0.0:学习使用Avalonia/C#进行TCP通讯的一个简单Demo

AvaloniaTCP-v1.0.0:学习使用Avalonia/C#进行TCP通讯的一个简单Demo。TCP通讯简介 TCP(传输控制协议,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它确保数据包按顺序传输,并在必要时进行重传,以保证数据的完整性和准确性。TC…

【CTF】CTF-OS:一个专门为CTF设计的操作系统

前言 CTF-OS是探姬为CTF比赛特制的虚拟机,封装多版本工具集与系统,适合CTF新手、各行业人士及安全工作者使用,尤其适合不愿在工作机安装特殊软件的用户。注意,CTF不同于渗透测试,本虚拟机专为CTF赛事人员定制。 如果你也想学习CTF那么我特意准备好了一封CTF学习资料2000页…

【日记】包装好看度与配料表健康度成反比(1550 字)

正文昨天才上完班,怎么明天又要上班啊……今天起床头发好炸,就像哪个山洞里刚出来的野人。昨晚明明吹了头发的啊,我看着镜子里的自己有些哭笑不得。报复性熬夜玩到了 3 点。今天 11:30 起床,感觉眼睛还是很肿,没睡好。可能就是因为太晚了。中午又睡了个午觉,起床感觉眼睛…