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

自制编程语言(第三弹)定义Token

终于到了激动人心的实现时候了。为了实现我们的自制语言,我们需要的步骤为:

  1. 词法分析
  2. 语法分析
  3. 语义分析(此处不设置)
  4. 解释器

详细完整的代码可以点击这里查看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

终于到了激动人心的实现时候了。为了实现我们的自制语言&#xff0c;我们需要的步骤为&#xff1a; 词法分析语法分析语义分析&#xff08;此处不设置&#xff09;解释器 详细完整的代码可以点击这里查看github项目。 词法分析&#xff1a; 将代码片段识别为关键词、标识符、…...

linux下的工具---yum

一、什么是yum yum是Linux下的软件包管理器 二、什么是软件包管理器 1、在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 2、但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在…...

java全局异常处理(springboot)

介绍&#xff1a; 在日常项目开发中&#xff0c;异常是常见的&#xff0c;但是如何更高效的处理好异常信息&#xff0c;让我们能快速定位到BUG&#xff0c;是很重要的&#xff0c;不仅能够提高我们的开发效率&#xff0c;还能让你代码看上去更舒服&#xff0c;SpringBoot的项目…...

JAVA将PDF转图片

前言 当今时代&#xff0c;PDF 文件已经成为了常用的文档格式。然而&#xff0c;在某些情况下&#xff0c;我们可能需要将 PDF 文件转换为图片格式&#xff0c;以便更方便地分享和使用。这时&#xff0c;我们可以使用 Java 编程语言来实现这个功能。Java 提供了许多库和工具&a…...

合并区间[中等]

一、题目 以数组intervals表示若干个区间的集合&#xff0c;其中单个区间为intervals[i] [starti, endi]。请你合并所有重叠的区间&#xff0c;并返回一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间。 示例 1&#xff1a; 输入&#xff1a;intervals […...

MYSQL基础知识之【LIKE子句的使用 ,NULL值的处理,空值的处理】

文章目录 前言MySQL LIKE 子句在PHP脚本中使用 LIKE 子句 MySQL NULL 值处理在命令提示符中使用 NULL 值使用PHP脚本处理 NULL 值 后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Mysql &#x1f431;‍&#x1f453;博主在前端领域还有…...

线索二叉树:C++实现

引言&#xff1a; 线索二叉树是一种特殊的二叉树&#xff0c;它可以通过线索&#xff08;线索是指在二叉树中将空指针改为指向前驱或后继的指针&#xff09;的方式将二叉树转化为一个线性结构&#xff0c;从而方便对二叉树进行遍历。本文将介绍如何使用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 // 不知道为什么 我用引入的方式不成&#xff0c;就在html 用的cdn方式接入了…...

linux shell操作 - 05 进程 与 IO 模型

文章目录 计算机内存分配进程与子进程流IO模型非阻塞IOIO多路复用网络IO模型简单的socket并发的socket 计算机内存分配 一个32位&#xff0c;4G内存的计算机&#xff0c;内存使用分为两部分&#xff1a; 操作系统内核空间&#xff1b;应用程序的用户空间使用的操作系统不同&a…...

让SOME/IP运转起来——SOME/IP系统设计(下)之数据库开发

上一篇我们介绍了SOME/IP矩阵的设计流程&#xff0c;这一篇重点介绍如何把SOME/IP矩阵顺利的交给下游软件团队进行开发。 车载以太网通信矩阵开发完成后&#xff0c;下一步应该做什么&#xff1f; 当我们完成SOME/IP矩阵开发&#xff0c;下一步需要把开发完成的矩阵换成固定格…...

Mybatis反射工厂类DefaultReflectorFactory

DefaultReflectorFactory是反射工厂接口ReflectorFactory的默认实现&#xff0c;其主要是实现了对反射对象Reflector的创建和缓存。 有三个方法&#xff1a; // 判断是否开启缓存boolean isClassCacheEnabled();// 设置是否缓存void setClassCacheEnabled(boolean classCacheEn…...

antDesignPro a-table样式二次封装

antDesignPro是跟element-ui类似的一个样式框架&#xff0c;其本身就是一个完整的后台系统&#xff0c;风格样式都很统一。我使用的是antd pro vue&#xff0c;版本是1.7.8。公司要求使用这个框架&#xff0c;但是UI又有自己的一套设计。这就导致我需要对部分组件进行一定的个性…...

找免费4K高清图片素材,就上这6个网站

使用图片素材怕侵权&#xff1f;那就上这6个网站&#xff0c;免费下载&#xff0c;4K高清无水印&#xff0c;赶紧收藏起来~ 1、菜鸟图库 https://www.sucai999.com/pic.html?vNTYxMjky 一个很大的素材库&#xff0c;站内主要还是以设计素材为主&#xff0c;像图片素材就有上百…...

代码随想录算法训练营第35天| 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球

JAVA代码编写 860.柠檬水找零 在柠檬水摊上&#xff0c;每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品&#xff0c;&#xff08;按账单 bills 支付的顺序&#xff09;一次购买一杯。 每位顾客只买一杯柠檬水&#xff0c;然后向你付 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图 二分类问题模型通常输出的是一个概率值&#xff0c;我们需要设定一个阈值&#xff…...

