【编译原理】03语法分析

news2024/9/19 12:32:26

1,语法分析的若干问题

1.1 语法分析器的作用        

        编译器前端的重要组成部分:        

        (1) 根据词法分析器提供的记号流,为语法正确的输入构造分析树(或语法树)。

         (2) 检查输入中的语法(可能包括词法)错误,并调用出错处理器进行适当处理。

语法分析器:

1、通用的语法分析方法

         Cocke-Younger-Kasami算法和Earley算法

2、自上而下

        对任何输入串,试图用一切可能的办法,从文法开始符号(根结点)出发,自上而下地为输入串建立一棵语法树;或者说为输入串寻找一个最左推导。

3、自下而上

       自上而下的一般方法: 消除左递归 提取左因子 递归下降分析 预测分析器

语法分析器在编译器中的位置与作用

1.2  语法错误的处理原则

1.2.1.源程序中可能出现的错误

语法错误

        词法错误:非法字符或关键字、标识符拼写错误等

        语法错误:语法结构出错,如少分号、{/}不配对等  

语义错误

        静态语义错误涉及的是编译时可检查出来的错误,如类型不一致、参数不匹配等;

        动态语义错误一般是指程序运行时的逻辑错误,如无穷递归、变量为零时作除数等。        

        大多数错误的诊断和恢复集中在语法分析阶段,一个原因是大多数错误是语法错误,另一个原因是语法分析方法的准确性,它们能以非常有效的方法诊断语法错误。在编译的时候,想要准确地诊断语义或逻辑错误有时是很困难的。

1.2.2.语法错误处理的目标

① 清楚而准确地报告错误的出现,地点正确、不漏报、不错报也不多报;      

② 迅速地从每个错误中恢复过来,以便分析继续进行;      

③ 对语法正确源程序的分析速度不应降低太多。

1.2.3.语法错误的基本恢复策略

        希望编译器的语法分析方式不是遇到一个语法错误就停止,就需要采取某种恢复策略,使得分析在遇到错误时还能够继续进行。

        紧急方式恢复:这是最简单的方法,适用于大多数分析方法。

        短语级恢复:建立在产生式(CFG)的基础上,以短语为基本分析单元,同时也便于进行语法制导翻译,恢复得比紧急方式要精确,因此被认为是一种较为理想的恢复方式。

        出错产生式

        全局纠正

例题:

        下述两条是有语法错误的语句,其中第一条赋值句结束时忘记加分号:x = a + b             y = c + d; 

        紧急方式:  x = a + b + d; -- 丢弃b之后的若干记号,直到遇到同步记号+      

        短语级恢复:x = a + b;     -- 加入分号,使之成为一个赋值句             

2,上下文无关文法(CFG)

2.1  CFG的定义与表示    

2.1.1 定义

         定义3.1  上下文无关文法是一个四元组G =(N,T,P,S):      

        ① N是非终结符的有限集合(Nonterminals);      

        ② T是终结符的有限集合(Terminals),且N∩T=Φ;      

        ③P是产生式的有限集合(Productions),每个产生式形如: A→α,其中A∈N,被称为产生式的左部,α∈(N∪T)*,被称为产生式的右部,若α=ε,则称A→ε为空产生式(也可以记为A →);      

        ④ S是非终结符,被称为文法的开始符号(Start symbol)。 

2.2.2 例题:

        定义简单算术表达式的上下文无关文法G3.1=(N,T,P,S)如下所示。    

 N={E}   T={+,*,(,),–,id}    S=E    

 P:      

E → E + E        (1)        

E → E * E         (2)        

E → (E)            (3)          

E → –E            (4)          

E → id              (5) 

2.2.3 表示 

        1.由产生式集表示CFG        

        文法可以由其产生式集P代替,而不写四元组。CFG的产生式表示也被称为巴克斯范式(BNF),值得注意的是,规范的BNF中,“→”用“::=”表示。

         2.产生式的一般读法:

         一般情况下,可以将产生式中的记号“→”读作“定义为”或者“可导出”。

        3.终结符与非终结符书写上的区分

         本教材默认采用区分大小写的方法来区分终结符与非终结符,若不作特殊说明,一般用大写英文字母A、B、C表示非终结符,小写英文字母a、b、c表示终结符,小写希腊字母α、β、δ表示任意的文法符号序列,即大小写混合的英文字母串。

        4.产生式的缩写形式 

           2.2.2的例题 G3.1可以重写为如下形式:E → E + E   |  E * E  |  (E)     | –E  | id            

