Codeforces Round 1030

【1/7】Codeforces Round 1030 (Div. 2)

【1/7】Codeforces Round 1030 (Div. 2)_哔哩哔哩_bilibili

【赛时4+1题】Codeforces Round 1030 (Div. 2)

【赛时4+1题】Codeforces Round 1030 (Div. 2)_哔哩哔哩_bilibili

Codeforces Round 1030 (Div. 2) solve 3 题

Codeforces Round 1030 (Div. 2) solve 3 题_哔哩哔哩_bilibili

Codeforces Round 1030 (Div. 2)solve 3

Codeforces Round 1030 (Div. 2)solve 3_哔哩哔哩_bilibili

Codeforces Round 1030 (Div. 2)A~D2,做出D2感觉有点超常发挥啊嘿嘿

Codeforces Round 1030 (Div. 2)A~D2,做出D2感觉有点超常发挥啊嘿嘿_哔哩哔哩_bilibili

Codeforces Round 1031 (Div. 2) A-D-优快云博客







(ABC,D感觉完全不懂)Codeforces Round 1030 (Div. 2)

(ABC,D感觉完全不懂)Codeforces Round 1030 (Div. 2)_哔哩哔哩_bilibili

Codeforces Round 1030 (Div. 2)

Codeforces Round 1030 (Div. 2)_哔哩哔哩_bilibili

Codeforces Round 1030 (Div. 2)_哔哩哔哩_bilibili

https://zhuanlan.zhihu.com/p/1918835630957364890

【手慢4题】Codeforces Round 1030 (Div. 2)

【手慢4题】Codeforces Round 1030 (Div. 2)_哔哩哔哩_bilibili

Codeforces Round 1030 (div2) 经典不会读题压哨过E

Codeforces Round 1030 (div2) 经典不会读题压哨过E_哔哩哔哩_bilibili

Codeforces Round 1030 (Div. 2) 「最有水平的一集」

Codeforces Round 1030 (Div. 2) 「最有水平的一集」_哔哩哔哩_bilibili







Codeforces Round 1030 (Div. 2) A~D1 思路代码讲解

Codeforces Round 1030 (Div. 2) A~D1 思路代码讲解_哔哩哔哩_bilibili

Codeforces Round 1030 (Div. 2) 题目讲解 ABCD1D2 (CF2118)

Codeforces Round 1030 (Div. 2) 题目讲解 ABCD1D2 (CF2118)_哔哩哔哩_bilibili

codeforces round 1030(div2) A~E讲解

codeforces round 1030(div2) A~E讲解_哔哩哔哩_bilibili

Rock Paper Scissors (CodeForces - 103117D)

Rock Paper Scissors (CodeForces - 103117D)_codeforces round 1031-优快云博客

Codeforces Round 1031 (Div. 2)题解(原创)

https://zhuanlan.zhihu.com/p/1917698259767498032

Codeforces Round 1031 (Div. 2) 题解-优快云博客




 




AtCoder Beginner Contest 131-166

AtCoder Beginner Contest 131-166-优快云博客

AtCoder Beginner Contest 167-200

AtCoder Beginner Contest 167-200-优快云博客

AtCoder Beginner Contest 201-230

AtCoder Beginner Contest 201-230-优快云博客

AtCoder Beginner Contest 231-260

AtCoder Beginner Contest 231-260-优快云博客

AtCoder Beginner Contest 261-290

AtCoder Beginner Contest 261-290-优快云博客

AtCoder Beginner Contest 271-305

AtCoder Beginner Contest 271-305-优快云博客




AtCoder Beginner Contest 306-335

AtCoder Beginner Contest 306-335-优快云博客

AtCoder Beginner Contest 311--330

AtCoder Beginner Contest 311--330-优快云博客

AtCoder Beginner Contest 317-332

AtCoder Beginner Contest 317-332-优快云博客

AtCoder Beginner Contest 333-362

AtCoder Beginner Contest 333-362-优快云博客

AtCoder Beginner Contest 131-366

AtCoder Beginner Contest 131-366-优快云博客







AtCoder Beginner Contest 367

AtCoder Beginner Contest 367-优快云博客

AtCoder Beginner Contest 368

AtCoder Beginner Contest 368-优快云博客