java: Internal error in the mapping processor: java.lang.NullPointerException

启动java项目出错&#xff0c;其他人工程没有问题&#xff0c;别着急。 java: Internal error in the mapping processor: java.lang.NullPointerException at org.mapstruct.ap.internal.processor.DefaultVersionInformation.createManifestUrl(DefaultVersionInformation.j…...

TCP知识点

TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层协议&#xff0c;广泛应用于互联网。下面是TCP的一些知识点&#xff1a; TCP是一种可靠的协议&#xff0c;采用三次握手建立连接和四次挥手断开…...

大语言模型(LLMs)在 Amazon SageMaker 上的动手实践(一)

本期文章&#xff0c;我们将通过三个动手实验从浅到深地解读和演示大语言模型&#xff08;LLMs&#xff09;&#xff0c;如何结合 Amazon SageMaker 的模型部署、模型编译优化、模型分布式训练等。 实验一&#xff1a;使用 Amazon SageMaker 构建基于开源 GPT-J 模型的对话机器…...

SparkFun SPI SerialFlash库深度解析:嵌入式Flash驱动开发指南

1. SparkFun SPI SerialFlash Arduino 库深度解析&#xff1a;面向嵌入式工程师的串行 Flash 驱动开发指南串行 Flash 存储器&#xff08;Serial Flash&#xff09;是嵌入式系统中不可或缺的非易失性数据载体&#xff0c;广泛应用于固件存储、配置参数保存、日志记录、OTA 升级…...

玉米脱粒机设计

传统玉米脱粒依赖人工敲打或简易工具&#xff0c;效率低且易损伤籽粒&#xff0c;遇到潮湿或成熟度不均的玉米&#xff0c;脱粒效果更难以保证。玉米脱粒机的出现&#xff0c;彻底改变了这一局面。它通过旋转的脱粒滚筒与固定筛网的配合&#xff0c;利用机械力将玉米粒从穗轴上…...

Nomic-Embed-Text-V2-MoE Python入门实战:用三行代码实现文本相似度计算

Nomic-Embed-Text-V2-MoE Python入门实战&#xff1a;用三行代码实现文本相似度计算 你是不是觉得AI大模型听起来很酷&#xff0c;但一想到要自己动手部署、写代码&#xff0c;就觉得头大&#xff1f;别担心&#xff0c;今天咱们就来点不一样的。我带你用最简单的方式&#xf…...

Qt开发避坑指南:QMediaPlayer播放RTSP流视频,从解码器安装到错误处理全流程

Qt开发实战&#xff1a;QMediaPlayer播放RTSP流视频的深度解决方案 RTSP流媒体播放是Qt多媒体开发中最具挑战性的场景之一。不同于本地视频文件播放&#xff0c;RTSP协议涉及实时传输、网络缓冲、解码器兼容性等多重技术难点。本文将带您深入解决QMediaPlayer在RTSP场景下的各…...

探索XScene-UEPlugin:如何实现高斯泼溅模型在虚幻引擎5中的高效可视化与混合渲染

探索XScene-UEPlugin&#xff1a;如何实现高斯泼溅模型在虚幻引擎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&#xff1a;开源视频字幕生成框架的技术实现与架构解析 【免费下载链接】VideoCaptioner &#x1f3ac; 卡卡字幕助手 | VideoCaptioner - 基于 LLM 的智能字幕助手 - 视频字幕生成、断句、校正、字幕翻译全流程处理&#xff01;- A powered tool for easy and …...

系统日志分析

系统日志分析&#xff1a;数字世界的诊断专家 在数字化时代&#xff0c;系统日志如同设备的“黑匣子”&#xff0c;记录着每一次操作、每一处异常和每一条关键信息。无论是服务器、网络设备还是应用程序&#xff0c;日志文件都是排查问题、优化性能的重要依据。面对海量且复杂…...

FRCRN常见错误代码排查手册:从403 Forbidden到CUDA错误

FRCRN常见错误代码排查手册&#xff1a;从403 Forbidden到CUDA错误 部署和使用FRCRN进行语音降噪时&#xff0c;遇到各种报错是常有的事。这些错误信息往往让人一头雾水&#xff0c;从网络权限的“403 Forbidden”到让人头疼的CUDA问题&#xff0c;每一个都可能让你卡上半天。…...

DeepSeek-OCR-WEBUI助力文档数字化:批量处理图片转文字

DeepSeek-OCR-WEBUI助力文档数字化&#xff1a;批量处理图片转文字 1. 产品概述与核心价值 1.1 什么是DeepSeek-OCR-WEBUI DeepSeek-OCR-WEBUI是一款基于深度学习的光学字符识别工具&#xff0c;专门为需要将大量图片、PDF等非结构化文档转换为可编辑文本的用户设计。它通过…...

Qwen3.5-2B算法优化实战:提升LSTM时序数据预测与多模态融合效果

Qwen3.5-2B算法优化实战&#xff1a;提升LSTM时序数据预测与多模态融合效果 1. 引言&#xff1a;当LSTM遇上多模态 最近在做一个股票预测项目时遇到个有趣问题&#xff1a;传统LSTM模型只看K线走势数据&#xff0c;效果总是不太稳定。后来发现&#xff0c;市场情绪对股价影响…...