使用ANTLR4解析Yaml,JSON和Latex
文章目录
- ANTLR4基本使用
- **1. 安装 Java 运行时(必需)**
- **2. 安装 ANTLR4 命令行工具**
- **方法一:通过包管理器(推荐)**
- **macOS/Linux (Homebrew)**
- **Windows (Chocolatey)**
- **方法二:手动安装(通用)**
- **3. 验证安装**
- **4. 配置环境变量(可选)**
- **macOS/Linux**
- **Windows**
- **5. 使用示例**
- **(1) 生成解析器**
- **(2) 测试语法树**
- **6. 开发工具集成**
- **Visual Studio Code**
- **IntelliJ IDEA**
- **常见问题解决**
- YAML
- 1. YAML 语法文件 (`YAML.g4`)
- 2. 语法说明
- 3. 生成解析器
- 4. 解析树可视化
- 5. 支持的 YAML 特性
- 6. 扩展建议
- 7. 完整解析流程
- JSON
- 1. JSON 语法文件 (`JSON.g4`)
- 2. 语法说明
- 3. 生成解析器
- 4. 解析树可视化
- 5. 支持的 JSON 特性
- 6. 扩展建议
- 7. 性能优化
- Latex
- 1. LaTeX 语法文件 (`LaTeX.g4`)
- 2. 语法树结构说明
- 3. 解析示例
- 输入 LaTeX 文件 (`example.tex`):
- Java 解析代码:
- 生成的解析树结构:
- 4. 关键特性支持
- 5. 扩展建议
- 6. 典型应用场景
最近接触到数学公式的解析,然后和ANTLR4进行了一场遭遇战。
以下是使用 ANTLR4 解析 YAML 文件的完整语法文件 (YAML.g4) 和解析示例:
ANTLR4基本使用
以下是安装 ANTLR4 命令行工具的详细步骤,适用于主流操作系统:
1. 安装 Java 运行时(必需)
ANTLR4 是基于 Java 的工具,需先安装 Java 11+:
# 检查是否已安装 Java
java -version
- 如果未安装,从 Oracle JDK 或 OpenJDK 下载。
2. 安装 ANTLR4 命令行工具
方法一:通过包管理器(推荐)
macOS/Linux (Homebrew)
brew install antlr
Windows (Chocolatey)
choco install antlr4
方法二:手动安装(通用)
-
下载最新版 ANTLR4 JAR 文件:
curl -O https://www.antlr.org/download/antlr-4.12.0-complete.jar替换
4.12.0为官网最新版本号。 -
将 JAR 文件移动到固定目录(如
~/lib/antlr):mkdir -p ~/lib/antlr mv antlr-4.12.0-complete.jar ~/lib/antlr/ -
添加别名到 Shell 配置文件(
.bashrc/.zshrc/.bash_profile):# ANTLR4 别名 alias antlr4='java -jar ~/lib/antlr/antlr-4.12.0-complete.jar' alias grun='java org.antlr.v4.gui.TestRig'然后执行:
source ~/.bashrc # 或对应配置文件
3. 验证安装
antlr4
如果看到以下输出,表示安装成功:
ANTLR Parser Generator Version 4.12.0
...
4. 配置环境变量(可选)
若不想用别名,可将 ANTLR4 加入 PATH:
macOS/Linux
export CLASSPATH=".:~/lib/antlr/antlr-4.12.0-complete.jar:$CLASSPATH"
export PATH="$PATH:~/lib/antlr"
Windows
- 右键“此电脑” → 属性 → 高级系统设置 → 环境变量
- 在
PATH中添加 ANTLR4 JAR 所在目录 - 新建
CLASSPATH变量,值为.;C:\path\to\antlr-4.12.0-complete.jar
5. 使用示例
(1) 生成解析器
antlr4 YourGrammar.g4 # 生成词法/语法分析器
javac *.java # 编译生成的 Java 文件
(2) 测试语法树
grun YourGrammar ruleName -gui # 可视化解析树
输入文本后按 Ctrl+D (macOS/Linux) 或 Ctrl+Z (Windows) 结束输入。
6. 开发工具集成
Visual Studio Code
- 安装扩展:
- ANTLR4 Grammar Syntax Support
- 右键
.g4文件 → “Generate ANTLR Code”
IntelliJ IDEA
- 安装插件:
- ANTLR v4 grammar plugin (内置)
- 右键
.g4文件 → “Generate ANTLR Recognizer”
常见问题解决
-
antlr4: command not found
检查别名或环境变量配置是否正确。 -
Java 版本不兼容
确保使用 Java 11+:java -version -
无法生成代码
检查语法文件是否有错误,或尝试手动指定输出目录:antlr4 -o ./output YourGrammar.g4
通过以上步骤,您可以在任何主流操作系统上安装并运行 ANTLR4 命令行工具。如需更高级的功能(如自定义 Visitor/Listener),可参考 ANTLR4 官方文档。
YAML
1. YAML 语法文件 (YAML.g4)
grammar YAML;// 语法规则
document: blockMapping?;blockMapping: blockPair+;blockPair: key ':' value;key: SCALAR;value: SCALAR| blockMapping| blockSequence;blockSequence: '-' value ('\n' '-' value)*;// 词法规则
SCALAR: UNQUOTED_SCALAR| SINGLE_QUOTED_SCALAR| DOUBLE_QUOTED_SCALAR;UNQUOTED_SCALAR: [a-zA-Z0-9_\-\.]+;SINGLE_QUOTED_SCALAR: '\'' (~['\n] | '\'\'')* '\'';DOUBLE_QUOTED_SCALAR: '"' (~["\n] | '\\"')* '"';COMMENT: '#' ~[\n]* -> skip;WS: [ \t\r\n]+ -> skip;// 特殊字符处理
COLON : ':' ;
DASH : '-' ;
2. 语法说明
-
文档结构:
- 一个 YAML 文档由可选的
blockMapping组成 blockMapping包含多个键值对 (blockPair)
- 一个 YAML 文档由可选的
-
键值对:
- 键 (
key) 必须是标量 (SCALAR) - 值 (
value) 可以是:- 标量
- 嵌套的映射 (
blockMapping) - 序列 (
blockSequence)
- 键 (
-
序列:
- 以
-开头 - 可以包含多行
- 以
-
标量类型:
- 未加引号的 (
UNQUOTED_SCALAR):字母数字、下划线、连字符、点 - 单引号 (
SINGLE_QUOTED_SCALAR):支持单引号转义 ('') - 双引号 (
DOUBLE_QUOTED_SCALAR):支持反斜杠转义 (\")
- 未加引号的 (
-
忽略:
- 注释 (
#开头) - 空白字符 (空格、制表符、换行)
- 注释 (
3. 生成解析器
- 使用 ANTLR4 工具生成代码:
antlr4 YAML.g4
javac YAML*.java
- 使用生成的解析器 (Java 示例):
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;public class YAMLParserExample {public static void main(String[] args) throws Exception {String yaml = """name: John Doeage: 30address:street: 123 Main Stcity: Anytownhobbies:- hiking- reading""";CharStream input = CharStreams.fromString(yaml);YAMLLexer lexer = new YAMLLexer(input);CommonTokenStream tokens = new CommonTokenStream(lexer);YAMLParser parser = new YAMLParser(tokens);ParseTree tree = parser.document();// 打印解析树System.out.println(tree.toStringTree(parser));}
}
4. 解析树可视化
使用 ANTLR 的 grun 工具查看解析树:
grun YAML document -gui <<EOF
name: John Doe
age: 30
EOF
5. 支持的 YAML 特性
| 特性 | 是否支持 | 示例 |
|---|---|---|
| 键值对 | ✅ | key: value |
| 嵌套映射 | ✅ | parent: {child: value} |
| 列表 | ✅ | - item1\n- item2 |
| 多行字符串 | ❌ | `text: |
| 锚点与引用 | ❌ | &anchor\n key: value |
| 复杂数据类型 | ❌ | !!timestamp 2023-01-01 |
6. 扩展建议
-
支持多行字符串:
添加MULTILINE_SCALAR规则:MULTILINE_SCALAR: '|' '\n' (' ' | '\t')* ~[\n]* ('\n' (' ' | '\t')* ~[\n]*)*; -
支持类型标签:
value: SCALAR| tag SCALAR| blockMapping| blockSequence;tag : '!!' [a-zA-Z]+ ; -
错误处理:
添加error规则捕获非法输入:ERROR_CHAR : . ;
7. 完整解析流程
graph TDA[YAML 输入] --> B[词法分析 (Lexer)]B --> C[Token 流]C --> D[语法分析 (Parser)]D --> E[解析树]E --> F[遍历树 (Visitor/Listener)]
这个语法文件提供了 YAML 的核心功能解析,可根据实际需求进一步扩展。
JSON
以下是适用于 ANTLR4 的 JSON 语法文件 (JSON.g4),完整支持 JSON 标准(RFC 8259):
1. JSON 语法文件 (JSON.g4)
grammar JSON;// 语法规则
json: value;value: object| array| STRING| NUMBER| 'true'| 'false'| 'null';object: '{' pair (',' pair)* '}'| '{' '}';pair: STRING ':' value;array: '[' value (',' value)* ']'| '[' ']';// 词法规则
STRING: '"' (ESC | SAFE_CHAR)* '"';fragment ESC: '\\' (["\\/bfnrt] | UNICODE);fragment UNICODE: 'u' HEX HEX HEX HEX;fragment HEX: [0-9a-fA-F];fragment SAFE_CHAR: ~["\\\u0000-\u001F];NUMBER: '-'? INT ('.' [0-9]+)? EXP?;fragment INT: '0' | [1-9] [0-9]*;fragment EXP: [Ee] [+-]? [0-9]+;WS: [ \t\n\r]+ -> skip;
2. 语法说明
-
结构定义:
json: 根规则,表示一个 JSON 文档value: 可以是对象、数组、字符串、数字、布尔值或nullobject: 键值对集合(如{"key": "value"})array: 值列表(如[1, "a", true])
-
词法规则:
STRING: 支持转义字符(\n,\uXXXX等)NUMBER: 支持整数、浮点数和科学计数法WS: 跳过空白字符
-
严格校验:
- 字符串必须用双引号(
")包裹 - 不允许尾随逗号(如
[1, 2,]会报错)
- 字符串必须用双引号(
3. 生成解析器
-
生成 Java 代码:
antlr4 JSON.g4 javac JSON*.java -
测试解析(Java 示例):
import org.antlr.v4.runtime.*; import org.antlr.v4.runtime.tree.*;public class JSONParserExample {public static void main(String[] args) throws Exception {String json = """{"name": "Alice","age": 30,"scores": [90, 85, 95]}""";CharStream input = CharStreams.fromString(json);JSONLexer lexer = new JSONLexer(input);CommonTokenStream tokens = new CommonTokenStream(lexer);JSONParser parser = new JSONParser(tokens);ParseTree tree = parser.json(); // 从根规则开始解析System.out.println(tree.toStringTree(parser));} }
4. 解析树可视化
使用 ANTLR 的 grun 工具查看解析树:
grun JSON json -gui <<EOF
{"key": "value"}
EOF
会显示如下结构:
(json (value (object { (pair "key" : (value "value")) })))
5. 支持的 JSON 特性
| 特性 | 示例 | 是否支持 |
|---|---|---|
| 对象 | {"key": "value"} | ✅ |
| 数组 | [1, "a", true] | ✅ |
| 嵌套结构 | {"a": {"b": [1, 2]}} | ✅ |
| 字符串转义 | "Line\nBreak" | ✅ |
| Unicode 字符 | "\u03B1" (α) | ✅ |
| 科学计数法数字 | 1.23e-4 | ✅ |
布尔值/null | true, false, null | ✅ |
| 尾随逗号 | {"a": 1,} | ❌ |
| 单引号字符串 | {'key': 'value'} | ❌ |
6. 扩展建议
-
支持注释(非标准 JSON):
COMMENT: '/*' .*? '*/' -> skip| '//' ~[\n]* -> skip; -
宽松模式(允许尾随逗号):
object: '{' pair (',' pair)* ','? '}'| '{' '}'; -
自定义错误处理:
parser.addErrorListener(new BaseErrorListener() {@Overridepublic void syntaxError(...) {throw new RuntimeException("Syntax error at line " + line + ":" + charPositionInLine + " - " + msg);} });
7. 性能优化
- 预编译解析器:在多次解析时复用
Lexer/Parser实例 - 关闭冗余功能:禁用
ANTLRErrorListener提升速度lexer.removeErrorListeners(); parser.removeErrorListeners();
此语法文件完全兼容标准 JSON,可直接用于构建 JSON 解析器、验证器或转换工具。如需处理非标准 JSON(如带注释的配置文件),按需扩展即可。
Latex
以下是适用于 ANTLR4 的 LaTeX 语法文件 (LaTeX.g4),定义了包含 documentclass、section、item、task 等常见标记的语法树结构:
1. LaTeX 语法文件 (LaTeX.g4)
grammar LaTeX;// 语法规则
document: preamble? (section | item | task | textContent)*;preamble: '\\documentclass' '{' ID '}' ('[' options ']')?;section: '\\section' '{' textContent '}' (subsection)?;subsection: '\\subsection' '{' textContent '}';item: '\\item' (textContent | itemize | enumerate);itemize: '\\begin{itemize}' item* '\\end{itemize}';enumerate: '\\begin{enumerate}' item* '\\end{enumerate}';task: '\\task' '{' textContent '}' ('\\solution' '{' textContent '}')?;textContent: (TEXT | COMMAND | MATH)+;// 词法规则
COMMAND: '\\' [a-zA-Z]+;MATH: '$' .*? '$';ID: [a-zA-Z]+;TEXT: ~[\\{}[\]]+;OPTION_SEP: ',';LBRACE : '{';
RBRACE : '}';
LBRACK : '[';
RBRACK : ']';WS: [ \t\r\n]+ -> skip;// 复合规则
options: ID (OPTION_SEP ID)*;
2. 语法树结构说明
-
文档结构:
-
节点类型:
preamble:\documentclass声明section/subsection: 章节标题item: 列表项(可嵌套在itemize或enumerate中)task: 自定义任务环境(带可选的\solution)textContent: 文本、命令或数学公式的混合内容
-
嵌套规则:
- 列表可以嵌套 (
item包含itemize/enumerate) textContent可以包含任意文本和命令
- 列表可以嵌套 (
3. 解析示例
输入 LaTeX 文件 (example.tex):
\documentclass{article}
\section{Introduction}
This is a \textbf{test}.
\begin{itemize}\item First point\item Second point with math: $E=mc^2$
\end{itemize}
\task{Solve the equation}{ \solution{ $x=1$ } }
Java 解析代码:
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;public class LaTeXParserExample {public static void main(String[] args) throws Exception {CharStream input = CharStreams.fromFileName("example.tex");LaTeXLexer lexer = new LaTeXLexer(input);CommonTokenStream tokens = new CommonTokenStream(lexer);LaTeXParser parser = new LaTeXParser(tokens);ParseTree tree = parser.document();// 打印解析树System.out.println(tree.toStringTree(parser));// 使用Visitor遍历new LaTeXBaseVisitor<Void>() {@Overridepublic Void visitSection(LaTeXParser.SectionContext ctx) {System.out.println("Section: " + ctx.textContent().getText());return super.visitSection(ctx);}}.visit(tree);}
}
生成的解析树结构:
(document (preamble \documentclass { article }) (section \section { Introduction } (textContent This is a \textbf { test })) (itemize (item \item (textContent First point)) (item \item (textContent Second point with math: $E=mc^2$))) (task \task { Solve the equation } (solution \solution { $x=1$ })))
4. 关键特性支持
| LaTeX 结构 | 是否支持 | 示例 |
|---|---|---|
| 文档类声明 | ✅ | \documentclass{article} |
| 章节标题 | ✅ | \section{Introduction} |
| 无序列表 | ✅ | \itemize \item ... |
| 有序列表 | ✅ | \enumerate \item ... |
| 自定义命令 | ✅ | \textbf{text} |
| 数学公式 | ✅ | $E=mc^2$ |
| 自定义环境 | ✅ | \task{...}\solution{...} |
| 可选参数 | ✅ | \documentclass[12pt]{...} |
| 嵌套结构 | ✅ | 列表中的列表 |
5. 扩展建议
-
支持更多环境:
figure: '\\begin{figure}' ('[' options ']')? content '\\end{figure}'; -
完善数学公式:
MATH: '$' .*? '$'| '\\[' .*? '\\]'; -
错误恢复:
添加error规则:UNKNOWN_CMD: '\\' ~[a-zA-Z] -> skip; -
注释处理:
COMMENT: '%' ~[\n]* -> skip;
6. 典型应用场景
-
LaTeX 文档分析:
- 提取所有章节标题
- 统计数学公式数量
-
自动化批改系统:
- 解析
\task和\solution环境 - 对比学生答案与标准解
- 解析
-
文档转换:
- 将 LaTeX 列表转为 Markdown
- 提取文档结构生成目录
这个语法文件提供了 LaTeX 的核心结构解析,可根据实际需求进一步扩展复杂环境(如表格、图表等)。
相关文章:
使用ANTLR4解析Yaml,JSON和Latex
文章目录 ANTLR4基本使用**1. 安装 Java 运行时(必需)****2. 安装 ANTLR4 命令行工具****方法一:通过包管理器(推荐)****macOS/Linux (Homebrew)****Windows (Chocolatey)** **方法二:手动安装(…...
基于Python深度学习的鲨鱼识别分类系统
摘要:鲨鱼是海洋环境健康的指标,但受到过度捕捞和数据缺乏的挑战。传统的观察方法成本高昂且难以收集数据,特别是对于具有较大活动范围的物种。论文讨论了如何利用基于媒体的远程监测方法,结合机器学习和自动化技术,来…...
Ruby 简介
Ruby 简介 引言 Ruby 是一种广泛使用的动态、开源的编程语言,自 1995 年由日本程序员 Yukihiro Matsumoto(通称 Matz)设计以来,它以其优雅的语法、强大的库支持和跨平台特性赢得了全球开发者的青睐。本文将详细介绍 Ruby 的起源、特点、应用领域以及它在现代软件开发中的…...
EtherNet/IP转ProfiNet协议转换网关驱动西门子PLC与流量计的毫秒级压力同步控制
一、案例背景 汽车涂装线的静电喷涂工艺对压缩空气流量稳定性要求极高。原系统中Alicat流量计与西门子PLC因协议差异无法联动,导致涂料浪费率高达8%。通过JM-EIPM-PN网关实现供气系统与PLC的深度集成。从而实现了EtherNet/IP转ProfiNet的通讯。 二、设备连接与配置…...
为mariadb和mysql添加用户和修改密码的方法
一、查看MariaDB中的用户 步骤1:登录MariaDB sudo mysql -u root -p # 使用root账户登录(输入密码) 步骤2:查询用户列表 -- 切换到mysql系统数据库 USE mysql; -- 查看所有用户及其主机权限 SELECT User, Host FROM user; 输出…...
【力扣刷题|第十七天】0-1 背包 完全背包
目标和 力扣题目网址:目标和 这道题我们先用回溯的思想来做。首先我们设正数和为S,数组和为N,目标值为T,那么S-(N-S)T化简之后可以得S(TN)/2即选择的正数个数为偶数,而且NT也为偶数,那么第一个判断条件我们就有了&…...
python的内存管理
目录 1. 引用计数 2. 垃圾收集(GC) python的内存管理主要是引用计数和垃圾回收器来进行内存管理 1. 引用计数 每个 Python 对象都有一个引用计数,当引用计数为零时,对象的内存会被释放。 import sysa [] # 创建一个空列表对…...
TDengine 中的异常恢复
简介 本章主要介绍在 TDengine 执行命令过程中发生异常,如何手工终于执行的任务。可以终止连接,线上查询及终止事务。 如果一个事务 在一个复杂的应用场景中,连接和查询任务等有可能进入一种错误状态或者耗时过长迟迟无法结束,…...
SQL Server:当在删除数据库时因为存在触发器而无法删除
当在删除数据库时因为存在触发器而无法删除,你可以通过禁用触发器来解决这个问题。下面为你介绍在 SQL Server 里禁用和启用触发器的方法。 禁用数据库中所有表的触发器 你可以使用系统视图 sys.triggers 来查询数据库里所有的触发器,然后生成禁用这些…...
深度学习处理时间序列(3)
基于常识、不使用机器学习的基准 在开始使用像黑盒子一样的深度学习模型解决温度预测问题之前,我们先尝试一种基于常识的简单方法。它可以作为一种合理性检查,还可以建立一个基准,更高级的机器学习模型需要超越这个基准才能证明其有效性。对…...
C++11 -表达式/包装器
1. lambda 表达式各部分说明 [capture-list]:捕捉列表,该列表总是出现在 lambda 函数的开始位置,编译器根据 [] 来判断接下来的代码是否为 lambda 函数,捕捉列表能够捕捉上下文中的变量供 lambda 函数使用。(parameters)…...
VectorBT:使用PyTorch+LSTM训练和回测股票模型 进阶二
VectorBT:使用PyTorchLSTM训练和回测股票模型 进阶二 本方案基于LSTM神经网络构建多时间尺度股票收益率预测模型,结合VectorBT进行策略回测。核心原理是通过不同时间窗口(5/10/20/30日)捕捉股价的短期、中期、长期模式,…...
蓝桥杯 第十二天 819 递增序列
注意注意:不考虑左上的情况,因为题目给的样例没有 public static int is1(char ch[][],int m,int n){int ans0;for (int i0;i<m;i){//起始点在哪for (int j0;j<n;j){int add1;while(jadd<n){if(ch[i][j]<ch[i][jadd]) ans; //横add;}add1…...
ThreadLocal 的妙用(线程隔离)与陷阱(内存泄漏)
前言 在Java开发中,线程安全是一个高频关键词。当我们使用多线程处理共享数据时,常常需要加锁或使用同步机制来避免数据混乱。但有一把“锁”却能让每个线程拥有自己的独立数据副本,它就是ThreadLocal。接下来通过实际案例,带你理…...
【YOLOv11】目标检测任务-实操过程
目录 一、torch环境安装1.1 创建虚拟环境1.2 启动虚拟环境1.3 安装pytorch1.4 验证cuda是否可用 二、yolo模型推理2.1 下载yolo模型2.2 创建模型推理文件2.3 推理结果保存路径 三、labelimg数据标注3.1 安装labelimg3.2 解决浮点数报错3.3 labelimg UI界面介绍3.4 数据标注案例…...
C++_STL之vector篇
一、vector的常见用法 注:C中若使用vector需包含头文件<vector>. 1.vector的构造函数 int n 10,ret1;vector<int> nums(n,ret); //n表示vector初始的容量 ret表示vector中初始化的值for (auto e : nums)cout << e << " "; 扩展…...
Imgui处理glfw的鼠标键盘的方法
在Imgui初始化时,会重新接手glfw的键盘鼠标事件。也就是遇到glfw的键盘鼠标事件时,imgui先会运行自己的处理过程,然后再去处理用户自己注册的glfw的键盘鼠标事件。 看imgui_impl_glfw.cpp源码的安装回调函数部分代码 void ImGui_ImplGlfw_In…...
【松子悲剧的七层本质】
松子悲剧的七层本质 核心命题:松子的悲剧是人性与社会结构的双重绞杀,本质是“爱的异化”与“自我消解”的终极悖论。 第一层:家庭缺爱的童年烙印 现象:松子因父亲对病弱妹妹的偏爱,长期处于情感匮乏状态,…...
sqli-labs靶场 less 9
文章目录 sqli-labs靶场less 9 时间盲注 sqli-labs靶场 每道题都从以下模板讲解,并且每个步骤都有图片,清晰明了,便于复盘。 sql注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、’、“”…...
2-1 MATLAB鮣鱼优化算法ROA优化LSTM超参数回归预测
本博客来源于CSDN机器鱼,未同意任何人转载。 更多内容,欢迎点击本专栏目录,查看更多内容。 目录 0.ROA原理 1.LSTM程序 2.ROA优化LSTM 3.主程序 4.结语 0.ROA原理 具体原理看原文,但是今天咱不用知道具体原理,只…...
fircrawl本地部署
企业内部的网站作为知识库给dify使用,使用fircrawl来爬虫并且转换为markdown。 git clone https://github.com/mendableai/firecrawl.gitcd ./firecrawl/apps/api/ cp .env.example .env cd ~/firecrawl docker compose up -d 官方: https://githu…...
Labview学习记录
1.快捷键 ctrlR 运行 ctrlB 去除断线 ctrlH 即时帮助 ctrlE 前后面板切换 2.画面移动 ctrlshift鼠标左键...
【Golang】第八弹----面向对象编程
🔥 个人主页:星云爱编程 🔥 所属专栏:Golang 🌷追光的人,终会万丈光芒 🎉欢迎大家点赞👍评论📝收藏⭐文章 前言:Go语言面向对象编程说明 Golang也支持面向对…...
java基础以及内存图
java基础 命名: 大驼峰:类名 小驼峰:变量名方法名等其他的 全部大写:常量名字.. // 单行注释 /**/ 多行注释 变量类型 变量名 一、基本类型(8个) 整数:byte-8bit short-16bit int 32-b…...
【嵌入式学习3】TCP服务器客户端 - UDP发送端接收端
目录 1、TCP TCP特点 TCP三次握手(建立TCP连接): TCP四次握手【TCP断开链接的时候需要经过4次确认】: TCP网络程序开发流程 客户端开发:用户设备上的程序 服务器开发:服务器设备上的程序 2、UDP 为…...
Linux之基础知识
目录 一、环境准备 1.1、常规登录 1.2、免密登录 二、Linux基本指令 2.1、ls命令 2.2、pwd命令 2.3、cd命令 2.4、touch命令 2.5、mkdir命令 2.6、rmdir和rm命令 2.7man命令 2.8、cp命令 2.9、mv命令 2.10、cat命令 2.11、echo命令 2.11.1、Ctrl r 快捷键 2…...
llamafactory微调效果与vllm部署效果不一致如何解决
在llamafactory框架训练好模型之后,自测chat时模型效果不错,但是部署到vllm模型上效果却很差 这实际上是因为llamafactory微调时与vllm部署时的对话模板不一致导致的。 对应的llamafactory的代码为 而vllm启动时会采用大模型自己本身设置的对话模板信息…...
Python控制结构详解
前言 一、控制结构概述 二、顺序结构 三、选择结构(分支结构) 1. 单分支 if 2. 双分支 if-else 3. 多分支 if-elif-else 4.实际应用: 四、循环结构 1. for循环 2. while循环 3. 循环控制语句 五、异常处理(try-except)…...
Mysql-经典实战案例(11):深度解析Sysbench压测(从入门到MySQL服务器性能验证)
引言 如何用Sysbench压测满足mysql生产运行的服务器? Sysbench返回的压测结果如何解读? 别急,本文会教大家如何使用并且如何解读压测的结果信息,如何对mysql服务器进行压测! 一、Sysbench核心功能全景解析 1.1 工…...
WebSocket通信的握手阶段
1. 客户端建立连接时,通过 http 发起请求报文,报文表示请求服务器端升级协议为 WebSocket,与普通的 http 请求协议略有区别的部分在于如下的这些协议头: 上述两个字段表示请求服务器端升级协议为 websocket 协议。 2. 服务器端响…...
