项目地址:
https://github.com/yuesong-feng/lexical-analyzer

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<ctype.h>
#include<string.h>
typedef enum { START, INNUM, INID, INEQ, INNEQ, INLE, INRE, INLS, INCMT, ENDCMT, DONE }StateType;
void Save(char c,char *buf){for (int i = 0; i < 100; i++) {if (buf[i] == '\0') {buf[i] = c;break;}}
}
void getNext() {StateType state= START;int c;int count = 1;FILE* fp = NULL;FILE* out = NULL;fp = fopen("test.c-", "r");out = fopen("result.txt","w");char buf[100];memset(buf, 0, 100 * sizeof(char));while ((c = fgetc(fp))!=EOF) {if (c == '\n') { count++; }switch (state) {case START:if (isdigit(c)) { Save(c, buf); state = INNUM; }else if (isalpha(c)) { Save(c, buf);  state = INID; }else if (c == ' ' || c == '\n' || c == '\t') { state = START; }else if (c == '=') { Save(c,buf);state = INEQ; }else if (c == '<') { Save(c,buf);state = INLE; }else if (c == '>') { Save(c,buf); state = INRE; }else if (c == '!') { Save(c,buf);state = INNEQ; }else if (c == '/') { Save(c,buf);state = INLS; }else if (c == '+' || c == '-' || c == ',' || c == ';' || c == '(' || c == ')' || c == '[' || c == ']' || c == '{' || c == '}') { Save(c,buf); fseek(fp, -1L, 1); state = DONE; }break;case INNUM:if (isdigit(c)) { Save(c, buf); state = INNUM; }else { fseek(fp, -2L, 1); state = DONE; }break;case INID:if (isalpha(c)) { Save(c, buf); state = INID; }else { fseek(fp,-2L,1); state = DONE; }break;case INEQ:if (c == '=') { Save(c,buf); state = DONE; }else { fseek(fp, -1L, 1); state = DONE; }break;case INNEQ:if (c == '=') { Save(c, buf); state = DONE; }else { fseek(fp, -1L, 1); state = DONE; }break;case INLE:if (c == '=') { Save(c, buf); state = DONE; }else { fseek(fp, -1L, 1); state = DONE; }break;case INRE:if (c == '=') { Save(c, buf); state = DONE; }else { fseek(fp, -1L, 1); state = DONE; }break;case INLS:if (c == '*') { Save(c, buf); state = INCMT; }else { fseek(fp, -1L, 1); state = DONE; }break;case INCMT:if (c == '*') { Save(c, buf); state = ENDCMT; }else { Save(c, buf); state = INCMT; }break;case ENDCMT:if (c == '/') { memset(buf, 0, 100 * sizeof(char)); state = START; }else { Save(c, buf); state = INCMT; }break;case DONE:if (!strcmp(buf, "else") || !strcmp(buf, "if") || !strcmp(buf, "int") || !strcmp(buf, "return") || !strcmp(buf, "void") || !strcmp(buf, "while"))fprintf(out, "%d:\treserved word: %s\n", count, buf);else if (isalpha(buf[0]))fprintf(out, "%d:\tID, name = %s\n", count, buf);else if (isdigit(buf[0]))fprintf(out, "%d:\tNUM, val = %s\n", count, buf);elsefprintf(out, "%d:\t%s\n", count, buf);memset(buf, 0, 100 * sizeof(char));state = START;break;}}fprintf(out,"EOF\n");fclose(fp);fclose(out);
}
int main() {getNext();return 0;
}

分析前的C-语言片段:

/* A program to perform finding the maximum number of the three. */int max(int x, int y, int z)
{int result;if (x > y){result = x;if (z > result){result = z;}}else{result = y;if (z > result){result = z;}}return result;
}void main(void)
{int a;int b;int c;/* int d; */a = input();b = input();c = input();output(max(a, b, c));/*d = 2 * max(a, b, c);output(d);*/
}

经过词法分析后的代码片段:

3:   reserved word: int
3:  ID, name = max
3:  (
3:  reserved word: int
3:  ID, name = x
3:  ,
3:  reserved word: int
3:  ID, name = y
3:  ,
3:  reserved word: int
3:  ID, name = z
3:  )
4:  {
5:  reserved word: int
5:  ID, name = result
5:  ;
6:  reserved word: if
6:  (
6:  ID, name = x
6:  >
6:  ID, name = y
6:  )
7:  {
8:  ID, name = result
8:  =
8:  ID, name = x
8:  ;
9:  reserved word: if
9:  (
9:  ID, name = z
9:  >
9:  ID, name = result
9:  )
10: {
11: ID, name = result
11: =
11: ID, name = z
11: ;
12: }
13: }
14: reserved word: else
15: {
16: ID, name = result
16: =
16: ID, name = y
16: ;
17: reserved word: if
17: (
17: ID, name = z
17: >
17: ID, name = result
17: )
18: {
19: ID, name = result
19: =
19: ID, name = z
19: ;
20: }
21: }
22: reserved word: return
22: ID, name = result
22: ;
23: }
25: reserved word: void
25: ID, name = main
25: (
25: reserved word: void
25: )
26: {
27: reserved word: int
27: ID, name = a
27: ;
28: reserved word: int
28: ID, name = b
28: ;
29: reserved word: int
29: ID, name = c
29: ;
31: ID, name = a
31: =
31: ID, name = input
31: (
31: )
31: ;
32: ID, name = b
32: =
32: ID, name = input
32: (
32: )
32: ;
33: ID, name = c
33: =
33: ID, name = input
33: (
33: )
33: ;
34: ID, name = output
34: (
34: ID, name = max
34: (
34: ID, name = a
34: ,
34: ID, name = b
34: ,
34: ID, name = c
34: )
34: )
34: ;
40: }
EOF

