编译原理实验一(C-语言词法分析器的编写C语言版本)

2023-11-19

 

 

编译原理实验一(C-语言词法分析器的编写C语言版本)

一、tiny词法分析程序源代码阅读笔记:

重要变量和函数:

①变量和函数:

A.要计算的唯一特性是词法或是被识别的记号的串值

变量t o k e n S t r i n g

B.扫描程序使用3个全程变量

文件变量s o u r c e和l i s t i n g,整型变量l i n e n o

C.存储当前行

 char lineBuf[BUFLEN];

C.当前单词类型

 c u r r e n t T o k e n

D.所要计算的唯一特性——词法或是被识别的记号的串值

t o k e n S t r i n g

E.标志变量被用作指示是否将一个字符增加到t o k e n S t r i n g之上

s a v e

 F.完成位于由g e t T o k e n的主要循环识别的标识符之后的保留字的查找

TokenType reservedLookup (char* s)

G.进行词法分析,返回下一个合法单词的类型

TokenType getToken(void)

D.按格式打印一个单词

void printToken( TokenType token, const char* tokenString )

E.从行缓冲中输入下一个非空格字符,当行缓冲为空则输入下一行字符串。

static int getNextChar(void)

 

F.不读取下一个字符,在行缓冲中回退一个字符。

static void ungetNextChar(void)

 

②数据结构

 

A.状态类型(枚举)

typedef enum

{ START,INASSIGN,INCOMMENT,INNUM,INID,DONE }

   StateType;

 

 

B.单词类型(枚举)

typedef enum{

ENDFILE,ERROR,

    IF,THEN,ELSE,END,REPEAT,UNTIL,READ,WRITE,    ID,NUM,

ASSIGN,EQ,LT,PLUS,MINUS,TIMES,OVER,LPAREN,RPAREN,SEMI

   } TokenType;

 

 

 

C.保留字的查找表(结构体类型)

 

static struct

    { char* str;

      TokenType tok;

    } reservedWords[MAXRESERVED]

   = {{"if",IF},{"then",THEN},{"else",ELSE},{"end",END},

      {"repeat",REPEAT},{"until",UNTIL},{"read",READ},

      {"write",WRITE}};

 

有START,INASSIGN,INCOMMENT,INNUM,INID,DONE六个状态

其状态转换图:

总结:

cifa词法分析程序的主要思路是:

①从主函数环境变量中获取输入文件的名称,并判断其是否存在

②循环调用getToken函数进行词法分析,直到函数返回值位ENDFILE即到达文件末尾

③getToken函数中的分析思路:

  1. 初始状态位START, tokenStringIndex 为0表示从输入字符串的第一个字符开始分析
  2. 调用getNextChar()来获取下一个位置的字符
  3. 在对应的状态下,根据字符的类型和DFA中的转换关系,得到当前词法单元的类型,并更新状态。
  4. 在分析过程中将每个字符保存到tokenString中。
  5. 直到状态STATE为DONE则该词法单元分析结束。tokenString中加入一个空字符表示词法单元的尾部。并且如果该词法单元为标识符则查找相应的保留字。

二、C-词法分析器实验报告:

1.C-词法规则

语言的关键字

else if int return void while

所有的关键字都是保留字,并且必须是小写。

 

专用符号

+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */

 

其他标记是I D和N U M,通过下列正则表达式定义:

ID = letter letter*

NUM = digit digit*

letter = a|..|z|A|..|Z

digit = 0|..|9

小写和大写字母是有区别的。

 

空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开 I D、N U M关键字。

 

注释用通常的C语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置 (即注释

不能放在标记内)上,且可以超过一行。注释不能嵌套。

 

 

 

 

 

整理:

保留字

特殊符号

其他

else

+

 

 

 

 

 

 

ID(letter letter* )

letter = a|..|z|A|..|Z

 

if

-

int

*

return

/

void

<

while

<=

>

>=

==

!=

=

