首页 > 其他分享 >Bison中百分号的作用

Bison中百分号的作用

时间:2024-10-27 08:51:13浏览次数:1  
标签:百分号 头文件 %% 声明 代码 Bison 部分 作用

Bison中百分号的作用

文件开头

在 Bison 中,百分号 % 是用于声明和指示 Bison 解析器行为的符号。你提到的代码片段中的 %code requires%{ %} 是 Bison 特定的语法标记,用来包含 C++ 代码或指示特定的行为。

1. %code requires {}

  • 作用:用于声明在解析器生成前必须包含的代码,通常是头文件的引用或前置声明。这部分代码会被放置在 Bison 自动生成的头文件中,确保其他文件或模块在包含这个头文件时也能获得这些定义。
  • 你代码中的例子
    %code requires {
      #include <memory>
      #include <string>
      #include "BaseAST.hpp"
    }
    
    这部分代码将被放入到生成的头文件中,以便在解析器生成和编译时可以直接访问 std::stringstd::unique_ptr 以及你定义的 BaseAST 类。

2. %{ %}(C 代码块)

  • 作用:用于包含需要嵌入在生成的解析器中的 C/C++ 代码。这部分代码通常被插入到生成的 .c.cpp 文件的最前面,常见用途是定义辅助函数、声明全局变量、引入所需的头文件等。
  • 你代码中的例子
    %{
    #include <iostream>
    #include <memory>
    #include <string>
    #include <vector>
    #include "BaseAST.hpp"
    
    // 声明 lexer 函数和错误处理函数
    int yylex();
    void yyerror(std::unique_ptr<BaseAST> &ast, const char *s);
    
    using namespace std;
    %}
    
    这部分代码将被直接插入到生成的解析器的 .cpp 文件中,确保解析器可以访问这些库和函数(如 yylexyyerror)。

3. 其他常见的 Bison 百分号指令

  • %token:用于声明终结符。
  • %type:声明非终结符的类型。
  • %start:指定起始规则。
  • %union:声明用于存储语法树节点值的联合体。

总结

  • %code requires {}:指定必须包含的代码,会被放入生成的头文件中。
  • %{ %}:包含的 C/C++ 代码,直接插入到生成的解析器实现文件中。

这些指令有助于管理代码的分工,让 Bison 的自动生成代码与手写代码合理地结合起来。

在 Bison 中,%% 也是一种特殊符号,用于划分Bison 文件中的不同部分。具体来说,Bison 文件由声明部分规则部分辅助代码部分组成,而 %% 用来将这些部分清晰地分隔开。


文件总览和主体

Bison 文件结构及 %% 的作用

1. 文件的基本结构

Bison 文件通常由三大部分组成:

  1. 声明部分
    在这一部分,我们定义终结符、非终结符及它们的数据类型。
  2. 规则部分
    定义语法规则,描述如何将输入转换为目标语法结构。
  3. 辅助代码部分
    包含 C/C++ 的实现代码,如错误处理函数等。

结构如下:

/* 声明部分 */
%{
  // C/C++ 头文件和全局声明
%}

/* 定义终结符、非终结符和起始符 */
%token INTEGER
%start program

/* 规则部分 */
%%

program:
    expr { std::cout << "Result: " << $1 << std::endl; }
;

expr:
    INTEGER { $$ = $1; }
  | expr '+' expr { $$ = $1 + $3; }
;

/* 辅助代码部分 */
%%

int yylex() {
  // 词法分析器实现
}

void yyerror(const char *s) {
  std::cerr << "Error: " << s << std::endl;
}

2. %% 的具体作用

  1. 第一个 %%
    声明部分规则部分分隔开。声明部分通常包含 %token 等定义语句,以及引入的 C/C++ 头文件。

  2. 第二个 %%
    规则部分辅助代码部分分隔开。规则部分定义语法规则,辅助代码部分则包含辅助函数的实现,例如词法分析函数 yylex 和错误处理函数 yyerror


3. 你代码中的 %% 的作用

  • %% 前面的部分:这是语法规则的定义部分。你在这里定义了如何通过语法规则将输入解析为抽象语法树(AST)或其他结构。

  • %% 后面的部分:这是辅助代码部分,你在这里实现了函数,如 yylex()yyerror()。具体到你的例子,你可能在这个部分实现了 Bison 调用的错误处理函数:

void yyerror(std::unique_ptr<BaseAST> &ast, const char *s) {
    std::cerr << "Error: " << s << std::endl;
}
  • yyerror 函数:这是 Bison 的标准错误处理接口。当解析过程中遇到语法错误时,Bison 会调用这个函数,并传入错误信息字符串 s