AtCoder Beginner Contest 369

AtCoder Beginner Contest 369-优快云博客

AtCoder Beginner Contest 370

AtCoder Beginner Contest 370-优快云博客







AtCoder Beginner Contest 371

AtCoder Beginner Contest 371-优快云博客

AtCoder Beginner Contest 372

AtCoder Beginner Contest 372-优快云博客

AtCoder Beginner Contest 373

AtCoder Beginner Contest 373-优快云博客

AtCoder Beginner Contest 374

AtCoder Beginner Contest 374-优快云博客

AtCoder Beginner Contest 375

AtCoder Beginner Contest 375-优快云博客







AtCoder Beginner Contest 376

AtCoder Beginner Contest 376-优快云博客

AtCoder Beginner Contest 377

AtCoder Beginner Contest 377-优快云博客

AtCoder Beginner Contest 378

AtCoder Beginner Contest 378-优快云博客

AtCoder Beginner Contest 379

AtCoder Beginner Contest 379-优快云博客

AtCoder Beginner Contest 380

AtCoder Beginner Contest 380-优快云博客







AtCoder Beginner Contest 381

AtCoder Beginner Contest 381-优快云博客

AtCoder Beginner Contest 382

AtCoder Beginner Contest 382-优快云博客

AtCoder Beginner Contest 383

AtCoder Beginner Contest 383-优快云博客

AtCoder Beginner Contest 384

AtCoder Beginner Contest 384-优快云博客

AtCoder Beginner Contest 385

AtCoder Beginner Contest 385-优快云博客







AtCoder Beginner Contest 386

AtCoder Beginner Contest 386-优快云博客

AtCoder Beginner Contest 387

AtCoder Beginner Contest 387-优快云博客

AtCoder Beginner Contest 388

AtCoder Beginner Contest 388-优快云博客

AtCoder Beginner Contest 389

AtCoder Beginner Contest 389-优快云博客

AtCoder Beginner Contest 390

AtCoder Beginner Contest 390-优快云博客







AtCoder Beginner Contest 391

AtCoder Beginner Contest 391-优快云博客

AtCoder Beginner Contest 392

AtCoder Beginner Contest 392-优快云博客

AtCoder Beginner Contest 393

AtCoder Beginner Contest 393-优快云博客

AtCoder Beginner Contest 394

https://blog.youkuaiyun.com/dllglvzhenfeng/article/details/148765572

AtCoder Beginner Contest 395

https://blog.youkuaiyun.com/dllglvzhenfeng/article/details/148764300







AtCoder Beginner Contest 396

https://blog.youkuaiyun.com/dllglvzhenfeng/article/details/148762089

AtCoder Beginner Contest 397

AtCoder Beginner Contest 397-优快云博客

AtCoder Beginner Contest 398

AtCoder Beginner Contest 398-优快云博客

AtCoder Beginner Contest 399

AtCoder Beginner Contest 399-优快云博客

AtCoder Beginner Contest 400

AtCoder Beginner Contest 400-优快云博客







AtCoder Beginner Contest 401

AtCoder Beginner Contest 401-优快云博客

AtCoder Beginner Contest 402

AtCoder Beginner Contest 402-优快云博客

AtCoder Beginner Contest 403

AtCoder Beginner Contest 403-优快云博客

AtCoder Beginner Contest 404

AtCoder Beginner Contest 404-优快云博客

AtCoder Beginner Contest 405

AtCoder Beginner Contest 405-优快云博客







AtCoder Beginner Contest 406

AtCoder Beginner Contest 406-优快云博客

AtCoder Beginner Contest 407

AtCoder Beginner Contest 407-优快云博客

AtCoder Beginner Contest 408

https://blog.youkuaiyun.com/dllglvzhenfeng/article/details/148713302

AtCoder Beginner Contest 409

AtCoder Beginner Contest 409-优快云博客

AtCoder Beginner Contest 410

AtCoder Beginner Contest 410-优快云博客







Codeforces Round 881-930

Codeforces Round 881-930-优快云博客

Codeforces Round 931-960

Codeforces(931-960)-优快云博客

Codeforces Round 951-1000

Codeforces(951-1000)-优快云博客