;

 

 

 

 

 

NUM(digit digit*)

digit = 0|..|9

 

,

(

)

[

]

{

}

/*

/*

 

 

  1. DFA:

①注释状态转换图:

②专用符号、ID、NUM状态转换图:

注意

关键字

除了数量减少以及关键词内容有所改变以外,关键字都是由字母小写构成,其中不添加其他符号,所以我们在关键字处理方式可以使用Tiny编译器的处理方式。

②专用符号

  1. tiny编译器的基础上,增添了有两个符号构成的符号,例如<=、>===、!=等,这需要在构建C-词法分析状态转换图时需要注意;
  2. <=是被当做小于等于而不是小于和等于两个词素的原因是我们默认遵循最长子串原则,其中具体构建方法见下一步。

③其他标记ID/NUM

NUM只包括数字、ID只包括大小写字母,且字母区分大小写。

④注释:

C-语言的注释前置符号和后置符号都又两个符号构成 ’/’ ’*’ ;处理该符号时需要注意。

 

  1. 代码实现:

工程结构

main.cpp   C-编译器的的主程序

scan.c 实现C-编译器的扫描功能

scan.h C-编译器的scan接口

①scan.h

定义了单词类型、状态转换图中的状态名称、输入文件路径、打印分析过程的标记,

声明了分析方法。

#ifndef SCAN_H_INCLUDED
#define SCAN_H_INCLUDED

#define MAXRESERVED 6
#define BUFLEN 256
#define MAXTOKENLEN 40

/**单词类型  */
typedef enum
{ENDFILE, ERROR,
    /** 保留字 */
    IF,ELSE,INT,RETURN,VOID,WHILE,
    /** 多字符单词的Token */
    ID,NUM,
    /** 特殊标记符 + - * / < > <= >= = ,  ; ( ) [ ] { } 注释符号左右 */
     ASSIGN,PLUS, MINUS, MULT, DIVI, LT, GT, LTE, GTE, DH, FH, EQ, NEQ, LSP, RSP,  LMP, RMP, LLP, RLP, LCOM, RCOM
} TokenType;

/** 状态名称*/
typedef enum    { START, INNUM, INID, INGTE, INLTE , INEQ, INNEQ, NILCOM, INCOMMENT, INLCOM, INRCOM, DONE  } StateType;



FILE* source; /** 源代码文件 */
FILE* listing; /** 输出文件 */
FILE* code; /* code text file for TM simulator */

/**************************************************/
/***********   Flags for tracing       ************/
/**************************************************/

/* EchoSource = TRUE causes the source program to
 * be echoed to the listing file with line numbers
 * during parsing
 */
int EchoSource;
/* TraceScan = TRUE causes token information to be
 * printed to the listing file as each token is
 * recognized by the scanner
 */
int TraceScan;


/*****************词法分析函数*****************************/
TokenType getToken(void);


#endif // SCAN_H_INCLUDED

 

scan.c

包含数据结构:

static struct

    { char* str;

      TokenType tok;

    } reservedWords[MAXRESERVED]

  用一个结构体类型来描述保留字,str代表保留字的值,tok代表保留字类型。

 

包含方法:

static TokenType reservedLookup (char* s)

查找某标识符是否为保留字,若为保留字则返回保留字类型

char isAlpha(char c)

判断c是否为字符

char isDigit(char c)

判断c是否为数字

static int getNextChar(void)

从输入缓冲中得到下一个字符

static void ungetNextChar(void)

在输入缓冲中回退一个字符

void printToken( TokenType token, const char* tokenString )

打印分析后的单词

TokenType getToken(void)

分析输入缓冲中的源代码,返回分析后的单词类型

 

getToken的代码:

/****************************************/
/** 扫描器的主要方法 */
/****************************************/
/** 返回缓冲行中下一要分析的字符
 */
