编译原理,C/C++实现C-语言的词法分析器
项目地址:
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-语言的词法分析器相关推荐
- [编译原理学习笔记2-2] 程序语言的语法描述
[编译原理学习笔记2-2] 程序语言的语法描述 文章目录 [编译原理学习笔记2-2] 程序语言的语法描述 [2.3.1] 上下文无关文法 [2.3.2] 语法分析树与二义性 [2.3.3] 形式语言鸟 ...
- 《编译原理》实验报告——TINY语言的词法分析
TINY语言的词法分析 实验目的 (评价依据,描述是否准确到位) 构造tiny语言的词法分析器(扫描器),要求利用第三方的lex工具进行构造. 构造出的扫描器,能够读入教材样例中给出的tiny语言的示 ...
- 编译原理算符分析器实现 -* c语言代码,编译原理论文-词法分析器的设计与实现...
<编译原理论文-词法分析器的设计与实现>由会员分享,可在线阅读,更多相关<编译原理论文-词法分析器的设计与实现(13页珍藏版)>请在人人文库网上搜索. 1.编译原理论文题 目 ...
- 编译原理算符分析器实现 -* c语言代码,C语言实现算符优先文法源代码(编译原理)...
下面教大家用C语言实现编译原理中的算符优先文法.求出FIRSTVT集和LASTVT集,并判断该文法是否是算符优先文法. 一.知识解析 1.定义 算符优先文法是一种自下而上的分析方法,其文法的特点是文法 ...
- 编译原理课程设计-对pl0语言进行扩充
文章目录 一. 设计目的及要求 1.1 设计目的 1.2 设计要求 1.2.1 要求一 1.2.2 要求二 1.2.3 要求三 二.程序设计 2.1 程序的组织结构 2.1.1 PL/0编译程序函数定 ...
- 编译原理拉链回填技术c语言,编译原理笔记1:概述编译相关的基本知识
本系列为个人编译原理学习笔记,谬误之处恳请高人指点,感激不尽! 内容整理自西安电子科技大学 王小兵.张南.鱼滨老师的编译原理课程. 编译器的工作步骤 在开始说任何东西之前,我们先来大致看一下编译器是怎 ...
- 从编译原理的角度看C语言是如何转换成汇编语言的?
大家都知道计算机只能处理和识别二进制指令,而我们利用各种高级编程语言所编写的程序,要经过一些列的处理步骤,最终转变为汇编指令,再最后转变为机器指令. 以上这些转变是如何发生的就属于大名鼎鼎的" ...
- 编译原理预测分析法c语言,编译原理预测分析法C语言的实验报告.doc
题目:编写识别由下列文法所定义的表达式的预测分析程序. EàE+T | E-T | T TàT*F | T/F |F Fà(E) | i 输入:每行含一个表达式的文本文件. 输出:分析成功或不成功信息 ...
- 编译原理——实验壹预习——TINY语言的词法分析
实验目的 构造tiny语言的词法分析器(扫描器),要求利用第三方的lex工具进行构造.实验结果:构造出的扫描器,能够读入教材样例中给出的tiny语言的示例代码,分解成token输出. Experime ...
- 编译原理中中间代码生成---C语言实现
一.前言 今天有点累,就不想废话了.直接进入正题吧.(新增)第二次实验课还是这个内容,不过新增了一个功能和再处理了一下其他bug. 二.内容 一.授课内容: (一) 授课科目:编译原理 (二) 授课内 ...
最新文章
- 一个数学系毕业的物理学家,是怎么拿到诺贝尔化学奖的?
- 【超详细】思科实验模拟器EVE的安装与使用,附下载链接
- 视音频编解码学习工程:H.264分析器
- ROS 控制台:rqt_console 因为比较简单。。。
- 你对java的看法 论文,一篇文章让你真正了解Java
- 第10课 skymvc 企业网站制作
- oninput,onpropertychange和onchange的区别
- B站视频解析去水印工具入口
- C语言期末复习不挂科(快速入门)(和bug郭一起学C系列1)
- 苹果html 闪退,iPhone6 App闪退的解决办法 掌握这4点苹果App不再闪退
- 英文破折号(em dash)、连接号(en dash)与连字符(hyphen)的区别及各自用法是什么?...
- C语言:成绩等级划分!
- [AirSim in Unreal] 在Unreal中使用无人机/无人车
- oracle表自动模拟多条数据,Oracle使用虚拟表dual一次插入多条记录
- python 括号 中 不需要 反斜杠_如何消除反斜杠后的空白(Python3.4)
- Nginx配置Https秘钥
- html渐变色css3渐变,css3渐变
- Fabric 环境搭建时bootstrap.sh帮我们做了什么?
- PYTHON学习之旅1:linux操作系统学习
- 一篇文章搞懂【Emmet】语法规则(前端必备技能)