2.2  CFG产生语言的基本方法 —— 推导

2.2.1 推导定义以及性质

        通过推导可以产生CFG所描述的语言。

        推导就是从文法的开始符号S开始,反复使用产生式,将产生式左部的非终结符替换为右部的文法符号序列,直到得到一个终结符序列 

2.2.2 例题:

文法G(E):

E → E + E           (1)

E→ E * E                 (2)          

E → (E)              (3)          

E → –E              (4)        

E → id                     (5)  

 根据文法G使用最左推导得出终结符序列  ”–(id+id)” 。

2.2.3 上下文无关语言(CFL),最左推导

定义3.3  

        由CFG  G所产生的语言L(G)被定义为:            

             

        L(G)称为上下文无关语言(CFL),ω称为句子。若Sα,α∈(N∪T)*,则称α为G的一个句型。 

定义3.4  

        在推导过程中,若每次直接推导均替换句型中最左边的非终结符,则称为最左推导,由最左推导产生的句型被称为左句型。    

        

        类似地,可以定义最右推导与右句型,最右推导也被称为规范推导。  

2.3  推导、分析树与语法树    

定义3.5  对CFG G的句型,分析树被定义为具有下述性质的一棵树。    

        ① 根由开始符号所标记;    

        ② 每个叶子由一个终结符、非终结符或ε标记;    

        ③ 每个内部结点由一个非终结符标记;    

        ④ 若A→X1X2...Xn是一个产生式,则X1,X2,...,Xn是标记为A的内部结点从左到右所有孩子的标记。若A→ε,则标记为A的结点可以仅有一个标记为ε的孩子。 

     分析树与文法和语言存在下述关系:      

        ① 每一直接推导(或者每个产生式),对应一棵仅有父子关系的子树,即产生式左部非终结符“长出”右部的孩子;      

        ② 分析树的叶子从左到右,构成G的一个句型。若叶子仅由终结符标记,则构成一个句子。 

     分析树与推导的关系:    

         ① 分析树是推导的图形表示,但不能显示推导的顺序;    

         ② 每棵分析树都可以对应惟一的最左推导或最右推导;但每个句子(产生式)不一定只有一棵分析树,也就是说每个句子不一定只有一个最左推导或者最右推导。 例:句子id + id * id      

例题:

  用文法G采用最左推导产生句子id+id*id. 

一个句子两棵分析树 (a) 先进行+运算;(b) 先进行*运算;(c) +左结合;(d) +右结合

2.4  二义性与二义性的消除

2.4.1  二义性(Ambiguity)

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

        ① 一个句型有多于一棵分析树,仅与文法和句型有关,与采用的推导方法无关;      

        ②  造成二义性的原因,是文法中缺少对文法符号优先级和结合性的规定。        

        在任何一个程序设计语言中,如果出现了二义性,则表示同一段程序在确定的、相同的环境下反复执行,会得到不同的结果,而这种情况在程序设计中是不允许的。也就是说,任何一个程序设计语言不应该有二义性。 

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

        改写文法可以解决二义性问题,但不是唯一的解决方法。比较上述讨论过的二义文法和非二义文法,发现二义文法至少有两个优点:      

        ① 比非二义文法容易理解;      

        ② 分析效率高(分析树低,直接推导步骤少)。 

3,语言与文法简介

        到目前为止,我们在两个层面上讨论了程序设计语言的结构:从词法分析的层面上看,语言是由字母组成的记号的集合;从语法分析的层面上看,语言是由记号组成的句子的集合。记号可以用正规式描述,句子可以用CFG描述。        

        程序设计语言的结构均可以用文法来描述。文法无论对程序设计语言的设计还是对编译器的编写,至少在以下三个方面起着重要作用:

        ① 文法给出了精确的、易于理解的语言结构的说明;      

        ② 以文法为基础的语言,便于加入新的或修改、删除旧的语言结构;      

        ③ 有些类别的文法,可以自动生成高效的分析器。        