TokenType getToken(void)
{  

   /* index for storing into tokenString */
   int tokenStringIndex = 0;
   /* holds current token to be returned */
   TokenType currentToken;
   /* current state - always begins at START */
   StateType state = START;
   /* flag to indicate save to tokenString */
   int save;
   while (state != DONE){
     int c = getNextChar();
     save = 1;
     switch (state)
     { case START:
         if (isDigit(c))
           state = INNUM;
         else if (isAlpha(c)){
           state = INID;
         }
         else if (c == '>')
           state = INGTE;
         else if (c == '<')
           state = INLTE;
         else if (c == '=')
           state = INEQ;
         else if (c == '!')
           state = INNEQ;
         else if ((c == ' ') || (c == '\t') || (c == '\n') || (c == 13) )
           save = 0;
         else if (c == '/'){ 
	   save = 0;
           state = INLCOM;
         }
         else
         { state = DONE;
           switch (c){ 
              case EOF:
               save = 0;
               currentToken = ENDFILE;
               break;
             case '+':
               currentToken = PLUS;
               break;
             case '-':
               currentToken = MINUS;
               break;
             case '*':
               currentToken = MULT;
               break;
             case ',':
               currentToken = DH;
               break;
             case ';':
               currentToken = FH;
               break;
             case '(':
               currentToken = LSP;
               break;
             case ')':
               currentToken = RSP;
               break;
             case '[':
               currentToken = LMP;
               break;
             case ']':
               currentToken = RMP;
               break;
             case '{':
               currentToken = LLP;
               break;
             case '}':
               currentToken = RLP;
               break;
             default:
               currentToken = ERROR;
               Error = 1;
               break;
           }
         }
         break;
       case INLCOM://!    '/'
         if (c =='*'){//!  "/*"组合出现,表示注释,此时字符串不保存
            state = INCOMMENT;
            save = 0;
         }
         else{
            state = DONE;
            ungetNextChar();//!如果没有配对成功,表示为DIVI除法运算符号,并返回上一个符号
            currentToken = DIVI;
         }
         break;
       case INCOMMENT://!注释
         if (c == '*')
           state = INRCOM;
         break;
       case INRCOM://!可能为右注释
         if (c == '/'){//!注释结束
            state = DONE;
         }
         else//!否则返回注释状态
            state = INCOMMENT;
         break;
       case INID:
         if (!isAlpha(c))
         {
           ungetNextChar();
           save = 0;//!最后一个字符不重复保存
           state = DONE;
           currentToken = ID;
         }
         break;
       case INNUM:
         if (!isDigit(c))
         {
           ungetNextChar();
           save = 0;//!最后一个字符不重复保存
           state = DONE;
           currentToken = NUM;
         }
         break;
       case INGTE:
        if (c == '='){// >=
            state = DONE;
            currentToken = GTE;
         }
         else{
            state = DONE;
            ungetNextChar();//!如果没有配对成功,则是>
            currentToken = GT;
         }
         break;
       case INLTE:
        if (c == '='){// <=
            state = DONE;
            currentToken = LTE;
         }
         else{
            state = DONE;
            ungetNextChar();//!如果没有配对成功,表示为DIVI除法,并返回上一个符号
            currentToken = LT;
         }
         break;
       case INEQ:
        if (c == '='){// ==
            state = DONE;
            currentToken = EQ;
         }
         else{
            state = DONE;
            ungetNextChar();//!如果没有配对成功则为=
            currentToken = ASSIGN;
         }
         break;
       case INNEQ:
        if (c == '='){//! !=
            state = DONE;
            currentToken = NEQ;
         }
         else{//!不合法
            fprintf(listing,"Scanner Bug: state= %d\n",state);
            state = DONE;
            save = 0;
            ungetNextChar();//!如果没有配对成功,则单个字符!不合法ERROR
            currentToken = ERROR;
            Error = 1;
         }
         break;
       case DONE:break;
       default: /* should never happen */
         fprintf(listing,"Scanner Bug: state= %d\n",state);
         state = DONE;
         currentToken = ERROR;
         Error = 1;
         break;
     }
     if ((save) && (tokenStringIndex <= MAXTOKENLEN))
       tokenString[tokenStringIndex++] = (char) c;
     if (state == DONE){
            tokenString[tokenStringIndex] = '\0';
            if (currentToken == ID)//! 如果是标识符则判断是否为保留字(查表)
                currentToken = reservedLookup(tokenString);
     }
   }

  // if (TraceScan) {
     fprintf(listing,"\t%d: ",lineno);
     printToken(currentToken,tokenString);
  // }
   return currentToken;
} /* end getToken */

 ③main.c主函数

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "scan.h"
int main(int argc, char * argv[] )
{
    char pgm[120]; /* source code file name */
    if (argc != 2)
    { fprintf(stderr,"usage: %s <filename>\n",argv[0]);
      return 0;
    }
    strcpy(pgm,argv[1]) ;
    source = fopen(pgm,"r");
    if (source==NULL){
        fprintf(stderr,"File %s not found\n",pgm);
        return 0;
    }
    listing = stdout; /**输出结果到屏幕 */
    fprintf(listing,"\nC- COMPILATION: %s\n",pgm);
    while (getToken()!=ENDFILE);
    return 0;
}

 

  1. 测试