Codeforces Round 881-1000

Codeforces Round 881-1000-优快云博客







Codeforces Round 1001

Codeforces Round 1001-优快云博客

Codeforces Round 1002

Codeforces Round 1002-优快云博客

Codeforces Round 1003

https://blog.youkuaiyun.com/dllglvzhenfeng/article/details/148784241

Codeforces Round 1004

https://blog.youkuaiyun.com/dllglvzhenfeng/article/details/148809220

Codeforces Round 1005

https://blog.youkuaiyun.com/dllglvzhenfeng/article/details/148809945

Codeforces Round 1006

Codeforces Round 1006-优快云博客

Codeforces Round 1007

Codeforces Round 1007-优快云博客




 

#include<stdio.h> #include<string.h> #include<stdlib.h> #define Maxline 1024 //-----全局变量------ char keyword[][10] = { “auto”,“bool”,“break”,“case”,“char”,“const”,“continue”,“default”,“do” ,“double”,“else”,“enum”,“extern”,“float”,“for”,“goto”,“if”,“int”,“long”,“main”,“register”,“return” ,“short”,“signed”,“sizeof”,“static”,“struct”,“switch”,“typedef”,“union”,“unsigned”,“void”,“volatile” ,“while”,“scanf”,“printf”,“include”,“define” }; //38个保留字(关键字) char delimiter[][10] = { “(”,“)”,“[”,“]”,“{”,“}”,“.”,“,”,“;”,“'”,“#”,“?”,‘"’, };//13个界符 char calculation[][10] = { “[+]”,“[-]”,“[]“,”[/]“,”[%]“,”[++]“,”[–]“,”[==]“,”[!=]“,”[>]“,”[<]“,”[>=]" ,“[<=]”,“[&&]”,“[||]”,“[!]”,“[=]”,“[+=]”,“[-=]”,"[=]”,“[/=]”,“[%=]”,“[&=]”,“=”,“[|=]”,“[&]”,“[|]” ,“”,“[~]”,“[<<]”,“[>>]”};//31个运算符 int nk = 38, nd = 13, nc = 31;//分别表示关键字、界符、运算符的个数 //下面分别是关键字、界符、运算符、整型、浮点数和标识符在单词表中的偏移量 int ck = 1, cd = 70, cc = 39, ci = 83, cf = 84, cn = 85; //------函数声明------ bool pd_integer(char ch); //判断是否是整数 bool pd_character(char ch); //判断是否是字母 int pd_keyword(char s[]); //判断字符串是否是保留字(关键字)是则返回下标,否则返回-1 int pd_delimiter(char ch); //判断字符是否是界符,是返回下标,否则返回-1 int pd_calculation(char s[]); //判断字符串是否是运算符,是返回下标,否则返回-1 char* pd_spcode(int n); //根据种别码的范围判断类别 int search_spcode(char s[]); //查询字符串s的种别码 //------主函数------ int main() { char test[1030] = { 0 }; FILE* fp = fopen(“test.txt”, “r”); if (fp == NULL) { printf(“打开文件失败!\n”); return 0; } while (fgets(test, Maxline, fp) != NULL) { int i = 0, j = 0; while (i < strlen(test)) { if (test[i] == ’ ’ || test[i] == ‘\n’ || test[i] == ‘\t’) { i++; continue;//遇到空格或换行符,跳过 } bool flag = true; char str[100] = { 0 }; j = 0; if (pd_integer(test[i])) { //如果是数字,循环读取,包括小数点,因为可能是浮点数 while (pd_integer(test[i]) || (test[i] == ‘.’ && flag)) { if (test[i] == ‘.’)flag = false;//浮点型只允许出现一个小数点 str[j++] = test[i++]; } i–; } else if (pd_character(test[i]) || test[i] == ‘') { //如果是字母或下划线或数字(标识符可以有数字) while (pd_character(test[i]) || test[i] == '’ || pd_integer(test[i]))str[j++] = test[i++]; i–; } else if (test[i] == ‘+’ || test[i] == ‘-’ || test[i] == ‘*’ || test[i] == ‘/’ || test[i] == ‘%’ || test[i] == ‘=’ || test[i] == ‘!’ || test[i] == ‘>’ || test[i] == ‘<’ || test[i] == ‘&’ || test[i] == ‘|’ || test[i] == ‘^’) { if (test[i + 1] == '=' || test[i] == test[i + 1]) { str[0] = test[i], str[1] = test[i + 1]; i++; } else { str[0] = test[i]; } } else { str[0] = test[i]; } i++; printf("( %s , %d )------%s\n", str, search_spcode(str), pd_spcode(search_spcode(str))); } } return 0; } //------函数实现------ bool pd_integer(char ch) {//判断是否是整数 if (ch >= ‘0’ && ch <= ‘9’)return true; return false; } bool pd_character(char ch) {//判断是否是字母 if ((ch >= ‘a’ && ch <= ‘z’) || (ch >= ‘A’ && ch <= ‘Z’))return true; return false; } int pd_keyword(char s[]) {//判断字符串是否是保留字(关键字)是则返回下标,否则返回-1 for (int i = 0; i < nk; i++) if (strcmp(s, keyword[i]) == 0)return i; return -1; } int pd_delimiter(char ch) {//判断字符是否是界符,是返回下标,否则返回-1 for (int i = 0; i < nd; i++) if (ch == delimiter[i][0])return i; return -1; } int pd_calculation(char s[]) {//判断字符是否是运算符,是返回下标,否则返回-1 for (int i = 0; i < nc; i++) { if (strlen(calculation[i]) - 2 == strlen(s)) {//如果长度相等 bool flag = true; for (int j = 1, k = 0; j < strlen(calculation[i]) - 1 && k < strlen(s); j++, k++) if (calculation[i][j] != s[k]) { flag = false;//有一个元素不等,标记后直接退出 break; } if (flag)return i;//返回下标 } } return -1; }
03-11
<think>好的,我现在需要分析用户提供的C语言代码,并给出详细的解释。用户之前询问过关于`pd_keyword`函数的代码,现在提供了完整的词法分析器代码,希望我进行解释。我需要先仔细阅读代码,理解各个部分的功能,然后组织成结构化的解释。 首先,观察到代码包括头文件、宏定义、全局变量、函数声明和主函数。这是一个词法分析器的实现,用于将输入的源代码分解成不同的词法单元(tokens),如关键字、运算符、界符、标识符等。 接下来,我需要检查全局变量部分。用户定义了关键字、界符、运算符的数组,以及它们的数量。需要注意的是,代码中的字符串可能存在中文引号问题,例如“auto”应该使用英文双引号。此外,运算符数组中的某些条目可能有拼写错误或格式问题,比如“[–]”可能应该是“--”,或者存在多余的方括号。这些细节可能会影响代码的正确性,需要在解释中提及。 然后是函数声明部分,包括判断整数、字符、关键字、界符、运算符的函数,以及种别码查询函数。主函数中读取文件内容,逐字符分析,生成词法单元。主函数的逻辑大致分为处理空格换行符、数字(包括浮点数)、标识符、运算符等部分,需要逐步解释每个条件分支的处理流程。 在分析主函数时,用户可能遇到一些问题,例如`i--`的作用,可能是为了调整索引,因为在循环中`i`会被递增,但某些情况下需要回退。另外,处理运算符的部分,特别是多字符运算符(如“+=”或“==”)需要检查下一个字符,这部分的逻辑需要详细说明。 函数实现部分,如`pd_calculation`中的运算符匹配,代码中使用了`strlen(calculation[i]) - 2`,这可能是因为运算符被包裹在方括号中,例如“[+]”实际存储为三个字符,所以取中间的部分进行比较。这里需要指出这种设计可能带来的问题,比如是否容易出错,或者是否有更好的处理方式。 此外,种别码的偏移量(ck=1, cd=70等)用于区分不同类别的词法单元,需要解释每个偏移量的意义,以及如何通过`search_spcode`和`pd_spcode`函数确定种别码和类别名称。 最后,需要指出代码中存在的潜在问题,如全局变量的使用、中文字符导致的编译错误、运算符定义中的错误,以及可能的逻辑错误(如浮点数处理中的flag变量是否正确使用)。同时,可以提出优化建议,比如使用哈希表提高查找效率,或者改进字符串处理方式。 总结时,要强调这段代码是一个基础的词法分析器,但存在一些需要修正的问题,并建议用户检查语法错误和逻辑漏洞,确保在实际环境中能够正确运行。</think>以下是对代码的逐层解析: --- ### 一、代码整体结构 这是一个**C语言实现的简易词法分析器**,核心功能是将源代码文件解析为带种别码的单词序列。代码包含: - **全局定义**:关键字符号表、种别码偏移量 - **核心函数**:字符类型判断、符号匹配、种别码查询 - **主流程**:文件读取->字符流扫描->词法单元生成 --- ### 二、关键数据结构 #### 1. 符号表定义 ```c char keyword[][10] = {"auto","bool"...}; //38个关键字 char delimiter[][10] = {"(",")"...}; //13个界符 char calculation[][10] = {"[+]","[-]"...};//31个运算符(含特殊格式) ``` - **存储方式**:二维数组静态存储 - **特殊设计**:运算符用`[符号]`包裹(如`[+]`),需特殊处理匹配 #### 2. 种别码体系 | 类别 | 起始种别码 | 说明 | |------------|------------|--------------------------| | 关键字 | 1 (ck=1) | 直接使用数组下标+偏移量 | | 运算符 | 39 (cc=39) | | | 界符 | 70 (cd=70) | | | 整型 | 83 (ci=83) | | | 浮点型 | 84 (cf=84) | | | 标识符 | 85 (cn=85) | | --- ### 三、核心函数解析 #### 1. 主函数流程 ```c while(fgets(...)){ //逐行读取文件 while(i < strlen(test)){ // 处理空格/换行符 if(遇到空格类字符) continue; // 数字/浮点数识别 if(pd_integer(...)){ while(数字或小数点){ str[j++] = test[i++]; if(遇到小数点) flag=false; } i--; //回退一个字符 } // 标识符识别 else if(字母/下划线开头){ while(字母/数字/下划线)... } // 运算符识别 else if(运算符首字符){ 处理双字符运算符(如+=, ==) } // 输出词法单元 printf("( %s , %d )...", str, 种别码); } } ``` #### 2. 运算符匹配函数 `pd_calculation()` ```c for(遍历运算符表){ if(存储格式长度-2 == 输入字符串长度){ // 对比中间有效字符 for(逐个字符比对){ if(不匹配) break; } if(完全匹配) return 下标; } } ``` **特殊处理**:运算符存储为`[符号]`格式,实际比较时需要: $$有效长度 = strlen(calculation[i]) - 2$$ --- ### 四、关键问题说明 #### 1. 现存缺陷 - **符号表格式问题**: ```c // 错误示例 “[–]” // 应为"--" "“auto”" // 使用了中文引号 ``` - **浮点数识别缺陷**: ```c while(pd_integer(...) || (. && flag)) // 无法处理".123"或"123."这类非标准格式 ``` - **运算符逻辑缺陷**: ```c if(test[i+1] == '=' || test[i] == test[i+1]) // 未覆盖所有多字符运算符(如<<, >>) ``` #### 2. 设计建议 - 使用**状态机**重构字符扫描逻辑 - 将符号表改为结构体数组,包含符号内容和种别码 - 增加**错误处理**机制(如非法字符识别) --- ### 五、运行示意图 ``` 输入:int a = 123 + 456; 输出: ( int , 17 )------关键字 ( a , 85 )------标识符 ( = , 61 )------运算符 ( 123 , 83 )------整型 ( + , 39 )------运算符 ( 456 , 83 )------整型 ( ; , 79 )------界符 ``` --- ### 六、扩展改进方向 1. **性能优化**: - 使用**哈希表**存储符号表(时间复杂度从$O(n)$降为$O(1)$) - 预编译符号表为**字典树结构** 2. **功能增强**: ```c // 增加注释处理 if(test[i] == '/' && test[i+1] == '/') 跳过整行 // 支持科学计数法 1.23e+5 → (1.23e+5, 84) ``` 3. **工程化建议**: - 将符号表独立为头文件 - 添加详细的错误位置报告 - 支持Unicode字符集 该代码展现了词法分析器的核心原理,可作为学习编译原理的实践起点,但需完善后才能用于实际项目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dllglvzhenfeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值