搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
盐析白兔
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
华为麒麟的AI性能是高通的3.5倍?这是所有手机运行神经网络的能力
2
YOLO系列:详细解读YOLOv8的改进模块!_上采样之前的 1 × 1 卷积去除,将 backbone 不同阶段输出的特征直接送入了上采样
3
java 基于微信小程序的饭店外卖点餐系统 uniapp小程序_uniapp点餐小程序
4
JuiceSSH结合内网穿透实现公网远程访问本地Linux虚拟机_juicessh本地设备命令
5
牛逼!教你用GPT制作优质简历!_gpt3.5 写简历
6
arm-none-linux-gnueabi交叉工具链执行后显示: no such file or directory_arm none linux
7
Java 使用POI导出数据到 excel,单 sheet 和多 sheet_poi多sheet
8
词法分析——输入缓冲_lex 词法分析器缓冲区
9
NLP文本摘要NO.2 TextRank算法_nlp摘要textrank
10
机器学习-线性回归-正规方程_x^t*x的逆
当前位置:
article
> 正文
编译原理(用c语言编写小型词法分析器)_c语言小子集编译原理词法分析器代码
作者:盐析白兔 | 2024-03-23 08:54:25
赞
踩
c语言小子集编译原理词法分析器代码
学过编译原理的同学一定知道词法分析,那么词法分析如何用c语言实现呢?
精力有限,做的
词法分析器
只能分析以下几种
编写程序前需要状态表
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h>
int main()
{
int ipos=0;//当前存储位置
int istate=1;//当前状态
int nextistate=0;//下一状态
bool tag=true;
char *buffer;//指向单词缓冲区的指针
int textab[6][4]={{},{2,4,-1},{2,-1,3},{4,-1,-1},{4,4,-1}};\\转换表
char code[1000];//存输入的字符串
char put[100][100];//存入得出的结果
char ch;//获得输入字符串的一个字符
int i=0,j=0,k=0,p,m=0,n=0;
char chucun[100];//存取出的值eg int i=5;先将int取出来存入
printf("小型词法分析器\n");
printf("请输入程序,程序以#结束\n");
while((ch=getchar())!='#')
{
code[i]=ch;//7.9e+8-\0 ipos=6
i++;
}
code[i]='\0';
while(ipos<strlen(code)&&tag!=0)
{
*buffer=code[ipos];//将源程序当前字符加入缓冲区 int a08ui=3.14;
if(code[ipos]!='\0')
{
if((code[ipos]>='a'&&code[ipos]<='z')||(code[ipos]>='A'&&code[ipos]<='Z')||(code[ipos]>='0'&&code[ipos]<='9')||(code[ipos]=='.'))
{
chucun[j]=code[ipos];
j=j+1;
if(code[ipos]>='0'&&code[ipos]<='9')
{
nextistate=textab[istate][0];
}
else if((code[ipos]>='a'&&code[ipos]<='z')||(code[ipos]>='A'&&code[ipos]<='Z'))
{
nextistate=textab[istate][1];
}
else if(code[ipos]=='.')
{
nextistate=textab[istate][2];
}
if(nextistate==-1)
{
printf("%s输入形式错误\n",code);
//tag=false;
break;
}
else if(nextistate>0)
{
istate=nextistate;
}
}
else
{
istate=1;
if(j!=0)
{
j=j-1;
if(strcmp(chucun,"main")==0)
{
strcpy(put[k++],chucun);
strcpy(put[k++],"词类编码:1 属性:关键字");
}
else if(strcmp(chucun,"int")==0)
{
strcpy(put[k++],chucun);
strcpy(put[k++],"词类编码:2 属性:关键字");
}
else if(strcmp(chucun,"float")==0)
{
strcpy(put[k++],chucun);
strcpy(put[k++],"词类编码:3 属性:关键字");
}
else
{
for(p=0;p<=j;p++)
{
if((chucun[p]>='a'&&chucun[p]<='z')||(chucun[p]>='A'&&chucun[p]<='Z'))
{
if(p!=0)
{
printf("%s格式错误\n",chucun);
//tag=false;
break;
}
else
{
strcpy(put[k++],chucun);
strcpy(put[k++],"词类编码:4 属性:标识符");
break;
}
}
else if(chucun[p]=='.')
{
i=6;
}
else
{
if(p==j)
{
if(i==6)
{
strcpy(put[k++],chucun);
strcpy(put[k++],"词类编码:6 属性:实常数");
}
else
{
strcpy(put[k++],chucun);
strcpy(put[k++],"词类编码:5 属性:整常数");
}
}
}
}
}
memset(chucun,0,sizeof(chucun));
j=0;
}
if(code[ipos]=='+')
{
strcpy(put[k++],"+");
strcpy(put[k++],"词类编码:8 属性:运算符");
}
else if(code[ipos]=='-')
{
strcpy(put[k++],"-");
strcpy(put[k++],"词类编码:9 属性:运算符");
}
else if(code[ipos]=='=')
{
strcpy(put[k++],"=");
strcpy(put[k++],"词类编码:7 属性:运算符");
}
else if(code[ipos]==';')
{
strcpy(put[k++],";");
strcpy(put[k++],"词类编码:10 属性:分界符");
}
else if(code[ipos]=='(')
{
strcpy(put[k++],"(");
strcpy(put[k++],"词类编码:13 属性:分界符");
m=m+1;
}
else if(code[ipos]==')')
{
strcpy(put[k++],")");
strcpy(put[k++],"词类编码:14 属性:分界符");
m=m+1;
}
else if(code[ipos]=='{')
{
strcpy(put[k++],"{");
strcpy(put[k++],"词类编码:11 属性:分界符");
n=n+1;
}
else if(code[ipos]=='}')
{
strcpy(put[k++],"}");
strcpy(put[k],"词类编码:12 属性:分界符");
n=n+1;
}
else if(code[ipos]==' ')
{
}
else if(code[ipos]=='\n')
{
}
else
{
printf("%c输入错误\n",code[ipos]);
//tag=false;
break;
}
}
*buffer=NULL;
}
ipos++;
}
if(j!=0)
{
j=j-1;
if(strcmp(chucun,"main")==0)
{
strcpy(put[k++],chucun);
strcpy(put[k++],"词类编码:1 属性:关键字");
}
else if(strcmp(chucun,"int")==0)
{
strcpy(put[k++],chucun);
strcpy(put[k++],"词类编码:2 属性:关键字");
}
else if(strcmp(chucun,"float")==0)
{
strcpy(put[k++],chucun);
strcpy(put[k++],"词类编码:3 属性:关键字");
}
else
{
for(p=0;p<=j;p++)
{
if((chucun[p]>='a'&&chucun[p]<='z')||(chucun[p]>='A'&&chucun[p]<='Z'))
{
if(p!=0)
{
printf("%s格式错误\n",chucun);
//tag=false;
break;
}
else
{
strcpy(put[k++],chucun);
strcpy(put[k++],"词类编码:4 属性:标识符");
break;
}
}
else if(chucun[p]=='.')
{
i=6;
}
else
{
if(p==j)
{
if(i==6)
{
strcpy(put[k++],chucun);
strcpy(put[k++],"词类编码:6 属性:实常数");
}
else
{
strcpy(put[k++],chucun);
strcpy(put[k++],"词类编码:5 属性:整常数");
}
}
}
}
}
memset(chucun,0,sizeof(chucun));
}
if(tag!=0)
{
if(((n%2)==0)&&((m%2)==0))
{
for(i=0;i<k;i++)
{
printf("%s\n",put[i]);
if(i%2==1)
{
printf("\n");
}
}
}
else if((n%2)!=0)
{
printf("分界符{}不完整");
}
else if((m%2)!=0)
{
printf("分界符()不完整");
}
}
return 0;
}
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/盐析白兔/article/detail/294254?site
推荐阅读
article
最小
的
K
个数
_
java
题给定一个长度为
n
的
可能有重复值
的
数组
,
找出其中不去重
的
最小
的
k
个...
题目描述描述给定一个长度为
n
的
可能有重复值
的
数组
,找出其中不去重
的
最小
的
k
个数
。例如
数组
元素是4
,
5
,
1
,
6
,
2...
赞
踩
article
机器
学习
-
SVM
支持向量机
模型
详解
_
svm
模型
中
...
SVM
SVM
起源
SVM
算法思想应用场景代码实现示例优缺点
SVM
起源
SVM
算法思想应用场景代码实现示例优缺点
_
svm
模型
...
赞
踩
article
在
Mac
上搭建
Gradle
环境_
mac
安装
gradle
...
Gradle
运行需要Java开发工具包(JDK)。您可以从Oracle官网下载适合您的操作系统版本的JDK。_
mac
安装
...
赞
踩
article
LeetCode
-热题
100
:
17.
电话号码
的
字母组合
...
LeetCode
-热题
100
:
17.
电话号码
的
字母组合
LeetCode
-热题
100
:
17.
电话号码
的
字母组合
...
赞
踩
article
探索
网络
世界的核心:TCPIP
协议
四
层
模型解析_4
层
通信
协议
...
欢迎来到今天的每日一题,每日一提。今天要聊的是面试中经常会问到tcp
协议
。什么是TCP/IP
协议
?它包括哪些
层
次?。虽然...
赞
踩
article
vscode
单击
跳转
_
vscode
中
ctrl
+
鼠标
左键
不能
跳转
...
vscode
中
ctrl
+
鼠标
左键
不能
跳转
,就会,文件,教程,工作,
跳转
vscode
中
ctrl
+
鼠标
左键
不能
跳转
易采站长站...
赞
踩
article
求一
个数
组
的
最大
k
个数
(
java
)_
数组
中
最大
的
k
个数
...
问题描述:求一
个数
组
的
最大
k
个数
,如,{1,5,8,9,11,2,3}
的
最大
三
个数
应该是,8,9,11问题分析: 1.解...
赞
踩
article
一文了解
Gradle
构建
工具_
gradle
打包
可
执行
jar
...
Gradle
是一种开源
构建
自动化工具,可以
构建
几乎任何类型的软件。
Gradle
对您要
构建
什么或如何
构建
它几乎没有任何...
赞
踩
article
鸿蒙
开发
-
UI
-
组件
导航-
Navigation
_
鸿蒙
应用导航设计...
上文详细学习了
鸿蒙
开发
UI
页面跳转的相关知识,学习页面路由router基本概念,使用方法,页面路由两种跳转模式和两种实例...
赞
踩
article
运用
swiper
来实现点击切换
登录
_
antd
-
mobile
的
swiper
设置
current
...
效果:实现步骤: ①给两个view选择项分别
设置
两个
current
属性,用来区分页面,一个值为0,一个为1 ②给两个vi...
赞
踩
article
CAS
介绍...
CAS
介绍_cascas
CAS
介绍 一、什么是
CAS
二、C...
赞
踩
article
读取
寄存器
值
_
温湿度
传感器
与S7-1200 PLC
通讯
读取
温湿度
案例...
1 硬件组态添加S7-1200CPU(1214C DC/DC/DC)添加通信板CB1241(RS485)2 MODBUS...
赞
踩
article
SVM
模型
详解...
入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。一、
SVM
定义与...
赞
踩
article
Linux
之
udp
/
tcp
协议...
然后等待对方也将数据发送完以后,确定没有数据要发送了,也要断开连接,也发送FIN,同理左边也会发送应答!大家可以想如果1...
赞
踩
article
2024
大
语言
模型
能力测评
报告
...
本研究围绕语义理解、文学创作、知识问答、逻辑推理、编程、上下文理解、语境感知、多
语言
处理及多模态交互等十
大
核心领域,对包...
赞
踩
article
不要再苦苦寻觅
了
!
AI
大
模型
面试
指南(含答案)
的
最全总结来
了
!_
ai
大
模型
面试
...
AI
大
模型
技术经过2023年
的
狂飙,2024年必将迎来应用
的
落地,对 IT 同学来讲,这里蕴含着
大
量
的
技术机会,越来越...
赞
踩
article
vue2
【
详解
】
mixins
——
抽离
公共逻辑...
mixins
用于在 Vue 中便捷复用变量、方法、组件引用、生命周期等。
vue2
【
详解
】
mixins
——
抽离
公共逻...
赞
踩
article
Klipper
源码分析-
reactor
.
py
_
klip
py
...
reactor
是 Klip
py
中的一个模块,它负责管理事件的注册、调度和处理。它充当了事件驱动的核心引擎,驱动整个 ...
赞
踩
article
一、
鸿蒙
os
应用
开发
备忘...
鸿蒙
os
应用
类型
鸿蒙
os
应用
分为以下三种:一、TV(电视机)电视机上的
应用
,前端页面
开发
可以使用js+hml+css做为...
赞
踩
article
vscode
如何在
没有
网络
的情况下
安装
插件
_
vscode
无
网络
安装
插件
...
vscode
。
_
vscode
无
网络
安装
插件
vscode
无
网络
安装
插件
...
赞
踩
相关标签
数据结构
排序算法
算法
机器学习
macos
gradle
leetcode
深度优先
golang
网络
tcp/ip
udp
vscode 单击跳转
java
android
kotlin
harmonyos
ui
华为
jvm
读取寄存器值
nlp
人工智能
自然语言处理