自制编程语言(第三弹)定义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);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/178725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

你敢信?四行Python代码就能知道你那的天气!

今天给大家带来的Python实战项目是四行Python代码获取所在城市的天气预报&#xff0c;我们隐隐听到唏嘘声&#xff0c;不信四行Python代码可以获取是吗?那我们一起来看看&#xff1a; 四行Python代码就能知道你那的天气&#xff0c;你敢信&#xff1f; 使用Python获取天气预报…

paddleocr笔记

PP-OCRv1 PP-OCR中&#xff0c;对于一张图像&#xff0c;需要完成以下3个步骤提取其中的文字信息&#xff1a; 使用文本检测方法&#xff0c;获取文本区域多边形信息&#xff08;PP-OCR中文本检测使用的是DBNet&#xff0c;因此获取的是四点信息&#xff09;。对上述文本多边形…

sqli-labs关卡21(基于cookie被base64编码的报错盲注)通关思路

文章目录 前言一、回顾上一关知识点二、靶场需要了解的前置知识1、什么是base64编码&#xff1f; 三、靶场第二十一关通关思路1、判断注入点2、爆数据库名3、爆数据库表4、爆数据库列5、爆数据库关键信息 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于…

Toast UI Editor上传图片到Flask

Toast UI Editor国内文档几乎搜不到&#xff0c;国外文档也写得不是特别项目&#xff0c;没有太多举例的demo。一开始选择使用这个就是因为UI好看。不过看看源码把思路滤清了。 他会给把图片转成Base64&#xff0c;到时候发表单直接丢过去就行了&#xff0c;blob这个参数能拿到…

vue+elementUI的tabs与table表格联动固定与滚动位置

有个变态的需求&#xff0c;要求tabs左侧固定&#xff0c;右侧是表格&#xff0c;点击左侧tab&#xff0c;右侧表格滚动到指定位置&#xff0c;同时&#xff0c;右侧滚动的时候&#xff0c;左侧tab高亮相应的item 上图 右侧的高度非常高&#xff0c;内容非常多 常规的瞄点不适…

C++中的类与对象

类和对象的基本概念 C 和 C中 struct 区别 c 语言 struct 只有变量 c语言 struct 既有变量&#xff0c;也有函数 类的封装 我们编写程序的目的是为了解决现实中的问题&#xff0c;而这些问题的构成都是由各种事物组成&#xff0c;我们在计算机中要解决这种问题&#x…

vue3还用this吗?getCurrentInstance获取当前组件实例

在 Vue 2 中&#xff0c;this 关键字代表当前组件实例。在组件的选项对象中&#xff0c;this 可以用于访问组件实例的属性、方法以及 Vue 实例的一些特定方法。 在Vue3中&#xff0c;我们发现this是undefined&#xff0c;那我们真的没法使用this了吗&#xff1f;vu3给我们提供…

Vue3框架中让table合计居中对齐

第一步&#xff1a;给它加一个类名 center-table 如下&#xff1a; <el-table:data"datas.shows"max-height"600px"show-summarystripeborderstyle"width: 100%":header-cell-style"{ textAlign: center }":cell-style"{ text…

this.$refs,salesRankRefjj.searchRankCall is not a function

在vue项目中&#xff0c;在父组件使用$refs获取不到子组件的方法&#xff0c;为什么&#xff1f; 我的报错如下&#xff1a; [Vue wamn]: Error in v-on handler: "TypeError: this.$refs,salesRankRefjj.searchRankCall is not a function found in 代码如下&#xff1a…

单例模式 (Singleton Pattern)

定义&#xff1a; 单例模式&#xff08;Singleton Pattern&#xff09;是一种常用的软件设计模式&#xff0c;用于确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。单例模式主要用于控制对某个资源或服务的访问&#xff0c;确保整个系统中只有一个对象…

【蓝桥杯 LCA 差分】 砍树

题目分析&#xff1a; 这道题还是比较裸的一道书上差分的题目了 对于每一对标记点(x,y) 他们之间的路径就是 x − > L C A ( x , y ) − > y x->LCA(x,y)->y x−>LCA(x,y)−>y 这条路径上的每一条边都要经过。 那么对于一条边&#xff0c;什么时候砍掉这条…

Linux快捷控制

Linux快捷控制 工具安装 yum -y install lrzsz wget curl net-tools git防火墙 systemctl status firewalld.service systemctl stop firewalld.service systemctl disable firewalld.service宝塔 yum install -y wget && wget -O install.sh https://download.bt.…

C# 新数插入有序数组

题目&#xff1a; 有n(n<100)个整数&#xff0c;已经按照从⼩到⼤顺序排列好&#xff0c;现在另外给⼀个整数x&#xff0c;请将该数插⼊到序列中&#xff0c;并使新的序列仍然有序。输出新的序列。 样例输入&#xff1a;10 20 30 40 50 15 样例输出&#xff1a;1…

vue3中toRaw 与 markRaw

toRaw 返回由 reactive 或 readonly 方法转换成响应式代理的普通对象。 这是一个还原方法&#xff0c;可用于临时读取&#xff0c;访问不会被代理/跟踪&#xff0c;写入时也不会触发界面更新。 markRaw 标记一个对象&#xff0c;使其永远不会转换为代理。返回对象本身 应…

jsonp 的优缺点

JSONP&#xff0c;全名是JSON with Padding&#xff0c;是一种通过<script>标签来获取跨域数据的策略。它本质上不是一个新的技术&#xff0c;只是JavaScript的普通函数调用的一种形式&#xff0c;即利用了网页脚本的同源策略。 优点&#xff1a; 实现简单&#xff1a;…

bash编程 数组和for循环的应用

bash编程 数组和for循环的应用 1、问题背景2、bash 定义数组3、for循环遍历输出数组所有元素4、编写bash脚本输出每个端口是否在监听状态 1、问题背景 linux服务器开机后&#xff0c;需要检查一组端口是否在监听&#xff0c;以便判断这些端口对应的服务是否在运行。可以考虑使…

解释LED显示屏的裸眼3D特效原理

LED电子大屏幕的3D特效技术正在不断发展&#xff0c;而实现这一技术的原理主要包括分光、分色、分时和光栅等四种方法。这些原理都有各自的特点和应用场景&#xff0c;下面将对它们进行详细介绍。 1. 分光方法 分光方法是一种基于偏振光的3D显示技术。通过使用偏振滤镜或偏振片…

leetCode 841. 钥匙和房间 图遍历 深度优先遍历+广度优先遍历 + 图解

841. 钥匙和房间 - 力扣&#xff08;LeetCode&#xff09; 有 n 个房间&#xff0c;房间按从 0 到 n - 1 编号。最初&#xff0c;除 0 号房间外的其余所有房间都被锁住。你的目标是进入所有的房间。然而&#xff0c;你不能在没有获得钥匙的时候进入锁住的房间。当你进入一个房…

0005Java程序设计-ssm基于微信小程序的校园求职系统

文章目录 摘 要目 录系统设计开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据…

spring 自动装配 bean 有哪些方式

Spring提供了以下几种方式来实现自动装配Bean&#xff1a; 根据名称自动装配&#xff08;byName&#xff09;&#xff1a;Spring容器会根据Bean的名称自动将相应的依赖注入到需要的地方。在XML配置中&#xff0c;可以使用autowire"byName"来启用byName自动装配。 <…