Java使用ANTLR4解析IDL文件
文章目录
- 前言
- 解析IDL文件
- 准备两个IDL文件
- 准备一个IDL Grammar文件
- maven配置
- 生成Lexer Parser Listener Visitor代码
- 新建实体类
- IDL解析遍历器
- 单元测试
- 参考
前言
接着上篇:Java使用ANTLR4对Lua脚本语法校验,介绍了什么是ANTLR?/ 举了一个hello world示例 / ANTLR4 的工作流程。
解析IDL文件
准备两个IDL文件
V1.idl
为架构的第一版约定文件
#ifndef xxx
#define xxxmodule aaa {module bbb {module ccc {struct ddd {unsigned short xxx1;unsigned long long xxx2;octet xxx3;};}; // module ccc}; // module bbb}; // module aaa#endif
V2.idl
为架构的第二版约定文件
#ifndef xxx
#define xxxconst short aaa = 1;
module bbb {struct ccc {@default(0) uint8 xxx;};};module bbb {struct ddd {@default(255) uint8 xxx;};};
#endif
准备一个IDL Grammar文件
https://github.com/antlr/grammars-v4/tree/master/idl
maven配置
使用JDK8的注意:antlr4最高版本为4.9.3
,原因如下:
来源:https://github.com/antlr/antlr4/releases/tag/4.10
Increasing minimum java version
Going forward, we are using Java 11 for the source code and the compiled .class files for the ANTLR tool. The Java runtime target, however, and the associated runtime tests use Java 8 (bumping up from Java 7).
<dependencies><dependency><groupId>org.antlr</groupId><artifactId>antlr4-runtime</artifactId><version>${antlr.version}</version></dependency>
</dependencies><build><plugins><plugin><groupId>org.antlr</groupId><artifactId>antlr4-maven-plugin</artifactId><version>${antlr.version}</version><configuration><visitor>true</visitor><listener>true</listener></configuration><executions><execution><goals><goal>antlr4</goal></goals></execution></executions></plugin></plugins>
</build><properties><!-- https://mvnrepository.com/artifact/org.antlr/antlr4-runtime --><!-- Antlr4 4.9.3 is the last version compatible with Java 8 --><antlr.version>4.9.3</antlr.version>
</properties>
生成Lexer Parser Listener Visitor代码
mvn clean compile
新建实体类
不知道咋出来这个界面的,看Java使用ANTLR4对Lua脚本语法校验 > 第一个例子
由上图,不难看出对象间对应关系:Specification对应多个Definition(Module/TypeDeclaration),TypeDeclaration对应多个Member。
package com.baeldung.antlr.idl;import java.util.ArrayList;
import java.util.List;/*** 规范** @author duhongming* @see* @since 1.0.0*/
public class Specification {private List<Definition> definitions;public Specification() {definitions = new ArrayList<>();}public void setDefinitions(List<Definition> children) {definitions = children;}public List<Definition> getDefinitions() {return definitions;}public void addChild(Definition child) {definitions.add(child);}
}
package com.baeldung.antlr.idl;/*** 定义** @author duhongming* @see* @since 1.0.0*/
public interface Definition {enum Kind {MODULE,INTERFACE,EXCEPTION,TYPE_DECLARATION,CONST_DECLARATION,ANNOTATION}boolean isIsModule();boolean isIsInterface();boolean isIsException();boolean isIsTypeDeclaration();boolean isIsConstDeclaration();boolean isIsAnnotation();
}
package com.baeldung.antlr.idl;/*** 模块** @author duhongming* @see* @since 1.0.0*/
public class Module implements Definition {private String name;private Definition child;public String getName() {return name;}public void setName(String name) {this.name = name;}public Definition getChild() {return child;}public void setChild(Definition child) {this.child = child;}@Overridepublic boolean isIsModule() {return true;}@Overridepublic boolean isIsInterface() {return false;}@Overridepublic boolean isIsException() {return false;}@Overridepublic boolean isIsTypeDeclaration() {return false;}@Overridepublic boolean isIsConstDeclaration() {return false;}@Overridepublic boolean isIsAnnotation() {return false;}
}
package com.baeldung.antlr.idl;import java.util.List;/*** 类型声明** @author duhongming* @see* @since 1.0.0*/
public class TypeDeclaration implements Definition {private String name;private List<Member> members;public String getName() {return name;}public void setName(String name) {this.name = name;}public List<Member> getMembers() {return members;}public void setMembers(List<Member> members) {this.members = members;}@Overridepublic boolean isIsModule() {return false;}@Overridepublic boolean isIsException() {return false;}@Overridepublic boolean isIsInterface() {return false;}@Overridepublic boolean isIsTypeDeclaration() {return true;}@Overridepublic boolean isIsConstDeclaration() {return false;}@Overridepublic boolean isIsAnnotation() {return false;}
}
package com.baeldung.antlr.idl;/*** 成员变量或方法** @author duhongming* @see* @since 1.0.0*/
public class Member {private String name;private String typeCode;public Member(String typeCode, String name) {super();this.typeCode = typeCode;this.name = name;}public String getName() {return name;}public void setName(String m_name) {this.name = m_name;}public String getTypeCode() {return typeCode;}public void setTypeCode(String typeCode) {this.typeCode = typeCode;}
}
IDL解析遍历器
package com.baeldung.antlr.idl;import com.baeldung.antlr.IDLBaseVisitor;
import com.baeldung.antlr.IDLParser;
import org.antlr.v4.runtime.tree.ParseTree;import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;public class IDLVisitor extends IDLBaseVisitor {@Overridepublic TypeDeclaration visitType_decl(IDLParser.Type_declContext ctx) {TypeDeclaration typeDeclaration = new TypeDeclaration();Optional<String> optional = Optional.ofNullable(ctx).map(IDLParser.Type_declContext::struct_type).map(IDLParser.Struct_typeContext::identifier).map(IDLParser.IdentifierContext::ID).map(ParseTree::getText);if (!optional.isPresent()) {return null;}typeDeclaration.setName(optional.get());List<IDLParser.MemberContext> members = ctx.struct_type().member_list().member();List<Member> memberList = new ArrayList<>();for (IDLParser.MemberContext member : members) {String type = member.type_spec().getText();String name = member.declarators().getText();Member m = new Member(type.replace("unsigned", ""), name);memberList.add(m);}typeDeclaration.setMembers(memberList);return typeDeclaration;}@Overridepublic Module visitModule(IDLParser.ModuleContext ctx) {Optional<String> optional = Optional.ofNullable(ctx).map(IDLParser.ModuleContext::identifier).map(IDLParser.IdentifierContext::ID).map(ParseTree::getText);if (!optional.isPresent()) {return null;}Module module = new Module();String moduleName = optional.get();module.setName(moduleName);List<IDLParser.DefinitionContext> definitions = ctx.definition();for (IDLParser.DefinitionContext definition : definitions) {Module subModule = visitModule(definition.module());if (Objects.nonNull(subModule)) {module.setChild(subModule);}TypeDeclaration typeDeclaration = visitType_decl(definition.type_decl());if (Objects.nonNull(typeDeclaration)) {module.setChild(typeDeclaration);}}return module;}@Overridepublic Specification visitSpecification(IDLParser.SpecificationContext ctx) {Specification specification = new Specification();if (ctx != null) {for (IDLParser.DefinitionContext definition : ctx.definition()) {Module module = visitModule(definition.module());if (Objects.nonNull(module)) {specification.addChild(module);}}}return specification;}
}
单元测试
package com.baeldung.antlr;import com.baeldung.antlr.idl.IDLVisitor;
import com.baeldung.antlr.idl.Specification;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.Lexer;
import org.antlr.v4.runtime.tree.ParseTree;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;public class IDLParserUnitTest {public static Specification parseIdl(InputStream inputStream) throws IOException {return parseIdl(CharStreams.fromStream(inputStream));}public static Specification parseIdl(CharStream charStream) {// 用 in 构造词法分析器 lexer,词法分析的作用是将字符聚集成单词或者符号Lexer lexer = new IDLLexer(charStream);// 用词法分析器 lexer 构造一个记号流 tokensCommonTokenStream tokens = new CommonTokenStream(lexer);// 再使用 tokens 构造语法分析器 parser,至此已经完成词法分析和语法分析的准备工作IDLParser parser = new IDLParser(tokens);ParseTree tree = parser.specification();IDLVisitor visitor = new IDLVisitor();return (Specification) visitor.visit(tree);}@Testpublic void testV1() throws IOException {InputStream inputStream = Files.newInputStream(Paths.get("src/test/resources/V1.idl"));Specification specification = parseIdl(inputStream);System.out.println(specification);}@Testpublic void testV2() throws IOException {InputStream inputStream = Files.newInputStream(Paths.get("src/test/resources/V2.idl"));Specification specification = parseIdl(inputStream);System.out.println(specification);}
}
最终目录情况及单元测试情况如下:
参考
https://github.com/eProsima/IDL-Parser
相关文章:
Java使用ANTLR4解析IDL文件
文章目录 前言解析IDL文件准备两个IDL文件准备一个IDL Grammar文件maven配置生成Lexer Parser Listener Visitor代码新建实体类IDL解析遍历器单元测试 参考 前言 接着上篇:Java使用ANTLR4对Lua脚本语法校验,介绍了什么是ANTLR?/ 举了一个hel…...
04-Seata 深度解析:从分布式事务原理到 Seata 实战落地
Seata 深度解析:从分布式事务原理到 Seata 实战落地 一、分布式事务核心理论与挑战 1.1 分布式事务的本质难题 在微服务架构中,一次业务操作可能涉及多个服务的数据库操作,传统单体事务(ACID)无法跨越服务边界&…...
2025企业增长新引擎:AI Agent驱动人效跃迁|白皮书2.0发布
2025年伊始,一款名为DeepSeek-R1的国产AI大模型以其高性能、低成本等核心优势成功霸榜热搜,在全国乃至全球掀起一场以AI为核心的技术革新与管理变革。 面对这样极具颠覆性的革新命题,易路人力资源科技王天扬先生自2022年起就率团队持续专注于…...
IJCV-2025 | 深圳大学记忆增强的具身导航!ESceme:基于情景记忆的视觉语言导航
作者:Qi Zheng 1 , 2 ^{1,2} 1,2, Daqing Liu 3 ^{3} 3, Chaoyue Wang 3 ^{3} 3, Jing Zhang 2 ^{2} 2, Dadong Wang 4 ^{4} 4, Dacheng Tao 2 ^{2} 2单位: 1 ^{1} 1深圳大学电子与信息工程学院, 2 ^{2} 2悉尼大学计算机科学学院,…...
[第十六届蓝桥杯 JavaB 组] 真题 + 经验分享
A:逃离高塔(AC) 这题就是简单的签到题,按照题意枚举即可。需要注意的是不要忘记用long,用int的话会爆。 📖 代码示例: import java.io.*; import java.util.*; public class Main {public static PrintWriter pr ne…...
《分布式软总线:网络抖动下的数据传输“定海神针”》
在当下,智能设备之间的互联互通已成为生活与工作的刚需。分布式软总线作为实现这一愿景的关键技术,正日益凸显其重要性。然而,网络环境的复杂性,尤其是网络抖动频繁的情况,给分布式软总线的数据传输带来了严峻挑战。如…...
C++函数
函数 为什么要使用函数 已经有main函数,为什么还要自定义函数?:“避免重复制造轮子”,提高开发效率 函数的定义 函数的设计方法:先确定函数的功能、确定函数的参数、是否需要参数,参数的个数,…...
FreeRTOS菜鸟入门(五)·空闲任务与阻塞延时的实现
目录 1. 实现空闲任务 1.1 定义空闲任务的栈 1.2 定义空闲任务的任务控制块 1.3 创建空闲任务 2. 实现阻塞延时 2.1 vTaskDelay()函数 2.2 修改 vTaskSwitchContext()函数 3. SysTick 中断服务函数 4. SysTick 初始化函数 通过之前我们了解知道,任…...
PCIe 学习笔记(一)
系列文章目录 【PCIe】链路测试,数字工程师也要会看高速信号眼图! 【PCIe】链路训练状态机(LTSSM) - PCIe链路建立过程概述 【PCIe】PCIe设备的BDF与系统枚举过程 文章目录 系列文章目录PCIe LTSSM**1. 链路训练状态(Training States&#…...
【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——LED、按键测试
1)实验平台:正点原子ATK-DLMP257B开发板 2)浏览产品:https://www.alientek.com/Product_Details/135.html 3)全套实验源码手册视频下载:正点原子资料下载中心 文章目录 第四章 ATK-DLMP257B功能测试4.1 LED…...
深度为16,位宽8bit的单端口SRAM——学习记录
链接: 【Verilog HDL 训练】第 13 天(存储器、SRAM)-云社区-华为云 module sram #(parameter ADDR_BITS4)(input clk,input [ 7:0] addr,input [ 7:0] din,input ce,input we,output reg [ 7:0] dout);localparam MEM_DEPTH 1<<ADDR_…...
面向对象编程
在面向对象编程中,除了通过创建类的实例来访问其属性和方法外,还可以通过在一个类里创建另一个类的属性(本质上也是持有另一个类的实例引用)的方式来访问该类的属性和方法。下面为你详细解释这两种方式: 1. 通过创建实…...
远程登录一个Linux系统,如何用命令快速知道该系统属于Linux的哪个发行版,以及该服务器的各种配置参数,运行状态?
远程登录一个Linux系统,如何用命令快速知道该系统属于Linux的哪个发行版,以及该服务器的各种配置参数,运行状态? 查看Linux发行版信息 查看发行版名称和版本: cat /etc/*-release或 lsb_release -a查看内核版本&#…...
简单socket通信,回显 服务器程序与客户端程序之间的通信。
Socket 通信编程是一种基于网络的通信方式,允许不同主机上的程序通过网络进行数据交换。 实现结构try catch: 前情了解: 1.如何创建服务器端 定义ServerSocket套接字,需要等待客户端连接,阻塞,直到接入连接…...
C# 基类型和派生类型之间的转型
1.什么是基类型和派生类 基类型:父类,所有子类都继承自它。 派生类型:子类,继承了父类的属性和方法,还可以添加自己的新功能。 例子: class Animal { }//基类型 class Dog : Animal { }//派生类型 这…...
深度学习--激活函数
激活函数通过计算加权和并加上偏置来确定神经元是否应该倍激活,它们将输入信号转换为输出的可微运算。大多数激活函数都是非线性的,由于激活函数是深度学习的基础,下面简要介绍一些常见的激活函数。 1 RelU函数 最受欢迎的激活函数是修正线性…...
MySQL 缓存机制全解析:从磁盘 I/O 到性能优化
MySQL 缓存机制全解析:从磁盘 I/O 到性能优化 MySQL 的缓存机制是提升数据库性能的关键部分,它通过多级缓存减少磁盘 I/O 和计算开销,从而提高查询和写入的效率。 1. 为什么需要缓存? 数据库的性能瓶颈通常集中在磁盘 I/O 上。…...
【项目管理】第17章 项目干系人管理-- 知识点整理
项目管理-相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 项目管理知识域 知识点: (项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域) 对应:第6章-第19章 第6章 项目管理概论 4分第13章 项目资源管理 3-4分第7章 项目…...
编程语言到mysql ‘\‘到数量关系
在 MySQL 的模糊查询中,反斜杠 \ 的转义规则需要根据 转义层级 和 SQL 模式 来确定。以下是详细说明及示例: 一、默认模式下(未启用 NO_BACKSLASH_ESCAPES) 1. 规则说明 反斜杠转义:\ 是 MySQL 的默认转义字符。 转义…...
本地生活服务平台搭建方案详解:同城跑腿外卖系统源码一体化开发
在数字化浪潮不断推进的今天,本地生活服务平台正逐渐成为人们日常生活中不可或缺的一部分。从点餐外卖到同城帮买、帮送、帮取,用户对即时服务的需求愈发强烈。与此同时,创业者和本地商家也纷纷看好“同城服务 外卖配送”的一体化平台模式&a…...
索引语法SQL性能分析索引的使用
目录 准备: 一.索引语法 1). 创建索引 2). 查看索引 3). 删除索引 4).使用索引查询和普通查询的区别 二.SQL性能分析 1.SQL执行频率 2.慢查询日志 3.profile详情 4.explain 三.索引的使用 1.最左前缀法则 2.范围查询 3.索引失效情况 索引列运算 字符串不加引号…...
Docker技术基础新手入门教程
Docker技术深度解析:从架构到实战的运维指南 一、Docker核心架构与组件详解1. 什么是Docker?1. Docker引擎(Docker Engine)2. Docker对象模型二、关键技术深度剖析1. 容器隔离机制2. 容器网络模型网络驱动类型自定义网络实战3. 存储卷与数据持久化三种挂载方式对比示例:My…...
NO.93十六届蓝桥杯备战|图论基础-拓扑排序|有向无环图|AOV网|摄像头|最大食物链计数|杂物(C++)
有向⽆环图 若⼀个有向图中不存在回路,则称为有向⽆环图(directed acycline graph),简称 DAG 图 AOV⽹ 举⼀个现实中的例⼦:课程的学习是有优先次序的,如果规划不当会严重影响学习效果。课程间的先后次序可以⽤有向图表⽰ 在…...
Rust泛型与特性
文章目录 泛型函数中的泛型结构体与枚举中的泛型特性(trait)默认特性Trait作为参数特性做返回值 给结构体实现方法 泛型 泛型编程是现代编程语言中重要的机制 C是通过模板来实现泛型的,而C语言中是没有泛型的 泛型是用来表达抽象类型的机制…...
Day08【基于预训练模型分词器实现交互型文本匹配】
基于预训练模型分词器实现交互型文本匹配 目标数据准备参数配置数据处理模型构建主程序测试与评估总结 目标 本文基于预训练模型bert分词器BertTokenizer,将输入的文本以文本对的形式,送入到分词器中得到文本对的词嵌入向量,之后经过若干网络…...
基于uniapp 实现画板签字
直接上效果图 代码 <template><view class"container"><!-- 签名画布 --><view class"canvas-container"><canvas canvas-id"signCanvas" class"sign-canvas"touchstart"handleTouchStart"touc…...
5.跳表(skiplist)
1. 什么是跳表 -skiplist skiplist 本质上也是一种查找结构,用于解决算法中的查找问题,跟平衡搜索树和哈希表的价值是一样的,可以作为key 或者 key/value 的查找模型。 skiplist ,顾名思义,首先它是一个 list 。实际上…...
GitHub 封禁中国 IP:影响、原因及应对
在技术全球化的当下,代码托管平台如同开发者的 “数字仓库”,而 GitHub 无疑是其中最广为人知的一座。但在 2025 年 4 月 13 日,一则令人震惊的消息在国内开发者社群中炸开了锅 ——GitHub 疑似封禁中国 IP。一时间,这一事件迅速成…...
基于工业操作系统构建企业数字化生态的实践指南
一、工业操作系统选型策略 工业操作系统(IIoT OS)的选型需从功能适配性、技术成熟度、生态兼容性三个维度综合评估。以玉麟科技DIOS平台为例,其 "云端 终端" 架构支持全球设备管理,通过工业知识模型实现设备健康度预测…...
金能电力领跑京东工业安全工器具赛道 2025年首季度数据诠释“头部效应”
金能电力领跑京东工业安全工器具赛道 2025年首季度数据诠释“头部效应” 在2025年第一季度京东工业平台“电料辅件-安全工器具”热销品牌的激烈竞争中,金能电力以一组极具说服力的数据,向行业展示了何为“绝对头部”。从成交金额、销量到流量、客群覆…...
基于大模型的反流食管炎手术全流程风险预测与治疗方案研究报告
目录 一、引言 1.1 研究背景 1.2 研究目的 1.3 研究方法与创新点 二、反流食管炎概述 2.1 定义与发病机制 2.2 临床症状与诊断标准 2.3 流行病学现状 三、大模型技术原理与应用现状 3.1 大模型基本原理 3.2 在医疗领域的应用案例 3.3 用于反流食管炎预测的优势 四…...
探索 C 与 Java/Kotlin 的语言差异:从指针到高阶函数
作为一名熟悉 Java 和 Kotlin 的开发者,初次接触 C/C 时常会遇到一系列概念上的“文化冲击”。本文将从几个关键点出发,帮助你更好地理解 C/C 与 Java/Kotlin 在语言设计上的核心区别。 1. 指向未知类型的指针 void*、结构体指针访问 ->、空指针常量 …...
Redis之缓存过期淘汰策略
面试切入点 Redis内存满了怎么办? redis的默认内存多少?在哪里查看?如何设置修改? 查看redis最大占用内存 打开redis配置文件,设置maxmemory参数,maxmemory是bytes字节类型,注意转换。 redi…...
Rust-引用借用规则
目录 一、概述 二、借用规则 三、详细解释 3.1 第一条规则 3.2 第二条规则 3.3 第三条规则 四、总结 Welcome to Code Blocks blog 本篇文章主要介绍了 [Rust-引用借用规则] ❤博主广交技术好友,喜欢文章的可以关注一下❤ 一、概述 Rust为确保程序在运行时不…...
【报错】解决pytorch出现RuntimeError: An attempt has been made to start a new process...
此错误是由于在 Windows 系统中使用多进程时,没有正确使用 if __name__ __main__: 语句块造成的。在 Windows 里,多进程的启动方式是 spawn,并非 fork,所以必须在主模块中使用 if __name__ __main__: 语句块来避免子进程重复执行…...
游戏引擎学习第228天
对上次的内容进行回顾,并为今天的开发环节做铺垫。 目前大部分功能我们已经完成了,唯一剩下的是一个我们知道存在但目前不会实际触发的 bug。这个 bug 的本质是在某些线程仍然访问一个已经被销毁的游戏模式(mode)之后的状态&…...
Pytorch Hook 技巧
通过 functools.partial 扩展 Pytorch Hook 机制 阅读 atom 文章源码时学习到的技巧,mark一下 通过 functools.partial,开发者无需修改原始函数或 PyTorch 的 Hook 机制,即可实现参数扩展与接口适配,这是 Python 函数式编…...
Python multiprocessing模块介绍
multiprocessing 是 Python 标准库中的一个模块,用于实现多进程并行计算,可以在多核 CPU 上显著提升程序性能,尤其适用于 CPU 密集型任务。Python 的多线程由于 GIL(全局解释器锁)限制,在进行 CPU 密集型任…...
[特殊字符] LoRA微调大模型实践:从MAC到Web的全流程指南
🚀 实践步骤概览 今天我们要在MAC上完成一个完整的AI项目闭环: 微调一个大模型 → 2. 导出模型并部署 → 3. 暴露API给web后端 → 4. 前端展示 🛠️ 微调模型准备 核心配置 框架:LLama-Factory 🏭 算法:…...
第二天 通过脚本控制物体移动和旋转
一、Unity脚本编程基础认知 1.1 为什么说脚本是Unity的灵魂? Unity引擎的核心架构采用ECS(Entity-Component-System)模式,脚本作为组件的具体实现,控制着游戏对象的所有行为。统计显示,一个中等规模的Uni…...
在SpringBoot中访问 static 与 templates 目录下的内容
目录 步骤一:添加 Thymeleaf 依赖 (处理 Templates 目录)步骤二:配置静态资源路径 (可选但建议了解)步骤三:访问不同目录下的 HTML 文件访问 static 目录下的 HTML 文件访问 templates 目录下的 HTML 文件 总结 在使用 Spring Boot 开发 Web …...
常见的 API 设计风格
在软件开发中,常见的 API 设计风格主要有以下几种,每种风格适用于不同的场景和需求: 1. RESTful API (主流) 特点: 基于 HTTP 协议,使用标准方法(GET/POST/PUT/DELETE)资源导向(UR…...
Grass.io项目现状:DePIN亮眼明星,扩张中的AI数据银行
Grass.io项目现状:DePIN亮眼明星,扩张中的AI数据银行 Grass如何在DePIN项目丛林中脱颖而出? 答案在于其"零门槛"策略——用户是基石,其他一切皆为杠杆。 Grass通过"技术+模式"双轮驱动打破行业内卷:零知识证明技术与Solana Layer2架构确保数据真实…...
ERR_PNPM_DLX_NO_BIN No binaries found in tailwindcss
场景复现: 最近在vue3项目中安装了tailwindcss,但是它默认帮我安装的版本是4XX的,导致我执行 npx tailwindcss init -p报错了。 解决方案: 更改tailwindcss的版本为3 pnpm add -D tailwindcss3再次执行生成tailwindcss的初始…...
2025“钉耙编程”中国大学生算法设计春季联赛(6)(1001,1003,1008):1007
不知道为啥,感觉后面的联赛题目有挺多出的是模拟题目(这三道题目难度依次递增) 1001 #include<bits/stdc.h> using namespace std; #define int long long const int op1e97; const int o1e34;inline void solve(){int n,a,b,c;cin>…...
Leetcode 2814. 避免淹死并到达目的地的最短时间
1.题目基本信息 1.1.题目描述 现给定一个 n * m 的索引从 0 开始的二维字符串网格 land,目前你站在为 “S” 的单元格上,你需要到达为 “D” 的单元格。在这片区域上还有另外三种类型的单元格: “.”:这些单元格是空的。 “X”…...
4.15【A】pc homework3~
5 假设read_document函数可以实现读取第m个文件,并返回该文本文档的每行数据 那么考虑双层并行结构,外层为文档级并行,内层为每个文档内的行级并行 动态分配文档任务,避免线程闲置 #include <omp.h> int total_words …...
aslist和list的区别
Arrays.asList和List的主要区别在于它们的固定长度和不可变性、与原始数组的关系、性能以及使用场景。 一、固定长度和不可变性 Arrays.asList:通过Arrays.asList方法创建的List是一个固定长度的List,其长度与原始数组相同。这意味着你不能通过添…...
Notepad++中将文档格式从Windows(CR LF)转换为Unix(LF)
在Windows中用记事本写了一个.sh的Linux运行脚本,是无法直接在Linux中执行,需要首先把文本编码格式转换为Unix的,特别是换行符这些,转换步骤如下: 1、打开文档 在Notepad中打开需要转换的文件。 2、进入文档格式转换…...
控制理论与应用Latex模版/中文Latex
报错1 ! Package CJK Error: Invalid character code. 解决方法: 用记事本打开tex文件 另存为,选择utf-8格式 ! paragraph ended before \mulearg was complete. 备注,控制理论与应用有个自己的模版内容,是通过导入方式调用…...