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

编译原理Lab1-用FLEX构造C-Minus-f词法分析器

HNU编译原理lab1实验–根据cminux-f的词法补全lexical_analyer.l文件,完成词法分析器。

本文没有添加任何图片,但是以复制输出的形式展现出来了实验结果。

实验要求:

根据cminux-f的此法补全lexical_analyer.l文件,完成词法分析器,能够输出识别出的token,type,line(刚出现的行数),pos_start(该行的开始位置),post_end(结束位置 不包含)
例如:
文本输入:

int a;

则识别结果应为:

int     280     1       2       5
a       285     1       6       7
;       270     1       7       8

cminus-f词法

C MINUS是C语言的一个子集,该语言的语法在《编译原理与实践》第九章附录中有详细的介绍。而cminus-f则是在C MINUS上追加了浮点操作。

  1. 关键字else if int return void while float
  2. 专用符号+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */
  3. 标识符ID和整数NUM,通过下列正则表达式定义:
letter = a|...|z|A|...|Z
digit = 0|...|9
ID = letter+
INTEGER = digit+
FLOAT = (digit+. | digit*.digit+)
  1. 注释用/*...*/表示,可以超过一行。注释不能嵌套。
/*...*/
  • 注:[, ], 和 [] 是三种不同的token。[]用于声明数组类型,[]中间不得有空格。
    • a[]应被识别为两个token: a[]
    • a[1]应被识别为四个token: a, [, 1, ]

实验难点

git相关操作:常用的命令在实验文档中

将实验仓库克隆到本地:打开本地的工作目录,在命令行中输入
`git clone https://gitee.com/你的gitee用户名/cminus_compiler-2022-fall.git`
打开本地的工作目录,在命令行中输入
git add *
git commit -m "注释语句"
然后push到仓库
git push

实验环境配置

sudo apt-get install llvm bison flex
输入:flex --version和bison --version

FLEX工具的简单使用

首先,FLEX从输入文件*.lex或者stdio读取词法扫描器的规范,从而生成C代码源文件lex.yy.c。然后,编译lex.yy.c并与-lfl库链接,以生成可执行的a.out。最后,a.out分析其加入的输入流,将其转换为一系列token。
举例:

%{
//在%{和%}中的代码会被原样照抄到生成的lex.yy.c文件的开头,您可以在这里书写声明与定义
#include <string.h>
int chars = 0;
int words = 0;
%}
%%/*你可以在这里使用你熟悉的正则表达式来编写模式*//*你可以用C代码来指定模式匹配时对应的动作*//*yytext指针指向本次匹配的输入文本*//*左部分([a-zA-Z]+)为要匹配的正则表达式,右部分({ chars += strlen(yytext);words++;})为匹配到该正则表达式后执行的动作*/
[a-zA-Z]+ { chars += strlen(yytext);words++;}
. {}/*对其他所有字符,不做处理,继续执行*/
%%
int main(int argc, char **argv){//yylex()是flex提供的词法分析例程,默认读取stdin      yylex();                                                               printf("look, I find %d words of %d chars\n", words, chars);return 0;
}

lex中的字符规定:

格式含义
a字符
“a”元字符
\a转义
a*a的零次或者多次重复
a+a的一次或者多次重复
a?一个可选的a
ab
(a)a本身
[abc]字符abc中的任意一个
[a-d]字符abcd的任意一个
{xxxxx}名字xxx表示的正则表达式
.除了新行之外的任意一个字符

实验设计

找到Token符号对应的字符

cminux_compiler-2023-fall/include/lexical_analyzer.h
有定义cimux_token_type(附录)

对应正则表达式

根据cminus-f词法