①正例:

②反例(其中!和float是没有定义的专用符号或关键字)

  • 总结与心得

1.总结

实现词法分析设计的主要工作:

(1)从源程序文件中读入字符。

(2)统计行数和列数用于错误单词的定位。

(3)删除空格类字符,包括回车、制表符空格。

(4)按拼写单词,并用(内码,属性)二元式表示。(属性值——token 的机内表示)

(5)如果发现错误则报告出错

2.心得

(1)本次实验最主要的是通过对源代码进行分析得到一个个的单词,通过编程实现后对词法分析这一过程更加的熟悉了。

(2)实验过程中第一个问题是源代码的输入。解决方式:利用文本文件txt以字符串的形式存储代码,利用fgets等c语言函数进行代码的逐行读取,并分析。

(3)实验过程分析出“注释”后,打印时打印出“Unknown token”和toekn值,后来改成了打印“Unknown token”和toeknString,也就是其值

(4)实验中回车(13)一开始没有处理,导致识别出ERROR,但是也打印不出来,这里花费的时间比较多,后来把回车和空格,换行符,制表符在一起进行判断,并将save置为0,不保存该字符。

(5)输入源代码样式有待进一步测试

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译原理实验一(C-语言词法分析器的编写C语言版本) 的相关文章

  • 华为OD机试真题-文本统计分析-2023年OD统一考试(C卷)

    题目描述 有一个文件 包含以一定规则写作的文本 请统计文件中包含的文本数量 规则如下 1 文本以 分隔 最后一条可以没有 但空文本不能算语句 比如 COMMAND A 只能算一条语句 注意 无字符 空白字符 制表符都算作 空 文本 2 文本
  • 特殊类设计

    1 请设计一个类 不能被拷贝 拷贝只会放生在两个场景中 拷贝构造函数 和 赋值运算符重载 c 98 将拷贝构造函数与赋值运算符重载 只声明不定义 并且将其访问权限设置为私有 即可 class Copyban Copyban const Co
  • 华为OD机试真题-查找一个有向网络的头节点和尾节点-2023年OD统一考试(C卷)

    题目描述 给定一个有向图 图中可能包含有环 图使用二维矩阵表示 每一行的第一列表示起始节点 第二列表示终止节点 如 0 1 表示从0到1的路径 每个节点用正整数表示 求这个数据的首节点与尾节点 题目给的用例会是一个首节点 但可能存在多个尾节
  • 每日一练2023.12.16——吃火锅【PTA】

    题目链接 L1 070 吃火锅 题目要求 以上图片来自微信朋友圈 这种天气你有什么破事打电话给我基本没用 但是如果你说 吃火锅 那就厉害了 我们的故事就开始了 本题要求你实现一个程序 自动检查你朋友给你发来的信息里有没有 chi1 huo3
  • 【数据结构】双链表的定义和操作

    目录 1 双链表的定义 2 双链表的创建和初始化 3 双链表的插入节点操作 4 双链表的删除节点操作 5 双链表的查找节点操作 6 双链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • C语言入门引导

    第一章 概述 第一节 引例 第二节 C语言的基本字符与关键字 第三节 算法及其表示 第二章 数据类型 运算符与表达式 第一节 C语言的数据类型 第二节 常量与变量 第三节 运算符与表达式 第四节 数据类型转换 第三章 顺序结构与程序设计 第
  • 【华为OD机考 统一考试机试C卷】高效货运(C++ Java JavaScript Python)

    华为OD机考 统一考试 C卷 D卷 B卷 A卷 2023年11月份 华为官方已经将 华为OD机考 OD统一考试 A卷 B卷 切换到 OD统一考试 C卷 和 OD统一考试 D卷 根据考友反馈 目前抽到的试卷为B卷或C卷 D卷 其中C卷居多 按
  • C语言,scanf出错时,重新输入

    问题的关键在于 把stdin中剩余的字符 吃掉 才能正常地进行下次输入 scanf出错后重新输入 使用 n 清空错误的字符 include
  • [补题记录] Educational Codeforces Round 160 (Rated for Div. 2)(A~C)

    URL https codeforces com contest 1913 problem D 目录 A Problem 题意 Thought 思路 Code 代码 B Problem 题意 Thought 思路 Code 代码 C Pro
  • C/C++编程中的算法实现技巧与案例分析

    C C 编程语言因其高效 灵活和底层的特性 被广大开发者用于实现各种复杂算法 本文将通过10个具体的算法案例 详细探讨C C 在算法实现中的技巧和应用 一 冒泡排序 Bubble Sort 冒泡排序 Bubble Sort 是一种简单的排序
  • VScode配置mingw C语言环境变量

    C语言IDE VScode VScode是个人比较喜欢的一款IDE软件 鄙人曾同时在VScode软件中运行三个终端 开发Python Golang和C语言 下载地址如下 code visualstudio com VScode配置mingw
  • C 库函数 - gmtime()

    描述 C 库函数 struct tm gmtime const time t timer 使用 timer 的值来填充 tm 结构 并用协调世界时 UTC 也被称为格林尼治标准时间 GMT 表示 声明 下面是 gmtime 函数的声明 st
  • C 库函数 - mktime()

    描述 C 库函数 time t mktime struct tm timeptr 把 timeptr 所指向的结构转换为自 1970 年 1 月 1 日以来持续时间的秒数 发生错误时返回 1 声明 下面是 mktime 函数的声明 time
  • C++基础-一维和二维数组详解

    目录 定义 一维数组 二维数组 定义 数组是相同类型的对象序列 它们占据一块连续的内存区 一维数组
  • C/C++编程:令人印象深刻的高级技巧案例

    C C 编程语言在软件开发领域有着悠久的历史 由于其高效 灵活和底层访问能力 至今仍然被广泛应用 本文将介绍一些在C C 编程中令人印象深刻的高级技巧 帮助读者提升编程水平 更加高效地使用这两种强大的编程语言 一 指针运算与内存管理 C C
  • 《妙趣横生的算法》(C语言实现)- 第6章 数学趣题(二)

    6 1 连续整数固定和问题 找出任意输入的整数n的全部的连续整数固定和 题目分析 至少要找出两个连续整数的固定和 一个整数的话就是本身了呢 那如何确定这些连续整数呢 想明白了 第一个整数设为a 第二个整数是a 1 假设有m个连续整数 那么第
  • 串口流控(CTS/RTS)使用详解

    1 流控概念 在两个设备正常通信时 由于处理速度不同 就存在这样一个问题 有的快 有的慢 在某些情况下 就可能导致丢失数据的情况 如台式机与单片机之间的通讯 接收端数据缓冲区已满 则此时继续发送来的数据就会丢失 流控制能解决这个问题 当接收
  • CMake 教程

    这篇文章主要介绍 CMake 的使用 看完这篇文章后 CMake 的绝大多数使用方法你都能掌握 本篇文章采用循序渐进的方法带你一步步逐渐进阶 CMake 通过多个示例 告诉你如何使用 CMake 解决常见的构建系统问题 各位爱学习的朋友 收
  • C语言——!(--x)和!(-x)以及while(!(--x)) 和 while(!(-x))

    一 x 和 x 1 x 这个表达式表示先对变量 x 执行自减操作 即 x 的值减去 1 然后对自减后得到的结果取逻辑非 如果自减后的 x 等于 0 则逻辑非运算的结果为真 值为 1 否则结果为假 值为 0 2 x 这个表达式表示对 x 取反
  • 华为OD机试真题-API集群负载统计-Java-OD统一考试(C卷)

    题目描述 某个产品的RESTful API集合部署在服务器集群的多个节点上 近期对客户端访问日志进行了采集 需要统计各个API的访问频次 根据热点信息在服务器节点之间做负载均衡 现在需要实现热点信息统计查询功能 RESTful API的由多