3.1.为什么用正规式而不用CFG描述程序设计语言的词法  

          根据推论3.1,CFG既描述程序设计语言的语法又描述词法,而基于下述几个原因,往往采用正规式而不是CFG描述词法:      

        ① 词法规则简单,用正规式描述已足够;      

        ② 正规式的表示比CFG更直观、简洁、易于理解;      

        ③ 有限自动机的构造比下推自动机简单,且分析效率高;    

        ④ 区分词法和语法,为编译器前端的模块划分提供方便。 

3.2 正规式和CFG的适用条件

        一般情况下,正规式适合描述线性结构,如标识符、关键字、注释等。而CFG适合描述具有嵌套(层次)性质的非线性结构,如不同结构的句子if-then-else、begin-end等。

3.3  形式语言与自动机简介      

        乔姆斯基(Chomsky)把文法分为四种类型: 0型、1型、2型和3型。文法之间的差异在于对产生式施加不同的限制。      

        定义3.8  若文法G=(N,T,P,S)的每个产生式α→β中,均有α∈(N∪T)*,且至少含有一个非终结符,β∈(N∪T)*,则称G为0型文法。          

        对0型文法施加以下第i条限制,即可得到i型文法。

        1.G的任何产生式α→β(S→ε除外) 均满足|α|≤|β| (|x|表示x中文法符号的个数);      

        2.G的任何产生式形如A→β,其中A∈N,β∈(N∪T)*;      

        3.G的任何产生式形如A→a 或者A→aB(或者A→Ba),其中A,B∈N,a∈T。          

        0型文法也被称为短语文法,任何0型语言都是递归可枚举的,反之,递归可枚举集也必定是一个0型语言。

       1型文法就是上下文有关文法,这种文法意味着对非终结符的替换必须考虑上下文,并且一般不允许换成ε串。例如,若αAβ→αγβ是1型文法的产生式,α和β不全为空,则非终结符A只有在左边是α,右边是β这样的上下文中才可能替换成γ。      

        2型文法就是上下文无关文法,非终结符的替换无需考虑上下文。      

        3型文法等价于正规式,因而也被称为正规文法或线性文法。      

        四种类型的文法和它们所描述的语言,以及识别对应语言的自动机分别列举在表中。

4, 自上而下分析的一般方法        

4.1 基本思想 

        自上而下分析的基本思想是:对于任何一个输入序列,从文法的开始符号开始,进行最左推导,直到得到一个合法句子或者发现一个非法结构。在推导的过程中试图用一切可能的方法,自上而下、从左到右为输入序列建立分析树。整个分析是一种试探的过程,是反复使用不同产生式谋求与输入序列匹配的过程。

4.2 例题

        已知如下文法G(S),给出输入序列ω=cad,自上而下试探建立分析树的过程。

        G(S):  S → cAd            A → ab | a

试探性质的自上而下分析 (a) 匹配失败,回溯;(b) 匹配成功,接收

        (1) 若存在形如A → αβ1|αβ2的产生式,即A产生式中有多于一个候选项的前缀相同(称为公共左因子,或简称左因子),则可能会造成虚假匹配,使得在分析过程中可能需要进行大量回溯,从而造成分析效率低、语义动作难以恢复以及出错位置的报告不确切等。    

        (2) 若存在形如A → Aα的产生式,则分析过程中一旦采用了该产生式去替换,就会陷入死循环而使分析无法进行下去。产生式的这种形式被称为左递归。        

        为了避免上述弱点,需要对文法进行重写。消除左递归,以避免陷入死循环;提取左因子,以避免回溯。 

4.3  消除左递归

        分类:直接左递归 间接左递归 

   规则1     直接左递归的产生式A→Aα|β (β不以A开头), A→βA'  A'→αA'|ε

   规则2     直接左递归的产生式 A→ Aα1 | Aα2 | ... | Aαm |β1 |β2 | ...|βn(所有βi均不以A直接开头或间接开头), A→β1A'|β2A'|...|βnA'  A'→α1A'|α2A'|...αmA'|ε