1. 关键字
else if int return void while float2. 专用符号
+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */3. 标识符ID和整数NUM,通过下列正则表达式定义:
letter = a|...|z|A|...|Z
digit = 0|...|9
ID = letter+
INTEGER = digit+
FLOAT = (digit+. | digit*.digit+)4. 注释用`/*...*/`表示,可以超过一行。注释不能嵌套。
/*...*/
- 注:`[`, `]`, 和 `[]` 是三种不同的token。`[]`用于声明数组类型,`[]`中间不得有空格。- `a[]`应被识别为两个token: `a`、`[]`- `a[1]`应被识别为四个token: `a`, `[`, `1`, `]`

写出对应的正则表达式和指定匹配对应的动作

C minus的词法单元规则有:
关键字:else if int return void while float
专用符号:`+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */``
标识符ID和整数NUM,通过下列正则表达式定义:

letter = a|...|z|A|...|Z
digit = 0|...|9
ID = letter+
INTEGER = digit+
FLOAT = (digit+. | digit*.digit+)

注释用/*...*/表示,可以超过一行。注释不能嵌套。

此部分用于定义C Minus的词法单元的规则,模式采用正则表达式表示,注意当词法单元的pattern中包含特殊字符时,需要使用转义字符\。动作使用C语言描述,确定每个Token在每行的开始位置和结束位置,并且返回该词法单元类型。该返回值为yylex()的返回值。
动作分为两步:第一步,更新lines、pos_start、post_end。第二步:将识别结果token返回,return。
运算:

\+ {pos_start=pos_end;pos_end=pos_start+1;return ADD;}
\- {pos_start=pos_end;pos_end=pos_start+1;return SUB;}
\* {pos_start=pos_end;pos_end=pos_start+1;return MUL;}
\/ {pos_start=pos_end;pos_end=pos_start+1;return DIV;}
\< {pos_start=pos_end;pos_end=pos_start+1;return LT;}
"<=" {pos_start=pos_end;pos_end=pos_start+2;return LTE;}
\> {pos_start=pos_end;pos_end=pos_start+1;return GT;}
">=" {pos_start=pos_end;pos_end=pos_start+2;return GTE;}
"==" {pos_start=pos_end;pos_end=pos_start+2;return EQ;}
"!=" {pos_start=pos_end;pos_end=pos_start+2;return NEQ;}
\= {pos_start=pos_end;pos_end=pos_start+1;return ASSIN;}

符号:

\; {pos_start=pos_end;pos_end=pos_start+1;return SEMICOLON;}
\, {pos_start=pos_end;pos_end=pos_start+1;return COMMA;}
\( {pos_start=pos_end;pos_end=pos_start+1;return LPARENTHESE;}
\) {pos_start=pos_end;pos_end=pos_start+1;return RPARENTHESE;}
\[ {pos_start=pos_end;pos_end=pos_start+1;return LBRACKET;}
\] {pos_start=pos_end;pos_end=pos_start+1;return RBRACKET;}
\{ {pos_start=pos_end;pos_end=pos_start+1;return LBRACE;}
\} {pos_start=pos_end;pos_end=pos_start+1;return RBRACE;}

关键字:

else {pos_start=pos_end;pos_end=pos_start+4;return ELSE;}
if {pos_start=pos_end;pos_end=pos_start+2;return IF;}
int {pos_start=pos_end;pos_end=pos_start+3;return INT;}
float {pos_start=pos_end;pos_end=pos_start+5;return FLOAT;}
return {pos_start=pos_end;pos_end=pos_start+6;return RETURN;}
void {pos_start=pos_end;pos_end=pos_start+4;return VOID;}
while {pos_start=pos_end;pos_end=pos_start+5;return WHILE;}

标识符和整数NUM

[a-zA-Z]+ {pos_start=pos_end;pos_end=pos_start+strlen(yytext);return IDENTIFIER;}
[0-9]+ {pos_start=pos_end;pos_end=pos_start+strlen(yytext);return INTEGER;}
[0-9]*\.[0-9]+ {pos_start=pos_end;pos_end=pos_start+strlen(yytext);return FLOATPOINT;}
"[]" {pos_start=pos_end;pos_end=pos_start+2;return ARRAY;}
[a-zA-Z] {pos_start=pos_end;pos_end=pos_start+1;return LETTER;}
[0-9]+\. {pos_start=pos_end;pos_end=pos_start+strlen(yytext);return FLOATPOINT;}

其他的

  • 当词法分析器扫描到换行符时(Windows下为\r\n,Linux下为\n,Mac下为\r),行数lines自增,pos_startpos_end更新
  • 由于flex生成的词法分析器采用最长匹配策略,且注释/**/包含正则的通配符,正则规范较为复杂。当识别到一个注释时,需要考虑词法单元开始位置和结束位置变化,且多行注释要修改lines.
  • 错误的词法单元 ,当扫描到错误的词法单元,仅返回ERROR
\n {return EOL;} #换行
\/\*([^\*]|(\*)*[^\*\/])*(\*)*\*\/ {return COMMENT;} #注释
" " {return BLANK;} #空格
\t {return BLANK;} # 空格
. {pos_start=pos_end;pos_end=pos_start+strlen(yytext);return ERROR;} #错误

最终的添加

/******************TODO*********************//****请在此补全所有flex的模式与动作  start******///STUDENT TO DO\+ {pos_start=pos_end;pos_end=pos_start+1;return ADD;}
\- {pos_start=pos_end;pos_end=pos_start+1;return SUB;}
\* {pos_start=pos_end;pos_end=pos_start+1;return MUL;}
\/ {pos_start=pos_end;pos_end=pos_start+1;return DIV;}
\< {pos_start=pos_end;pos_end=pos_start+1;return LT;}
"<=" {pos_start=pos_end;pos_end=pos_start+2;return LTE;}
\> {pos_start=pos_end;pos_end=pos_start+1;return GT;}
">=" {pos_start=pos_end;pos_end=pos_start+2;return GTE;}
"==" {pos_start=pos_end;pos_end=pos_start+2;return EQ;}
"!=" {pos_start=pos_end;pos_end=pos_start+2;return NEQ;}
\= {pos_start=pos_end;pos_end=pos_start+1;return ASSIN;}
\; {pos_start=pos_end;pos_end=pos_start+1;return SEMICOLON;}
\, {pos_start=pos_end;pos_end=pos_start+1;return COMMA;}
\( {pos_start=pos_end;pos_end=pos_start+1;return LPARENTHESE;}
\) {pos_start=pos_end;pos_end=pos_start+1;return RPARENTHESE;}
\[ {pos_start=pos_end;pos_end=pos_start+1;return LBRACKET;}
\] {pos_start=pos_end;pos_end=pos_start+1;return RBRACKET;}
\{ {pos_start=pos_end;pos_end=pos_start+1;return LBRACE;}
\} {pos_start=pos_end;pos_end=pos_start+1;return RBRACE;}
else {pos_start=pos_end;pos_end=pos_start+4;return ELSE;}
if {pos_start=pos_end;pos_end=pos_start+2;return IF;}
int {pos_start=pos_end;pos_end=pos_start+3;return INT;}
float {pos_start=pos_end;pos_end=pos_start+5;return FLOAT;}
return {pos_start=pos_end;pos_end=pos_start+6;return RETURN;}
void {pos_start=pos_end;pos_end=pos_start+4;return VOID;}
while {pos_start=pos_end;pos_end=pos_start+5;return WHILE;}
[a-zA-Z]+ {pos_start=pos_end;pos_end=pos_start+strlen(yytext);return IDENTIFIER;}
[0-9]+ {pos_start=pos_end;pos_end=pos_start+strlen(yytext);return INTEGER;}
[0-9]*\.[0-9]+ {pos_start=pos_end;pos_end=pos_start+strlen(yytext);return FLOATPOINT;}
"[]" {pos_start=pos_end;pos_end=pos_start+2;return ARRAY;}
[a-zA-Z] {pos_start=pos_end;pos_end=pos_start+1;return LETTER;}
[0-9]+\. {pos_start=pos_end;pos_end=pos_start+strlen(yytext);return FLOATPOINT;}
\n {return EOL;}
\/\*([^\*]|(\*)*[^\*\/])*(\*)*\*\/ {return COMMENT;}
" " {return BLANK;}
\t {return BLANK;}
. {pos_start=pos_end;pos_end=pos_start+strlen(yytext);return ERROR;}/****请在此补全所有flex的模式与动作  end******/

和补充C语言代码

注释可以分为多行,所以在识别到注释的时候要进行额外的分析,识别到换行符\n的时候,要lines+1,重置pos_end.

           case COMMENT://STUDENT TO DO{pos_start=pos_end;pos_end=pos_start+2;int i=2;while(yytext[i]!='*' || yytext[i+1]!='/'){  			if(yytext[i]=='\n'){lines=lines+1;pos_end=1;}elsepos_end=pos_end+1;i=i+1;}pos_end=pos_end+2;break;}case BLANK://STUDENT TO DO{pos_start=pos_end;pos_end=pos_start+1;break;}case EOL://STUDENT TO DO{lines+=1;pos_end=1;break;}

实验结果验证

实验结果

根据实验指导书上的流程输入命令并且得到反馈结果

sunny2004@sunny2004-VirtualBox:~/lab1/cminus_compiler-2023-fall$ mkdir build
sunny2004@sunny2004-VirtualBox:~/lab1/cminus_compiler-2023-fall$ cd build
sunny2004@sunny2004-VirtualBox:~/lab1/cminus_compiler-2023-fall/build$ cmake ../
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found FLEX: /usr/bin/flex (found version "2.6.4") 
-- Found BISON: /usr/bin/bison (found version "3.5.1") 
-- Found LLVM 10.0.0
-- Using LLVMConfig.cmake in: /usr/lib/llvm-10/cmake
-- Configuring done
-- Generating done
-- Build files have been written to: /home/sunny2004/lab1/cminus_compiler-2023-fall/build
sunny2004@sunny2004-VirtualBox:~/lab1/cminus_compiler-2023-fall/build$ make lexer
[ 20%] [FLEX][lex] Building scanner with flex 2.6.4
lexical_analyzer.l:60: warning, 无法匹配规则
Scanning dependencies of target flex
[ 40%] Building C object src/lexer/CMakeFiles/flex.dir/lex.yy.c.o
lexical_analyzer.l: In function ‘analyzer’:
lexical_analyzer.l:92:5: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
lexical_analyzer.l: At top level:
/home/sunny2004/lab1/cminus_compiler-2023-fall/build/src/lexer/lex.yy.c:1320:17: warning: ‘yyunput’ defined but not used [-Wunused-function]static void yyunput (int c, char * yy_bp )^
/home/sunny2004/lab1/cminus_compiler-2023-fall/build/src/lexer/lex.yy.c:1363:16: warning: ‘input’ defined but not used [-Wunused-function]static int input  (void)^
[ 60%] Linking C static library ../../libflex.a
[ 60%] Built target flex
Scanning dependencies of target lexer
[ 80%] Building C object tests/lab1/CMakeFiles/lexer.dir/main.c.o
[100%] Linking C executable ../../lexer
[100%] Built target lexer
sunny2004@sunny2004-VirtualBox:~/lab1/cminus_compiler-2023-fall/build$ cd ..
sunny2004@sunny2004-VirtualBox:~/lab1/cminus_compiler-2023-fall$ ./build/lexer
usage: lexer input_file output_file
sunny2004@sunny2004-VirtualBox:~/lab1/cminus_compiler-2023-fall$ ./build/lexer ./tests/lab1/testcase/1.cminus out
[START]: Read from: ./tests/lab1/testcase/1.cminus
[END]: Analysis completed.
sunny2004@sunny2004-VirtualBox:~/lab1/cminus_compiler-2023-fall$ head -n 5 out
int	280	1	1	4
gcd	285	1	5	8
(	272	1	9	10
int	280	1	10	13
u	285	1	14	15
sunny2004@sunny2004-VirtualBox:~/lab1/cminus_compiler-2023-fall$ python3 ./tests/lab1/test_lexer.py
Find 6 files
[START]: Read from: ./tests/lab1/testcase/3.cminus
[END]: Analysis completed.
[START]: Read from: ./tests/lab1/testcase/2.cminus
[END]: Analysis completed.
[START]: Read from: ./tests/lab1/testcase/6.cminus
[END]: Analysis completed.
[START]: Read from: ./tests/lab1/testcase/1.cminus
[END]: Analysis completed.
[START]: Read from: ./tests/lab1/testcase/5.cminus
[END]: Analysis completed.
[START]: Read from: ./tests/lab1/testcase/4.cminus
[END]: Analysis completed.
sunny2004@sunny2004-VirtualBox:~/lab1/cminus_compiler-2023-fall$ diff ./tests/lab1/token ./tests/lab1/TA_token
sunny2004@sunny2004-VirtualBox:~/lab1/cminus_compiler-2023-fall$ 

如果正确的话,diff不会返回任何输出,如果返回了,就出错了

gitee上传

git commit -m "lab1-result"
如果是第一次提交,Ubuntu会告诉你这样:
请告诉我您是谁,运行
git config --global user.email "you@example.com"
git config --global user.name "your Name"
来自设置您账号的缺省身份标识。
如果仅在本地仓库设置身份标识,则省略 --global参数
这个时候你就运行git config那两行命令之后再运行git commit -m "lab1-result"就可以了
然后:git push 上传工作到gitee仓库(这一部分忘记复制了,实验指导书里写的很详细,就按照那个来就行)

实验反馈

学习和巩固了正则表达式
熟悉了gitee的操作
一路磕磕绊绊,调试,赶在验收之前完成了,编译原理好难┭┮﹏┭┮

附录1:cmius_token_type

typedef num cminus_token_type{
//运算
ADD = 259, 	加号:+
SUB = 260, 	减号:-
MUL = 261, 	乘号:*
DIV = 262, 	除法:/
LT = 263, 	小于:<
LTE = 264, 	小于等于:<=
GT = 265, 	大于:>
GTE = 266, 	大于等于:>=
EQ = 267, 	相等:==
NEQ = 268, 	不相等:!=
ASSIN = 269,单个等于号:=//符号
SEMICOLON = 270,	分号:;
COMMA = 271, 		逗号:,
LPARENTHESE = 272, 	左括号:(
RPARENTHESE = 273, 	右括号:)
LBRACKET = 274, 	左中括号:[
RBRACKET = 275, 	右中括号:]
LBRACE = 276, 		左大括号:{
RBRACE = 277, 		右大括号:}//关键字
ELSE = 278, 	else
IF = 279, 		if
INT = 280, 		int
FLOAT = 281, 	float
RETURN = 282, 	return 
VOID = 283, 	void
WHILE = 284,	while//ID和NUM
IDENTIFIER = 285,	变量名,例如a,low,high
INTEGER = 286, 		整数,例如10,1
FLOATPOINT = 287,	浮点数,例如11.1
ARRAY = 288,		数组,例如[]
LETTER = 289,		单个字母,例如a,z	//others
EOL = 290,			换行符,\n或\0	
COMMENT = 291,		注释
BLANK = 292,		空格
ERROR = 258			错误
} Token;typedef struct{char text[256];int token;int lines;int pos_start;int pos_end;
} Token_Node;

相关文章:

编译原理Lab1-用FLEX构造C-Minus-f词法分析器

HNU编译原理lab1实验–根据cminux-f的词法补全lexical_analyer.l文件&#xff0c;完成词法分析器。 本文没有添加任何图片&#xff0c;但是以复制输出的形式展现出来了实验结果。 实验要求&#xff1a; 根据cminux-f的此法补全lexical_analyer.l文件&#xff0c;完成词法分析…...

网络安全之渗透测试入门准备

渗透测试入门所需知识 操作系统基础&#xff1a;Windows&#xff0c;Linux 网络基础&#xff1a;基础协议与简单原理 编程语言&#xff1a;PHP&#xff0c;python web安全基础 渗透测试入门 渗透测试学习&#xff1a; 1.工具环境准备&#xff1a;①VMware安装及使用&#xff1b…...

【MySQL】宝塔面板结合内网穿透实现公网远程访问

文章目录 前言1.Mysql服务安装2.创建数据库3.安装cpolar3.2 创建HTTP隧道4.远程连接5.固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 宝塔面板的简易操作性,使得运维难度降低,简化了Linux命令行进行繁琐的配置,下面简单几步,通过宝塔面板cpo…...

通过AX6000路由器,实现外部访问内网的任意主机

概述 这里遇到一个场景,就是需要外部的人员,访问我内网的一台设备,进行内外部的设备联调。 这也是实际环境中,很常见的一种场景。 之前的做法是子设备上运行edge节点,可以直接访问。 但有的设备无法运行edge节点,那么可以参考一下这个方案来实现。 此方案可以摒弃了…...

如何应用ChatGPT撰写、修改论文及工作报告,提供写作能力及优化工作??

如果我想让gpt从pdf文档中提取相关关键词的内容&#xff0c;可以怎么做呢&#xff1f;&#xff1f;我们评论区讨论 ChatGPT 在论文写作与编程方面也具备强大的能力。无论是进行代码生成、错误调试还是解决编程难题&#xff0c;ChatGPT都能为您提供实用且高质量的建议和指导&am…...

camera-caps:Jetson设备上的一种实用的V4L2可视化界面

camera-caps&#xff1a;Jetson设备上的一种实用的V4L2可视化界面 github地址是&#xff1a; https://github.com/jetsonhacks/camera-caps 注意&#xff1a;Jetpack5.x需要选择tag 5.x版本...

CAN基础知识

CAN 简介 CAN 是 Controller Area Network 的缩写&#xff08;以下称为 CAN&#xff09;&#xff0c;是 ISO 国际标准化的串行通信 协议。在当前的汽车产业中&#xff0c;出于对安全性、舒适性、方便性、低公害、低成本的要求&#xff0c;各种 各样的电子控制系统被开发了出来…...

vue3跨域怎么解决?

其实很简单 假设一个接口; http://101.42.170.68:10000/open/mockData/test1 首先&#xff0c;看自己项目中有没有vue.config.js文件&#xff0c;如果没有自己创建一个&#xff0c;如果有那吗在其中写。 vue.config.js: //固定格式&#xff0c;修改一部分就行了 const { def…...

强化学习小笔记 —— 如何选择合适的更新步长

在强化学习中&#xff0c;动作价值函数的更新可以使用增量法&#xff0c;如下所示&#xff1a; Q k 1 k ∑ i 1 k r i 1 k ( r k ∑ i 1 k − 1 r i ) 1 k ( r k ( k − 1 ) Q k − 1 ) 1 k ( r k k Q k − 1 − Q k − 1 ) Q k − 1 1 k [ r k − Q k − 1 ] \beg…...

容斥 C. Strange Function改编题

补题&#xff1a; 题目详情 - 9.段坤爱取模%%% - SUSTOJ 本题或许是参考 Problem - C - Codeforces 根据题意&#xff0c;f(i)就是不能被整除的最小的一个质因子。 打表发现&#xff0c;当15个质因子相乘后&#xff0c;长度就大于18。 因此可以知道小于等于1e16内的正整数x…...

C++笔记

文章目录 类模板类函数什么是友元函数?什么是内联函数?VECTOR哈希表栈队列映射与解除映射mmap()munmap可变参数 va_start()-va_send()vsnprintf()C/C++异常处理list红黑树类 基类、父类、顶层类、抽象类 子类、派生类 模板类 在C++中,模板类(Template Class)是一种通用…...

python-opencv 培训课程笔记(1)

python-opencv 培训课程笔记&#xff08;1&#xff09; 博主参加了一次opencv库的培训课程&#xff0c;把课程所学整理成笔记&#xff0c;供大家学习&#xff0c;第一次课程包括如下内容&#xff1a; 1.读取图像 2.保存图像 3.使用opencv库显示图像 4.读取图像为灰度图像 …...

【C++初阶】STL详解(七)Stack与Queue的模拟实现

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…...

校园报修抢修小程序系统开发 物业小区报修预约上门维修工单系统

开发的功能模块有&#xff1a; 1.报修工单提交&#xff1a;学生、教职员工等可以使用小程序提交报修请求。这通常包括选择报修的问题类型&#xff08;如水漏、电器故障、照明问题等&#xff09;&#xff0c;地点&#xff0c;报修联系人&#xff0c;联系电话等&#xff0c;并提供…...

【Android】Hilt比Android好在哪里

Hilt框架的功能和设计理念&#xff0c;和Dagger基本是完全一致的&#xff0c;Hilt也是完全在Dagger基础上进行开发的 但是Dagger的用法比较繁琐&#xff0c;Hilt主要是做了便用性上的改进&#xff0c;主要有以下点 提供常用Component&#xff0c;不用再为每个InjectTarget都创…...

计算方法 期末总结

思维导图 绪论 算法的性质&#xff1a; 有穷性、确切性、有输入输出、可行性 算法的描述方法&#xff1a; 自然语言、伪代码、流程图、N-S流程图 算法设计思想&#xff1a; 化大为小的缩减技术&#xff1a;二分法化难为易的校正技术&#xff1a;开方法化粗为精的松弛技术&a…...

【面试】jvm中堆是分配对象存储的唯一选择吗

目录 一、说明二、逃逸分析2.1 说明2.2 参数设置 一、说明 1.在《深入理解Java虚拟机》中关于Java堆内存有这样一段描述:随着JIT编译期的发展与逃逸分析技术逐渐成熟&#xff0c;栈上分配、标量替换优化技术将会导致一些微妙的变化&#xff0c;所有的对象都分配到堆上也渐渐变得…...

音视频同步笔记 - 以音频时间为基

音视频同步 - 以音频时间为基 上图介绍&#xff1a; 该图是以音频的时间为基&#xff0c;对视频播放时间的延迟控制方案&#xff0c;只调整视频的播放延时。delayTime是视频播放的延迟时间&#xff0c;初始值是1 / FPS * 1000 (ms)&#xff0c;如果FPS为25帧率&#xff0c;初始…...

JavaScript 原始数据类型和对应的对象类型(内置对象)之间的关系

JavaScript 原始数据类型和对应的对象类型&#xff08;内置对象&#xff09;之间的关系 JavaScript 的原始&#xff08;primitive&#xff09;数据类型包括包括数字&#xff08;Number&#xff09;、字符串&#xff08;String&#xff09;、布尔值&#xff08;Boolean&#xf…...

报错For debugging consider passing CUDA_LAUNCH_BLOCKING=1.

.报错For debugging consider passing CUDA_LAUNCH_BLOCKING1. /aten/src/ATen/native/cuda/NLLLoss2d.cu:103: nll_loss2d_forward_kernel: block: [29,0,0], thread: [707,0,0] Assertion t > 0 && t < n_classes failed. 报错信息如下&#xff1a; ./aten/…...

水面舰船强电磁脉冲防护体系解析

强电磁脉冲(EMP)作为典型的高功率、宽频带瞬态电磁环境,对现代水面舰船的电子信息系统构成系统性威胁。本文从电磁能量耦合机理出发,系统梳理舰船平台中“前门/后门”耦合路径,重点分析美国相关军用标准(如 MIL-STD-464C、MIL-STD-461F)的技术要求与验证方法,并结合工程…...

3分钟快速上手:DownKyi B站视频下载器终极使用教程

3分钟快速上手&#xff1a;DownKyi B站视频下载器终极使用教程 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#xff…...

昆仑万维第一季营收25.7亿:同比增46% 净亏8.9亿 艾捷科芯刚融资5.5亿

雷递网 乐天 4月28日昆仑万维&#xff08;股票代码&#xff1a;300418.SZ&#xff09;今日发布截至2026年第一季度的财报。财报显示&#xff0c;昆仑万维2026年第一季度营收为25.7亿元&#xff0c;较上年同期的17.64亿元增长45.69%。昆仑万维2026年第一季度净亏损为8.87亿元&am…...

2026年张掖美食本地人推荐

张掖&#xff0c;这座充满历史韵味与独特风情的城市&#xff0c;不仅有壮丽的自然风光&#xff0c;更有令人垂涎欲滴的美食。在众多餐厅中&#xff0c;张丹霞鱼庄凭借其地道的美食、优质的服务和独特的环境&#xff0c;成为了张掖美食本地人推荐的热门之选。接下来&#xff0c;…...

服务容灾设计思考

服务容灾设计思考&#xff1a;构建高可用系统的核心策略 在数字化时代&#xff0c;服务的连续性和稳定性成为企业竞争力的关键。无论是金融、电商还是公共服务领域&#xff0c;系统宕机或数据丢失都可能造成不可估量的损失。服务容灾设计正是为了解决这一问题而生&#xff0c;…...

重新定义AI与浏览器交互范式:Playwright MCP的无障碍快照革命

重新定义AI与浏览器交互范式&#xff1a;Playwright MCP的无障碍快照革命 【免费下载链接】playwright-mcp Playwright MCP server 项目地址: https://gitcode.com/gh_mirrors/pl/playwright-mcp 在AI驱动的自动化领域&#xff0c;传统基于视觉模型的浏览器交互方案面临…...

四叶草拼音:从输入困境到极致体验的蜕变之旅

四叶草拼音&#xff1a;从输入困境到极致体验的蜕变之旅 【免费下载链接】rime-cloverpinyin &#x1f340;️四叶草拼音输入方案&#xff0c;做最好用的基于rime开源的简体拼音输入方案&#xff01; 项目地址: https://gitcode.com/gh_mirrors/ri/rime-cloverpinyin 你…...

汽车大梁生产线全液压铆接机液压系统设计

汽车大梁作为车身的“骨架”&#xff0c;其结构强度直接影响整车安全性。全液压铆接机通过液压系统精准控制铆接力&#xff0c;将铆钉与大梁板材紧密结合&#xff0c;确保连接部位在复杂工况下仍能保持高强度与稳定性。这一过程无需传统焊接的高温环境&#xff0c;避免了金属晶…...

计算机视觉最佳实践

计算机视觉作为人工智能的核心领域之一&#xff0c;正在深刻改变我们的生活和工作方式。从人脸识别到自动驾驶&#xff0c;从医学影像分析到工业质检&#xff0c;计算机视觉技术的应用场景日益广泛。要构建高效、可靠的计算机视觉系统并非易事&#xff0c;需要遵循一系列最佳实…...

终极NCM解密指南:3分钟解锁网易云音乐加密格式,让音乐自由播放

终极NCM解密指南&#xff1a;3分钟解锁网易云音乐加密格式&#xff0c;让音乐自由播放 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为下载的网易云音乐NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump是一款简单…...