编译原理,C/C++实现C-语言的词法分析器相关推荐

  1. [编译原理学习笔记2-2] 程序语言的语法描述

    [编译原理学习笔记2-2] 程序语言的语法描述 文章目录 [编译原理学习笔记2-2] 程序语言的语法描述 [2.3.1] 上下文无关文法 [2.3.2] 语法分析树与二义性 [2.3.3] 形式语言鸟 ...

  2. 《编译原理》实验报告——TINY语言的词法分析

    TINY语言的词法分析 实验目的 (评价依据,描述是否准确到位) 构造tiny语言的词法分析器(扫描器),要求利用第三方的lex工具进行构造. 构造出的扫描器,能够读入教材样例中给出的tiny语言的示 ...

  3. 编译原理算符分析器实现 -* c语言代码,编译原理论文-词法分析器的设计与实现...

    <编译原理论文-词法分析器的设计与实现>由会员分享,可在线阅读,更多相关<编译原理论文-词法分析器的设计与实现(13页珍藏版)>请在人人文库网上搜索. 1.编译原理论文题 目 ...

  4. 编译原理算符分析器实现 -* c语言代码,C语言实现算符优先文法源代码(编译原理)...

    下面教大家用C语言实现编译原理中的算符优先文法.求出FIRSTVT集和LASTVT集,并判断该文法是否是算符优先文法. 一.知识解析 1.定义 算符优先文法是一种自下而上的分析方法,其文法的特点是文法 ...

  5. 编译原理课程设计-对pl0语言进行扩充

    文章目录 一. 设计目的及要求 1.1 设计目的 1.2 设计要求 1.2.1 要求一 1.2.2 要求二 1.2.3 要求三 二.程序设计 2.1 程序的组织结构 2.1.1 PL/0编译程序函数定 ...

  6. 编译原理拉链回填技术c语言,编译原理笔记1:概述编译相关的基本知识

    本系列为个人编译原理学习笔记,谬误之处恳请高人指点,感激不尽! 内容整理自西安电子科技大学 王小兵.张南.鱼滨老师的编译原理课程. 编译器的工作步骤 在开始说任何东西之前,我们先来大致看一下编译器是怎 ...

  7. 从编译原理的角度看C语言是如何转换成汇编语言的?

    大家都知道计算机只能处理和识别二进制指令,而我们利用各种高级编程语言所编写的程序,要经过一些列的处理步骤,最终转变为汇编指令,再最后转变为机器指令. 以上这些转变是如何发生的就属于大名鼎鼎的" ...

  8. 编译原理预测分析法c语言,编译原理预测分析法C语言的实验报告.doc

    题目:编写识别由下列文法所定义的表达式的预测分析程序. EàE+T | E-T | T TàT*F | T/F |F Fà(E) | i 输入:每行含一个表达式的文本文件. 输出:分析成功或不成功信息 ...

  9. 编译原理——实验壹预习——TINY语言的词法分析

    实验目的 构造tiny语言的词法分析器(扫描器),要求利用第三方的lex工具进行构造.实验结果:构造出的扫描器,能够读入教材样例中给出的tiny语言的示例代码,分解成token输出. Experime ...

  10. 编译原理中中间代码生成---C语言实现

    一.前言 今天有点累,就不想废话了.直接进入正题吧.(新增)第二次实验课还是这个内容,不过新增了一个功能和再处理了一下其他bug. 二.内容 一.授课内容: (一) 授课科目:编译原理 (二) 授课内 ...

最新文章

  1. 一个数学系毕业的物理学家,是怎么拿到诺贝尔化学奖的?
  2. 【超详细】思科实验模拟器EVE的安装与使用,附下载链接
  3. 视音频编解码学习工程:H.264分析器
  4. ROS 控制台:rqt_console 因为比较简单。。。
  5. 你对java的看法 论文,一篇文章让你真正了解Java
  6. 第10课 skymvc 企业网站制作
  7. oninput,onpropertychange和onchange的区别
  8. B站视频解析去水印工具入口
  9. C语言期末复习不挂科(快速入门)(和bug郭一起学C系列1)
  10. 苹果html 闪退,iPhone6 App闪退的解决办法 掌握这4点苹果App不再闪退
  11. 英文破折号(em dash)、连接号(en dash)与连字符(hyphen)的区别及各自用法是什么?...
  12. C语言:成绩等级划分!
  13. [AirSim in Unreal] 在Unreal中使用无人机/无人车
  14. oracle表自动模拟多条数据,Oracle使用虚拟表dual一次插入多条记录
  15. python 括号 中 不需要 反斜杠_如何消除反斜杠后的空白(Python3.4)
  16. Nginx配置Https秘钥
  17. html渐变色css3渐变,css3渐变
  18. Fabric 环境搭建时bootstrap.sh帮我们做了什么?
  19. PYTHON学习之旅1:linux操作系统学习
  20. 一篇文章搞懂【Emmet】语法规则(前端必备技能)

热门文章

  1. cygwin恢复桌面快捷方式
  2. 深入探索微信公众号开发:Java代码实现与最佳实践
  3. 安卓模拟器反编译获取微信小程序源码。
  4. Catalan numbers
  5. Disconf原理和实践
  6. rabbitmq详解
  7. Windows基本命令 Win+R命令
  8. Maven使用与各配置项详解
  9. Ubuntu18.04下安装(1080Ti)NVIDIA驱动、CUDA9.2、cuDNN7.3进行GPU加速
  10. 阿里云服务器SSH登录