当前位置: 首页 > news >正文

(1)词法分析器

简单来说就是写一个函数,这个函数的输入是文字流,我们要把这个文字流的标签搞出来

比如某种语言标签如下

enum Token {tok_eof = -1,// commandstok_def = -2,tok_extern = -3,// primarytok_identifier = -4,tok_number = -5,
};

然后词法分析器相当于一个函数,排除空格,检查扫描的文字,然后给出标签

static std::string IdentifierStr; // Filled in if tok_identifier

static double NumVal;             // Filled in if tok_number

/// gettok - Return the next token from standard input.

static int gettok() {

  static int LastChar = ' ';

  // Skip any whitespace.

  while (isspace(LastChar))

    LastChar = getchar();

  if (isalpha(LastChar)) { // identifier: [a-zA-Z][a-zA-Z0-9]*

    IdentifierStr = LastChar;

    while (isalnum((LastChar = getchar())))

      IdentifierStr += LastChar;

    if (IdentifierStr == "def")

      return tok_def;

    if (IdentifierStr == "extern")

      return tok_extern;

    return tok_identifier;

  }

  if (isdigit(LastChar) || LastChar == '.') { // Number: [0-9.]+

    std::string NumStr;

    do {

      NumStr += LastChar;

      LastChar = getchar();

    } while (isdigit(LastChar) || LastChar == '.');

    NumVal = strtod(NumStr.c_str(), nullptr);

    return tok_number;

  }

//跳注释

  if (LastChar == '#') {

    // Comment until end of line.

    do

      LastChar = getchar();

    while (LastChar != EOF && LastChar != '\n' && LastChar != '\r');

    if (LastChar != EOF)

      return gettok();

  }

  // Check for end of file.  Don't eat the EOF.

  if (LastChar == EOF)

    return tok_eof;

  // Otherwise, just return the character as its ascii value.

  int ThisChar = LastChar;

  LastChar = getchar();

  return ThisChar;

}

这段代码是一个词法分析器的实现,用于将输入分解成标记(tokens)。它定义了一个全局变量IdentifierStr用于保存标识符的名称,NumVal用于保存数值字面量的值。

gettok函数从标准输入中读取下一个字符,并根据字符的类型返回相应的标记。它首先跳过任何空格字符,然后根据字符的类型进行不同的处理。

如果字符是字母,则识别为标识符。gettok会读取连续的字母和数字字符,将它们保存在IdentifierStr中,并根据IdentifierStr的值判断是否是关键字(如"def"和"extern")或是普通的标识符。

如果字符是数字或小数点,则识别为数值字面量。gettok会读取连续的数字和小数点字符,将它们保存在NumStr中,并使用strtod函数将其转换为双精度浮点数,保存在NumVal中。