并不是所有的文法都能消除左递归!!! 

4.4  提取左因子    

         对于有左因子的文法,推导过程中会出现无法确定用A产生式的哪个候选项替换A的情况,这时,可以重写A产生式来推迟这种决定,直到看见足够的输入,能正确决定所需选择为止。这一过程类似于有限自动机的确定化,被称为提取左因子。    

 算法3.3  提取文法的左因子      

输入 : 文法G      

输出:  等价的无左因子文法G' 

方法  :为每个产生式A,找出其候选项中最长公共前缀α,重排A产生式如下,其中γ是不以α为前缀的其他候选项。      

        A→ αβ1|αβ2| ...|αβn|γ    

并用下述产生式替代之。      

        A→ αA'|γ    

        A'→ β1|β2| ...|βn

重复此过程,直到所有A产生式的候选项中均不再有公共前缀。

练习:

1、文法G(A):A→aABj | a                      B→Bb | d

2、文法G(M):M→MaH | H                       H→b(M) | (M) | b

3、文法G(S):S→AdD | ε                      A→aAd | ε               D→DdA | b | ε 

5,FIRST集和FOLLOW集 

5.1 FIRST集 

  算法3.5  计算X的FIRST集合  

输入  文法符号X  

输出  X的FIRST集合  

方法  应用下述规则:    

        ① 若X是终结符,则FIRST(X)={X};  

         ② 若X 是非终结符且有X→ε,则加入ε到FIRST(X);    

        ③ 若X 是非终结符且有X→Y1Y2...Yk,并令Y0=ε,Yk+1=ε,则对所有j(0≤j≤k),若a∈FIRST(Yj+1)且ε∈FIRST(Yj),加入a到FIRST(X)。 

5.2 FOLLOW 

    算法3.6  计算所有非终结符的FOLLOW集合    

输入  文法G    

输出  G中所有非终结符的FOLLOW集合    

方法  应用下述规则:    

① 加入#到FOLLOW(S),其中,S是开始符号,#是输入结束标记;    

② 若有产生式A→αBβ,则除ε外,FIRST(β)的全体加入到FOLLOW(B);        

③ 若有产生式A→αB或A→αBβ而ε∈FIRST(β),则FOLLOW(A)的全体加入FOLLOW(B)。 

6,预测分析表

    算法3.7  构造预测分析表    

输入  文法G    

输出  分析表M    

方法  应用下述规则:    

① 对文法的每个产生式A→α,执行②和③;    

② 对FIRST(α)的每个终结符a,加入α到M[A,a];    

