自制编程语言(第三弹)定义Token
终于到了激动人心的实现时候了。为了实现我们的自制语言,我们需要的步骤为:
- 词法分析
- 语法分析
- 语义分析(此处不设置)
- 解释器
详细完整的代码可以点击这里查看github项目。
词法分析:
将代码片段识别为关键词、标识符、操作符、数字字面量等Token。
首先我们定义需要定义我们语言中所用到所有token类型
public enum TokenType
{NAME,INT_CONST,REAL_CONST,STR,NEWLINE,INDENT,DEDENT,COLON,LPAREN,RPAREN,LBRACK,RBRACK,ASSIGN,COMMENT,DOT,IF,ELSE,ELIF,CASE,WHEN,EQ,NE,LT,LE,GT,GE,PLUS,MINUS,MUL,DIV,FLOORDIV,MOD,POW,NOT,AND,OR,TRUE,FALSE,NONE,EOF
}
定义一个Token类,用于封装和包含Token信息
public class Token
public TokenType Type { get; set; }
public object Value { get; set; }
public int Line { get; set; }
public int Column { get; set; }
对保留字做个映射
public static Dictionary<string, TokenType> ReservedKeywords { get; } = new Dictionary<string, TokenType>()
{{"的",TokenType.DOT },{"如果",TokenType.IF},{"否则",TokenType.ELSE},{"否则如果",TokenType.ELIF},{"选择",TokenType.CASE},{"选项",TokenType.WHEN},{"非",TokenType.NOT},{"并且",TokenType.AND},{"或者",TokenType.OR},{"幂",TokenType.POW},{"true",TokenType.TRUE},{"false",TokenType.FALSE},{"none",TokenType.NONE},{"真",TokenType.TRUE},{"假",TokenType.FALSE},{"开",TokenType.TRUE},{"关",TokenType.FALSE},{"空",TokenType.NONE},
};
public static Token GetReservedKeywords(string value, int line, int column)
{if (ReservedKeywords.ContainsKey(value))return new Token(ReservedKeywords[value], value, line, column);return null;
}
设置构造函数和ToString
public Token(TokenType type, object value, int line, int column)
{Type = type;Value = value;Line = line;Column = column;
}
public override string ToString()
{return string.Format("Token({0}, {1}, position = {2}:{3})", Type, Value, Line, Column);
}
相关文章:
自制编程语言(第三弹)定义Token
终于到了激动人心的实现时候了。为了实现我们的自制语言,我们需要的步骤为: 词法分析语法分析语义分析(此处不设置)解释器 详细完整的代码可以点击这里查看github项目。 词法分析: 将代码片段识别为关键词、标识符、…...
linux下的工具---yum
一、什么是yum yum是Linux下的软件包管理器 二、什么是软件包管理器 1、在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 2、但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在…...
java全局异常处理(springboot)
介绍: 在日常项目开发中,异常是常见的,但是如何更高效的处理好异常信息,让我们能快速定位到BUG,是很重要的,不仅能够提高我们的开发效率,还能让你代码看上去更舒服,SpringBoot的项目…...
JAVA将PDF转图片
前言 当今时代,PDF 文件已经成为了常用的文档格式。然而,在某些情况下,我们可能需要将 PDF 文件转换为图片格式,以便更方便地分享和使用。这时,我们可以使用 Java 编程语言来实现这个功能。Java 提供了许多库和工具&a…...
合并区间[中等]
一、题目 以数组intervals表示若干个区间的集合,其中单个区间为intervals[i] [starti, endi]。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。 示例 1: 输入:intervals […...
MYSQL基础知识之【LIKE子句的使用 ,NULL值的处理,空值的处理】
文章目录 前言MySQL LIKE 子句在PHP脚本中使用 LIKE 子句 MySQL NULL 值处理在命令提示符中使用 NULL 值使用PHP脚本处理 NULL 值 后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:Mysql 🐱👓博主在前端领域还有…...
线索二叉树:C++实现
引言: 线索二叉树是一种特殊的二叉树,它可以通过线索(线索是指在二叉树中将空指针改为指向前驱或后继的指针)的方式将二叉树转化为一个线性结构,从而方便对二叉树进行遍历。本文将介绍如何使用C实现线索二叉树。 技术…...
C++——vector互换容器与预留空间
一.vector互换容器 功能描述:实现两个容器内元进行互换 函数原型: swap(vec); //将vec与本身的元素互换 实例: //1.基本使用 void test01() {vector<int>v1;for (int i 0; i < 10; i){v1.push_back(i);}cout << "交换前:" << e…...
Unity 自带的一些可以操控时间的属性或方法。
今天来总结下Unity自带的一些可以操控时间的方法。 1、Time.time。比较常用计算运行时间而触发特定事件。 public class Controller : MonoBehaviour {public float eventTime 5f; // 触发事件的时间private float startTime; // 游戏开始的时间private void Start(){startT…...
vue 项目中使用 mqtt
1、在html 中用cdn方式引入 <script src"https://unpkg.com/mqtt/dist/mqtt.min.js"></script> 2、封装代码 mqtt_connect.js // import * as mqtt from mqtt/dist/mqtt.min // 不知道为什么 我用引入的方式不成,就在html 用的cdn方式接入了…...
linux shell操作 - 05 进程 与 IO 模型
文章目录 计算机内存分配进程与子进程流IO模型非阻塞IOIO多路复用网络IO模型简单的socket并发的socket 计算机内存分配 一个32位,4G内存的计算机,内存使用分为两部分: 操作系统内核空间;应用程序的用户空间使用的操作系统不同&a…...
让SOME/IP运转起来——SOME/IP系统设计(下)之数据库开发
上一篇我们介绍了SOME/IP矩阵的设计流程,这一篇重点介绍如何把SOME/IP矩阵顺利的交给下游软件团队进行开发。 车载以太网通信矩阵开发完成后,下一步应该做什么? 当我们完成SOME/IP矩阵开发,下一步需要把开发完成的矩阵换成固定格…...
Mybatis反射工厂类DefaultReflectorFactory
DefaultReflectorFactory是反射工厂接口ReflectorFactory的默认实现,其主要是实现了对反射对象Reflector的创建和缓存。 有三个方法: // 判断是否开启缓存boolean isClassCacheEnabled();// 设置是否缓存void setClassCacheEnabled(boolean classCacheEn…...
antDesignPro a-table样式二次封装
antDesignPro是跟element-ui类似的一个样式框架,其本身就是一个完整的后台系统,风格样式都很统一。我使用的是antd pro vue,版本是1.7.8。公司要求使用这个框架,但是UI又有自己的一套设计。这就导致我需要对部分组件进行一定的个性…...
找免费4K高清图片素材,就上这6个网站
使用图片素材怕侵权?那就上这6个网站,免费下载,4K高清无水印,赶紧收藏起来~ 1、菜鸟图库 https://www.sucai999.com/pic.html?vNTYxMjky 一个很大的素材库,站内主要还是以设计素材为主,像图片素材就有上百…...
代码随想录算法训练营第35天| 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
JAVA代码编写 860.柠檬水找零 在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。 每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须…...
成为AI产品经理——TPR、FPR、ROC、AUC
目录 一、PR图、BEP 1.PR图 2.BEP 二、灵敏度、特异度 1.灵敏度 2.特异度 三、真正率、假正率 1.真正率 2.假正率 三、ROC、AUC 1.ROC 2.AUC 四、KS值 一、PR图、BEP 1.PR图 二分类问题模型通常输出的是一个概率值,我们需要设定一个阈值ÿ…...
java: Internal error in the mapping processor: java.lang.NullPointerException
启动java项目出错,其他人工程没有问题,别着急。 java: Internal error in the mapping processor: java.lang.NullPointerException at org.mapstruct.ap.internal.processor.DefaultVersionInformation.createManifestUrl(DefaultVersionInformation.j…...
TCP知识点
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议,广泛应用于互联网。下面是TCP的一些知识点: TCP是一种可靠的协议,采用三次握手建立连接和四次挥手断开…...
大语言模型(LLMs)在 Amazon SageMaker 上的动手实践(一)
本期文章,我们将通过三个动手实验从浅到深地解读和演示大语言模型(LLMs),如何结合 Amazon SageMaker 的模型部署、模型编译优化、模型分布式训练等。 实验一:使用 Amazon SageMaker 构建基于开源 GPT-J 模型的对话机器…...
SparkFun SPI SerialFlash库深度解析:嵌入式Flash驱动开发指南
1. SparkFun SPI SerialFlash Arduino 库深度解析:面向嵌入式工程师的串行 Flash 驱动开发指南串行 Flash 存储器(Serial Flash)是嵌入式系统中不可或缺的非易失性数据载体,广泛应用于固件存储、配置参数保存、日志记录、OTA 升级…...
玉米脱粒机设计
传统玉米脱粒依赖人工敲打或简易工具,效率低且易损伤籽粒,遇到潮湿或成熟度不均的玉米,脱粒效果更难以保证。玉米脱粒机的出现,彻底改变了这一局面。它通过旋转的脱粒滚筒与固定筛网的配合,利用机械力将玉米粒从穗轴上…...
Nomic-Embed-Text-V2-MoE Python入门实战:用三行代码实现文本相似度计算
Nomic-Embed-Text-V2-MoE Python入门实战:用三行代码实现文本相似度计算 你是不是觉得AI大模型听起来很酷,但一想到要自己动手部署、写代码,就觉得头大?别担心,今天咱们就来点不一样的。我带你用最简单的方式…...
Qt开发避坑指南:QMediaPlayer播放RTSP流视频,从解码器安装到错误处理全流程
Qt开发实战:QMediaPlayer播放RTSP流视频的深度解决方案 RTSP流媒体播放是Qt多媒体开发中最具挑战性的场景之一。不同于本地视频文件播放,RTSP协议涉及实时传输、网络缓冲、解码器兼容性等多重技术难点。本文将带您深入解决QMediaPlayer在RTSP场景下的各…...
探索XScene-UEPlugin:如何实现高斯泼溅模型在虚幻引擎5中的高效可视化与混合渲染
探索XScene-UEPlugin:如何实现高斯泼溅模型在虚幻引擎5中的高效可视化与混合渲染 【免费下载链接】XScene-UEPlugin A Unreal Engine 5 (UE5) based plugin aiming to provide real-time visulization, management, editing, and scalable hybrid rendering of Guas…...
VideoCaptioner:开源视频字幕生成框架的技术实现与架构解析
VideoCaptioner:开源视频字幕生成框架的技术实现与架构解析 【免费下载链接】VideoCaptioner 🎬 卡卡字幕助手 | VideoCaptioner - 基于 LLM 的智能字幕助手 - 视频字幕生成、断句、校正、字幕翻译全流程处理!- A powered tool for easy and …...
系统日志分析
系统日志分析:数字世界的诊断专家 在数字化时代,系统日志如同设备的“黑匣子”,记录着每一次操作、每一处异常和每一条关键信息。无论是服务器、网络设备还是应用程序,日志文件都是排查问题、优化性能的重要依据。面对海量且复杂…...
FRCRN常见错误代码排查手册:从403 Forbidden到CUDA错误
FRCRN常见错误代码排查手册:从403 Forbidden到CUDA错误 部署和使用FRCRN进行语音降噪时,遇到各种报错是常有的事。这些错误信息往往让人一头雾水,从网络权限的“403 Forbidden”到让人头疼的CUDA问题,每一个都可能让你卡上半天。…...
DeepSeek-OCR-WEBUI助力文档数字化:批量处理图片转文字
DeepSeek-OCR-WEBUI助力文档数字化:批量处理图片转文字 1. 产品概述与核心价值 1.1 什么是DeepSeek-OCR-WEBUI DeepSeek-OCR-WEBUI是一款基于深度学习的光学字符识别工具,专门为需要将大量图片、PDF等非结构化文档转换为可编辑文本的用户设计。它通过…...
Qwen3.5-2B算法优化实战:提升LSTM时序数据预测与多模态融合效果
Qwen3.5-2B算法优化实战:提升LSTM时序数据预测与多模态融合效果 1. 引言:当LSTM遇上多模态 最近在做一个股票预测项目时遇到个有趣问题:传统LSTM模型只看K线走势数据,效果总是不太稳定。后来发现,市场情绪对股价影响…...