4. 小结

  • %% 是 Bison 文件的分隔符,用于分割声明部分、规则部分和辅助代码部分。
  • yyerror 是一个错误处理函数,用于报告解析过程中遇到的错误。
  • 你的代码结构大致如下:
    1. 声明部分(引入头文件、声明函数)。
    2. 规则部分(定义语法规则)。
    3. 辅助代码部分(定义 yyerror 和其他辅助函数)。

这些分隔符确保你的代码逻辑清晰,并让 Bison 能够正确地生成解析器代码。

标签:百分号,头文件,%%,声明,代码,Bison,部分,作用
From: https://www.cnblogs.com/smartljy/p/18506830

相关文章

  • 在K8S中,kube-apiserver和kube-scheduler的作用是什么?
    在Kubernetes(K8s)中,kube-apiserver和kube-scheduler是两个至关重要的组件,它们各自承担着不同的职责,共同协作以确保集群的正常运行。1.kube-apiserver的作用提供API接口:kube-apiserver是KubernetesAPI的入口,提供了RESTful风格的API接口,支持JSON和YAML格式的数据交互。集群内......
  • 在K8S中,主节点的作用是什么?
    在Kubernetes(K8S)集群中,主节点(MasterNode)扮演着至关重要的角色。主节点负责集群的整体管理和协调工作。以下是主节点的一些关键作用:集群状态管理:主节点负责维护整个集群的状态信息。这些信息存储在etcd数据库中,包括节点列表、Pods、Services、ConfigMaps、Secrets等所有......
  • Web、RESTful API 在微服务中的作用是什么?
    Web、RESTfulAPI在微服务中的作用是什么?在当今的软件开发领域,微服务架构正变得越来越流行。而在微服务架构中,Web和RESTfulAPI起着至关重要的作用。一、微服务架构简介微服务架构是一种将应用程序拆分为一组小型服务的架构风格。每个服务都可以独立部署、扩展和维护。这些......
  • 【深入理解SpringCloud微服务】Hystrix作用与原理剖析
    【深入理解SpringCloud微服务】Hystrix作用与原理剖析Hystrix的作用熔断降级隔离Hystrix有限流的功能吗?Hystrix的原理@HystrixCommand注解是如何起作用的工作流程1、构建命令对象2、执行命令3、检查缓存是否开启并且是否命中4、检查断路器是否打开5、检查线程池或信号量......
  • express常见的规范以及各模块的作用与使用方式
    +---------------------++---------------------++---------------------+|app.js|<----->|routes/|<----->|controllers/|+---------------------++---------------------++-------------......
  • python异常处理中finally的作用
    Python异常处理中finally的作用包括:1、确保程序块退出前的代码执行、2、资源释放和清理工作、3、与return语句的交互行为。在finally子句中最为典型的应用是清理资源,比如关闭文件流或数据库连接。不论try块内代码是否触发了异常,finally子句都会被执行,这为程序员提供一种可靠的手段......
  • C语言的 main 函数具体作用是什么
    C语言的mAIn函数具体作用有:1.程序的起点和入口;2.程序的执行流程;3.接收命令行参数;4.程序的结束点;5.操作系统与程序的接口;6.提供程序的整体结构。main函数是C程序的起点和入口。当程序开始执行时,操作系统会首先寻找并调用main函数。1.程序的起点和入口main函数是C程序......
  • 加密技术的作用
    摘要加密技术确保数据安全性、保护隐私权利以及维护网络通信的完整性。其中一点,特别是保护隐私权利方面,成为当前网络环境中人们普遍关切的重点。在个人数据越来越频繁地在线传输的情况下,加密技术如同一面盾牌,保障信息不被未授权访问者获取与滥用。一、信息加密的重要性与必要性......
  • modsecurity: 多条规则共同起作用时,使用chain(规则链)
    一,什么时候使用chain1,规则链("chain")的作用与AND一致。仅当多条规则中的变量检查同时匹配成功时,才会触发链式规则的第一条规则中指定的阻断性操作。链式规则中如果有一条规则没有匹配成功,则表示整个规则链匹配失败,不会执行对应的阻断性动作2,如果需要判断的条件大于等于2个,除最后......
  • z-value在统计学中的作用是什么
    Z-value(标准分数)在统计学中扮演着关键角色,其主要作用包括:1.数据标准化;2.概率计算和假设检验;3.异常值检测;4.在回归分析中的应用;5.质量控制。通过这些应用,我们可以更好地理解Z-value在统计分析、决策制定和科学研究中的重要性。1.数据标准化概念与计算方法:Z-value是通过从......