随机推荐

  • Java学习心得10——多态

    多态 一种类型的变量可以掌管多种类型的对象 这就是多态 说人话 直观理解成多种形态 人类就是多态的 黄种人 白种人 黑种人都是属于人类 人类这一个类可以表示黄种人 白种人 黑种人这三个类 这不就是多态多种形态吗 回到编程 Animal 动物
  • 【华为OD机试真题 python】数字加减游戏【2022 Q4

    题目描述 数字加减游戏 小明在玩一个数字加减游戏 只使用加法或者减法 将一个数字s变成数字t 在每个回合中 小明可以用当前的数字加上或减去一个数字 现在有两种数字可以用来加减 分别为a b a b 其中b没有使用次数限制 请问小明最少可以用
  • 第四章 Flume专题-日志采集工具

    一 Flume专题之组件及架构介绍 1 Flume概述 1 1 Flume定义 Flume是一种分布式的 高可靠的和高可用的服务 用于有效地收集 聚合和移动大量日志数据框架 Flume是一个简单灵活的基于流数据的体系结构 1 2 Flume
  • Delphi ListView 的用法

    Delphi ListView 的用法 常用技巧 增加 i ListView1 Items Count with ListView1 do begin ListItem Items Add ListItem Caption IntToStr
  • Vite搭建react+ts项目

    创建一个react项目 首先需要打开终端 进行vite的引入 yarn create vite 使用react模板创建项目 yarn create vite react test template react cd react test y
  • Float与二进制之间的转化(Java实现)

    在线转化 http www binaryconvert com 2 3 import java text DecimalFormat 4 5 6 public class SinglePrecision 7 8 浮点到二进制 9 publi
  • 采用通信方式控制台达B2伺服驱动器运行在速度模式

    目录 前言 一 伺服驱动器恢复出厂设置 二 伺服驱动器设置为速度模式 三 关闭告警信息 四 通讯功能设置 五 采用通信功能控制伺服驱动器按速度模式运行 总结 前言 最近 使用台达B2伺服驱动器做项目 项目中用伺服电机的速度模式驱动一个螺杆按
  • Linux笔记--查看Linux系统自动Kill掉的进程

    目录 1 前言 2 查看系统日志 3 参考 1 前言 今天在服务器训练一个模型 程序无任何错误 但一段时间后挂在后台的进程莫名被Kill掉 原因在于服务器 linux 系统的运行内存不足 为了避免系统奔溃 系统主动 kill 内存占用最大的
  • Python项目创建(Pycharm程序)

    点击 新建项目 创建一个新的项目 这一步重点在Python解释器的选择 一个是新建虚拟环境 另一个是使用已有环境 使用此工具新建环境 Virtualenv 新建后在项目根目录下会出现 venv 的文件夹 相当于把Python解释器复制过去一
  • RANSAC算法实现 + 直线拟合

    一 RANSAC算法 1 参考资料 1 题目来源与解析 商汤科技SLAM算法岗的RANSAC编程题 2 牛客网题目 编程题 线性回归 3 牛客网解答参考 商汤科技某算法岗的编程题有点过分了啊 4 RANSAC算法原理 RANSAC翻译 经典
  • TOPIAM 社区版 1.0.0 发布,开源 IAM/IDaaS 企业身份管理平台

    文章目录 产品概述 系统架构 功能列表 管理端 门户端 技术架构 后续规划 相关地址 Hi 亲爱的朋友们 今天是传统 24 节气中的立秋 秋天是禾谷成熟 收获的季节 经过长时间优化和迭代 TOPIAM 企业身份管控平台也迎来了当下的成长和收
  • [Redis]-四种部署方式

    森格 2022年11月 本文是对Redis部署方式的学习 主要学习基本原理 以及几种方式的优缺点 一 部署方式概况 对于Redis的安装部署主要可以分为单机版 主从同步 Sentinel哨兵 Cluster集群部署四种方式 下面一起看下几种
  • AutoCAD 2022 for Mac v2022(24.1.50.899)中文版介绍

    CAD2022 Mac是一款针对苹果电脑打造的CAD设计软件 用于二维绘图 详细绘制 设计文档和基本三维设计 广泛应用于机械设计 工业制图 工程制图 土木建筑 装饰装潢 服装加工等多个行业领域 CAD2022新特征 改进了桌面 Web和移动
  • 一个全网最详细的Python教程,不信你来学一学!2023Python入门教程完整版,无偿分享

    近几年 编程越来越火 网上也是铺天盖地的免费教程 中小学生都开始投入到学习中 编程学习从娃娃抓起 甚至有些小学生都做起了 UP 主 教大家学编程 PS 我落下了柠檬的眼泪 小小年纪就学得一手好编程 光从编程的难易度来说 Python 简单
  • IDEA进行了Pull操作,Merge时选择了他们的优先,但自己的代码没有Push导致自己未提交的代码没了,头脑发热我差点哭出来解决方案

    IDEA进行了Pull操作 Merge时选择了他们的优先 但自己的代码没有Push导致自己未提交的代码没了 头脑发热我差点哭出来解决方案 问题背景 解决方案 心得 Lyric 沉默是因为包容 问题背景 我和胖哥同时在一个项目里面开发 我让他
  • 华为OD机试 - 判断字符串子序列(Java)

    题目描述 给定字符串 target和 source 判断 target是否为 source 的子序列 你可以认为target和 source 中仅包含英文小写字母 字符串 source 可能会很长 长度 500 000 而 target是个
  • python笔记(爬虫 微爬取微信信息)

    views py import time import json import re import requests from bs4 import BeautifulSoup from flask import Blueprint ren
  • DevExpress ASP.NET GridView在Edit时弹出新窗体

    1 设置setting editing属性 选择PopupEditForm 2 如果在源代码中设置的话 如下
  • 机器学习入门教学——梯度下降、梯度上升

    1 简介 梯度表示某一函数在该点处的方向导数沿着该方向取得最大值 即函数在该点处沿着该方向 梯度的方向 变化最快 变化率 梯度的模 最大 可理解为导数 梯度上升和梯度下降是优化算法中常用的两种方法 主要目的是通过迭代找到目标函数的最大值和最
  • 编译原理实验一(C-语言词法分析器的编写C语言版本)

    编译原理实验一 C 语言词法分析器的编写C语言版本 一 tiny词法分析程序源代码阅读笔记 重要变量和函数 变量和函数 A 要计算的唯一特性是词法或是被识别的记号的串值 变量t o k e n S t r i n g B 扫描程序使用3个全