如果字符是井号(#),则识别为注释。gettok会跳过注释直到行尾,并递归调用gettok函数获取下一个标记。

如果字符是文件结尾(EOF),则返回标记tok_eof表示已到达文件结尾。

否则,将字符作为其ASCII值返回。

总的来说,这段代码实现了一个简单的词法分析器,可以将输入分解成标记,并根据标记的类型进行相应的处理。

源码地址1. Kaleidoscope: Kaleidoscope Introduction and the Lexer — LLVM 18.0.0git documentation

相关文章:

(1)词法分析器

简单来说就是写一个函数,这个函数的输入是文字流,我们要把这个文字流的标签搞出来 比如某种语言标签如下 enum Token {tok_eof -1,// commandstok_def -2,tok_extern -3,// primarytok_identifier -4,tok_number -5, }; 然后词法分析器相当于一个…...

丢掉破解版,官方免费了!!!

哈喽!大家好。 几天不见,今天给大家带来一款海外的神器,官方宣布完全免费,但仅限于个人与教育用途,切勿商用噢! 不要看这个软件名字普普通通,实际上内蕴乾坤! 接下来看我给大家炫一…...

Termux

touch myfile.txt termux-setup-storage 访问手机文件 参考地址 apt update apt upgrade 命令参考链接...

yolo目标检测+目标跟踪+车辆计数+车辆分割+车道线变更检测+速度估计

这个项目使用YOLO进行车辆检测,使用SORT(简单在线实时跟踪器)进行车辆跟踪。该项目实现了以下任务: 车辆计数车道分割车道变更检测速度估计将所有这些详细信息转储到CSV文件中 车辆计数是指在道路上安装相应设备,通过…...

基于Java酒店管理系统

基于Java酒店管理系统 功能需求 1、客房管理:系统需要提供客房的信息管理功能,包括客房的类型、数量、价格、状态(如空闲、已预订、已入住等)等信息。此外,系统还应支持对客房信息的修改和查询操作。 2、预订管理&a…...

GoLong的学习之路,进阶,微服务之原理,RPC

其实我早就很想写这篇文章了,RPC是一切现代计算机应用中非常重要的思想。也是微服务和分布式的总体设计思想。只能说是非常中要,远的不说,就说进的这个是面试必问的。不管用的上不,但是就是非常重要。 文章目录 RPC的原理本地调用…...

vLLM介绍

简介 vLLM 工程github地址 Paged attention论文地址 vLLM开发者介绍 Woosuk Kwon vLLM: A high-throughput and memory-efficient inference and serving engine for LLMs. SkyPilot: A framework for easily and cost effectively running machine learning workloads on …...

DevOps搭建(一)-之swappiness安装详细步骤

1、安装swappiness yum install procps 修改配置 vim /etc/sysctl.conf 在配置文件中添加参数 vm.swappiness10 使生效 sysctl -p 如何确认swap分区是否开启 # free -mtotal used free shared buff/cache available Mem: 971 …...

微软发布Orca2,“调教式”教会小规模大语言模型如何推理!

我们都知道在大多数情况下,语言模型的体量和其推理能力之间存在着正相关的关系:模型越大,其处理复杂任务的能力往往越强。 然而,这并不意味着小型模型就永远无法展现出色的推理性能。最近,奶茶发现了微软的Orca2公开了…...

JVM 内存回收算法

文章目录 JVM 内存回收算法有哪些:一、分代收集1.分代收集理论2.垃圾收集 二、垃圾收集算法1. 标记-清除算法2. 复制算法3. 标记-整理算法 JVM就是Java虚拟机,JVM的内回收对其原理的认识也是很有必要的,当底层的系统出现内存溢出或者内存泄漏…...

11.28~11.29基本二叉树的性质、定义、复习;排序算法;堆

完全二叉树(Complete Binary Tree)是一种特殊的二叉树结构,它具有以下特点: 所有的叶子节点都集中在树的最后两层;最后一层的叶子节点都靠左排列;除了最后一层,其他层的节点数都达到最大值。 …...

轮播插件Slick.js使用方法详解

相比于Swiper而选择使用Slick.js的原因主要是因为其兼容不错并且在手机端的滑动效果更顺畅 参数: 1.基本使用:一般使用只需前十个属性 $(.box ul).slick({autoplay: true, //是否自动播放pauseOnHover: false, //鼠标悬停暂停自动播放speed: 1500, //…...

postgresql pg_hba.conf 配置详解

配置文件之pg_hba.conf介绍 该文件用于控制访问安全性,管理客户端对于PostgreSQL服务器的访问权限,内容包括:允许哪些用户连接到哪个数据库,允许哪些IP或者哪个网段的IP连接到本服务器,以及指定连接时使用的身份验证模…...

使用粗糙贴图制作粗纹皮革手提包3D模型

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时,有几种不同的风格&#xf…...

Chrome清除特定网站的Cookie,从而让网址能正常运行(例如GPT)

Chrome在使用某些网址的时候,例如GPT的时候,可能会出现无法访问这个网址的情况,就是点不动啥的 只需要把你需要重置的网址删除就好了...

history路由解决刷新出现404的问题

本文具体重点介绍怎么解决浏览器路由(history模式)解决404的问题。 在项目打包上线时,如果采用的是哈希模式,不会出现404,原因是 url 中 # 号后面的内容不会发给后端当作资源路径请求服务器。 具体流程(哈…...

ubuntu22下使用nvidia 2080T显卡部署pytorch

1.直接到NVIDA官网下载相应的驱动,然后安装官方驱动 | NVIDIA 2.下载相应版本cuda,并安装,安装时不安装驱动 3.conda install pytorch2.1.0 torchvision0.16.0 torchaudio2.1.0 pytorch-cuda12.1 -c pytorch -c nvidia 安装pytorch。 安装…...

【Spark基础】-- 理解 Spark shuffle

目录 前言 1、什么是 Spark shuffle? 2、Spark 的三种 shuffle 实现 3、参考 前言 以前,Spark 有3种不同类型的 shuffle 实现。每种实现方式都有他们自己的优缺点。在我们理解 Spark shuffle 之前,需要先熟悉 Spark 的 execution model 和一些基础概念,如:MapReduce、…...

软件测试入门:静态测试

什么是静态测试 顾名思义,这里的静态是指程序的状态,即在不执行代码的情况下检查软件应用程序中的缺陷。进行静态测试是为了仅早在开发的早期阶段发现程序缺陷,因为这样可以更快速地识别缺陷并低成本解决缺陷,它还有助于查找动态测…...

力扣labuladong一刷day30天二叉树

力扣labuladong一刷day30天二叉树 文章目录 力扣labuladong一刷day30天二叉树一、654. 最大二叉树二、105. 从前序与中序遍历序列构造二叉树三、106. 从中序与后序遍历序列构造二叉树四、889. 根据前序和后序遍历构造二叉树 一、654. 最大二叉树 题目链接:https://…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...