句柄和规范规约(超详细)

本文深入探讨自下而上分析法,包括算符优先分析法和LR分析法。重点讲解句柄的概念,它是右句型中与产生式右部匹配的子串,在规约过程中起到关键作用。通过示例展示了如何使用句柄进行规约,逐步解释了规约过程,帮助读者理解规范句型的形成。同时,对比了不同分析方法的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.基本概念

(1)自下而上分析法

1.算符优先分析法

2.LR分析法

(2)句柄

(3)规范规约

2.用句柄规约 

3.两种方法的比较 

4.规范句型 


 

1.基本概念

要想理解句柄和规范规约,我们要先来看看这一章的主题——自下而上分析法,从主题入手更加容易理解句柄和规范规约的意义。

(1)自下而上分析法

1.算符优先分析法

这个知识点已经在之前的博客详细说明了,大家如果不太理解,可以去看一看 构造优先关系表_驼驼学编程的博客-CSDN博客

2.LR分析法

(2)句柄

  • 句型的句柄是该句型中和一个产生式右部匹配的子串并把它规约成该产生式左部的非终结符代表了最右推导过程中的逆过程的一步。

  • 句柄的右边仅仅含有终结符或者空符。

  • 只有文法无二义性,每个右句型才有唯一句柄。
  • 简而言之,就是最左边的两层字树的末端

(3)规范规约

2.用句柄规约 

先给出大家一道例题带大家理解

我们应该怎么做此类题型呢?其实非常简单,就是找出句柄,然后进行规约消除,直到找不到句柄规约为止。

有了这个指导思想,我们可以开始这一步了

我们可以通过这颗树发现此时最左边的两层字数的末端是b,也就是红色方框中的,我们要将A->b进行规约,

我们进行规约后就可以变成下面图片中的语法树了。 

接着进行规约  

 

 

 

最终我们可以得到最终结果 

 

3.两种方法的比较 

4.规范句型 

我们例题中每一步得到的句型都是规范句型。 

在 C++ 中,句柄(Handle)主要是用于 Windows 环境下的资源管理,特别是在 Windows API 中。虽然 C++ 标准库并没有内置的句柄概念,但在使用 Windows 库(如 `Win32 API` 或 `COM`)时,我们会遇到 `HANDLE` 类型的句柄。以下是使用 C++ 进行句柄操作的基本步骤: 1. **获取句柄**: - 使用特定函数,如 `CreateFile()` 创建文件句柄,`CreateWindow()` 创建窗口句柄等。 ```cpp HANDLE hFile = CreateFile("file.txt", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); ``` 2. **检查有效性**: - 初始化时可以检查返回值是否有效,例如非零表示成功。 ```cpp if (hFile == INVALID_HANDLE_VALUE) { // 处理错误 } ``` 3. **使用句柄**: - 可以像指针一样传递句柄给函数,例如读取文件或显示窗口。 ```cpp DWORD bytesRead; ReadFile(hFile, buffer, sizeof(buffer), &bytesRead, NULL); ``` 4. **释放资源**: - 在不再需要句柄时,记得关闭或删除它,防止内存泄漏。 ```cpp CloseHandle(hFile); // 对于所有由 CreateFile 返回的句柄 ``` 5. **异常处理**: - 考虑到操作系统错误,应在调用系统函数后检查并处理返回的错误代码。 6. **智能指针**(如 C++11 之后): - 可以考虑使用 `std::unique_ptr<HANDLE>` 或 `std::shared_ptr<HANDLE>` 等智能指针,自动在析构时关闭句柄,简化资源管理。 重要注意事项: - 不同类型的句柄有不同的生命周期处理规则。 - 避免在不同线程间共享句柄,除非进行了适当的同步。 - 及时释放资源,避免长时间占用系统资源。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值