③ 若ε在FIRST(α)中,则对FOLLOW(A)的每个终结符b(包括#),加入α到M[A,b];        

④ M中其他没有定义的条目均是error。

     预测分析表是一个二维数组M[A, a] 所有的非终结符构成分析表的行下标; 所有的终结符构成分析表的列下标,其中包括特殊的结束标志#。 M[A, a]中的内容表示当前栈顶为非终结符A且当前输入为终结符a时,分析器要进行的动作。 

3.4.5.3  LL(1)文法      

        定义3.12  一个文法G被称为是LL(1)文法,当且仅当为它构造的预测分析表中不含多重定义的条目。由此分析表所组成的分析器被称为LL(1)分析器,它所分析的语言被称为LL(1)语言。第一个L表示从左到右扫描输入序列,第二个L表示产生最左推导,1表示在确定分析器的每一步动作时向前看一个终结符。 

     推论3.2  一个文法G是LL(1)的,当且仅当G的任何两个产生式A→α|β,满足下面条件:       ① 对任何终结符a,α和β不能同时推导出以a开始的文法符号序列;      

② α和β最多有一个可以推导出ε;      

③ 若β       ε,则α不能推导出以在FOLLOW(A)中的终结符开始的任何文法符号序列。 

         推论3.2实际上等价于当且仅当G的任何两个产生式A→α|β满足上述三个条件时,为文法G构造的预测分析表中不含多重定义的条目。反之,若不满足三个条件之一,则分析表中有多重定义条目。         若条件①不满足,即存在终结符a,α和β同时推导出以a开始的文法符号序列,则根据算法3.7规则②,M[A,a]中就会有多重定义条目A→α和A→β;

            若条件②不满足,即α和β均可推出ε,则根据算法3.7规则③,任何属于FOLLOW(A)的终结符b(包括#),M[A,b]中就会有多重定义条目A→α和A→β;     若条件③不满足,即存在终结符b,它既在FOLLOW(A)中,又在FIRST(α)中,则     算法3.7规则②把条目A→α加入到M[A,b]中,而规则③又把条目A→β加入到M[A,b]中。

LL(1)文法的弱点:  (1) 文法比较难写。因为按照人们习惯写出的文法,往往含有左递归和左因子。虽然有成熟的算法可以消除左递归和提取左因子,但改写之后的文法很难读也很难使用。同时对比分析树可以看出,改写后文法构造的分析树不直观且推导步骤增加。 (2) LL(1)文法适应范围有限,对于有些语言,往往写不出它的LL(1)文法。 

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

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

相关文章

MyBatis 核心配置讲解(上)

大家好,我是王有志,一个分享硬核 Java 技术的互金摸鱼侠。 前两篇的文章中我们分别介绍了 MyBatis 和 MyBaits 的应用组成,到这里基础篇的内容就结束了。 从今天开始,我们正式进入 MyBatis 学习的第二阶段:MyBatis 的…

插值与重采样在AI去衣技术中的关键作用

在人工智能(AI)的众多应用中,去衣技术作为一种新兴的图像处理技术,逐渐引起了广泛关注。这项技术不仅涉及复杂的计算机视觉和深度学习算法,还需要对图像处理中的插值与重采样技术有深入的理解。本文将详细探讨插值与重…

【笔试训练】day7

1.在字符串中找出连续最长的数字串 思路&#xff1a; 简单双指针&#xff0c;随便怎么暴力 代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include<string> using namespace std;int main() {string str;cin >> str;int ans …

微服务之SpringCloud AlibabaNacos服务注册和配置中心

一、概述 1.1注册中心原理 在微服务远程调用的过程中&#xff0c;包括两个角色&#xff1a; 服务提供者&#xff1a;提供接口供其它微服务访问&#xff0c;比如item-service 服务消费者&#xff1a;调用其它微服务提供的接口&#xff0c;比如cart-service 在大型微服务项目…

Laya2.13.3 Texture和Teture2D的关系,怎样将Texture2D转换为Texture。

Texture是是纹理处理类&#xff0c;Sprite和Image上显示的图像都是经Texture处理的&#xff0c; Texture2D是3d模型纹理贴图的处理类&#xff0c;用于显示3D模型的纹理细节。 如何将Textture2D转换为Texture&#xff0c;Texture的API接口如下&#xff1a; 可以看到Texture首先…

STM32 | USART实战案例

STM32 | 通用同步/异步串行接收/发送器USART带蓝牙(第六天)随着扩展的内容越来越多,很多小伙伴已经忘记了之前的学习内容,然后后面这些都很难理解。STM32合集已在专栏创建,方面大家学习。1、通过电脑串口助手发送数据,控制开发板LED灯 从题目中可以挖掘出,本次使用led、延…

vscode 配置verilog环境

一、常用的设置 1、语言设置 安装如下插件&#xff0c;然后在config 2、编码格式设置 解决中文注释乱码问题。vivado 默认是这个格式&#xff0c;这里也设置一样。 ctrl shift p 打开设置项 3、插件信任区设 打开一个verilog 文件&#xff0c;显示是纯本文&#xff0c;没…

HarmonyOS开发环境搭建 移动开发 鸿蒙开发 ArkTS

&#x1f4dc;目录 &#x1f4a1; 环境搭建 &#x1f680;安装nodejs &#x1f935;安装ohpm &#x1f354;安装SDK &#x1f4a5;Emulator安装 &#x1f336;️新建ArkTs项目 &#x1f3c6;️ArkTS语言 ✨️基本语法 &#x1f388; 声明式UI描述 &#x1f371;组件 …

使用spring boot集成shardingsphere分库分表简易测试

根据如下pom整上一个spring-boot项目&#xff0c;spring-boot版本用2.3.5&#xff0c;shardingsphere用5.1.1。 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://ww…

【KingSCADA】通过地址引用和弹窗模板实现设备控制

当相同的设备过多时&#xff0c;要做很多相同的弹窗&#xff0c;这种情况下可以通过地址引用和弹窗模板实现设备控制。 1.变量创建 2.画面开发 以阀门控制为例&#xff0c;只需要做一个阀门控制界面模板 3.地址引用 # 4.实现效果

Linux基本命令之正则表达式(转义字符)

一&#xff1a;查看二进制文件 strings 命令&#xff1a;strings 文件名 生成链接文件 ln 命令&#xff1a;ln 选项 源文件(f1) 链接文件&#xff08;f2&#xff09; 软连接&#xff1a;eg:ln -s f1 f2 软链接不能跨分区链接&#xff0c;但可以在同一分区的不同目录下链接…

小型架构实验模拟

一 实验需求 二 实验环境 22 机器&#xff1a; 做nginx 反向代理 做静态资源服务器 装 nginx keepalived filebeat 44机器&#xff1a; 做22 机器的备胎 装nginx keepalived 99机器&#xff1a;做mysql的主 装mysqld 装node 装filebeat 77机器&#xff1a;做mysq…

目标检测网络YOLO进化之旅

yolo系列网络在目标检测领域取得了巨大的成功&#xff0c; 尤其是在工程实践中&#xff0c; 以其出色的性能优势获得了广泛的应用落地。 YOLO的前3个版本是由同一个作者团队出品&#xff0c; 算是官方版本。 之后的版本都是各个研究团队自己改进的版本&#xff0c; 之间并无明…

Linux 安装 Docker +Docker Compose + cucker/get_command_4_run_container

TIP&#xff1a;下面演示的 Linux 系统为 CentOS 7.9。 Docker 更新你的系统并安装必要的依赖项&#xff1a; sudo yum update -y sudo yum install -y yum-utils device-mapper-persistent-data lvm2添加 Docker 的官方仓库&#xff1a; sudo yum-config-manager --add-rep…

ConcurrentHashMap 源码分析(一)

一、简述 本文对 ConcurrentHashMap#put() 源码进行分析。 二、源码概览 public V put(K key, V value) {return putVal(key, value, false); }上面是 ConcurrentHashMap#put() 的源码&#xff0c;我们可以看出其核心逻辑在 putVal() 方法中。 final V putVal(K key, V val…

golang本地缓存库之bigcache

1. 前言 上周工作之余逛github看到一个本地缓存库bigcache&#xff0c;这个是allegro公司开源的一个项目&#xff0c;主要是用于本地缓存使用&#xff0c;根据他们的博客说明&#xff0c;他们编写这个库最初的目的就是实现一个非常快速的缓存服务。 看了下bigcache这个库的源…

前端入门:HTML(CSS边框综合案例)

案例&#xff1a; 源代码&#xff1a; css-borders.html: <body> <div id"square"> </div> <br> <div id"triangle"> </div> <br> <div id"trapezium"> </div> <br> <div id…

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第六套

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第六套 (共9套&#xff0c;有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09; 部分题目分享&#xff0c;完整版获取&#xff08;WX:didadidadidida313&#xff0c;加我备注&#x…

Linux--Linux常用命令

Linux常用命令 前言Linux命令格式命令讲解1、ls:查看当前目录下所有的内容语法:ls[-al][dir]2、pwd: 查看当前所在目录3、cd : 切换目录4、touch[文件名] : 如果文件不存在新建文件5、mkdir: 创建目录6、rm: 删除指定文件7、rmdir: 删除空目录8、cat:用于显示文件内容9、m…

磁盘损坏无法读取:原因、恢复方案与防范之道

在数字化信息爆炸的时代&#xff0c;磁盘作为数据存储的重要载体&#xff0c;承载着无数重要的文件和资料。然而&#xff0c;当磁盘突然损坏&#xff0c;无法读取数据时&#xff0c;我们往往会陷入困境&#xff0c;焦虑不已。面对这种情况&#xff0c;我们该如何应对&#xff1…