搜索
查看
编辑修改
首页
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
Mac -Terminal -指令集_mac terminal命令
2
uniapp和小程序关联操作,看我这一篇就行了!!!_uniapp中调试可以连接unicloud,微信小程序调试的时候怎么连接呢
3
[Android]TextView实现分散对齐(两端对齐)_android 设置text justified
4
测试金字塔
5
ClickHouse学习笔记(一):ClickHouse安装、数据类型、表引擎、SQL操作_clickhouse日志路径
6
10台世界上最快的超级计算机_pflops eflops
7
.NET Core之Entity Framework Core基础_c# entityframeworkcore
8
Android编译默认英语,Android系统语言出厂编译设置为简体中文
9
【Flutter】顶部导航栏实现 ( Scaffold | DefaultTabController | TabBar | Tab | TabBarView )_flutter defaulttabcontroller
10
蓝桥杯:长草(小明有一块空地,他将这块空地划分为)_蓝桥杯 长草
当前位置:
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
推荐阅读
article
Android
默认
时
区
大全_
android
时
区
列表...
Android
的
时
区
很多,如何精准找到对应的
时
区
,机智的我找到了
android
sdk源码中的timezones.xml...
赞
踩
article
Uni-
app
接入
腾讯
人脸
核身
_uni
app
接入
腾讯意愿
核身
...
人脸
核身
功能有多种
接入
方式,其中包含微信H5、微信小程序、APP、独立H5、PC端、API
接入
6种方式。 我们的产...
赞
踩
article
DevEco
Studio3.1:Preview
failed
._
devecos
报错
preview
...
异常问题:解决方法:_
devecos
报错
preview
failed
devecos
报错
preview
failed
...
赞
踩
article
Linux :
service
network
restart :bringing up interf...
暑假开始拿了本linux的书自虐,在安装gnome桌面环境之后,
service
network
restart之后又发现...
赞
踩
article
java
的
lambda
表达式
_
java
lambda
中可以
抛出
异常
吗...
lambda
表达式
的格式以->分隔,前边是参数列表,后边是
表达式
体也就是具体要执行得到逻辑。根据参数列表的个数有无返回值...
赞
踩
article
【图解
物
联网
】第
6
章
物
联网
与
数据分析
...
从前几
章
中我们已经了解到,只要把配备传感器的设备连接到网络,就能把所有的信息采集到
物
联网
服务之中(图
6
.1)。从工业角度...
赞
踩
article
力扣977.
有序
数组
的
平方
...
【代码】977.
有序
数组
的
平方
。力扣977.
有序
数组
的
平方
...
赞
踩
article
阿里
云
2
核
4G
服务器
租用
价格
和性能测评...
阿里
云
2
核
4G
服务器
租用优惠
价格
,轻量
2
核
4G
服务器
165元一年、u1
服务器
2
核
4G
5M带宽199元一年、
云
服务器
e实例...
赞
踩
article
Python
——
Flask
快速
开发
一个物资
管理
平台(源码+适合大作业)_
python
实物
管理
系统
...
Flask
框架结合原生的 HTML 和 Bootstrap 可以
快速
开发
Web 应用程序。
Flask
框架是 Pyt...
赞
踩
article
亲测好用的两个在
anaconda
虚拟环境
下
安装
第三方
包
的方法_
annoconda
添加外部
包
...
有没有刚入门的同学和我一样?下载
第三方
包
的时候总出现各种各样的错误,总下不下来,我总结了两个方法,基本上都能
安装
成功。可...
赞
踩
article
10
0天精通
鸿蒙
从入门到跳槽
—
—
第
10
天:
TypeScript
知识储备:
模块
...
10
0天精通
鸿蒙
从入门到跳槽
—
—
第
10
天:
TypeScript
知识储备:
模块
...
赞
踩
article
100
天
精通
鸿蒙
从入门到跳槽
—
—
第
6
天
:
TypeScript
知识储备:类...
探索
TypeScript
的世界,第
6
天
的篇章专注于类的结构与功能。在这里,我们将深入探讨类的定义、构造函数、成员变量和方...
赞
踩
article
鸿蒙【
ArkTS
】
封装数据
请求
HTTP
使用装饰器进行配置化引入接口_鸿蒙
atkts
http
请求
...
利用【
ArkTS
】的
HTTP
数据
请求
,
封装数据
请求
使用TS的装饰器功能 实现与后端接口的风格统一 可直接配置_鸿蒙at...
赞
踩
article
python
按
列
对齐
_
python
–
Matplotlib
表 – 为不同的
列
指定不同的
文本
对...
我正在创建一个两
列
表,并希望
文本
尽可能接近.如何指定第一
列
是右
对齐
而第二
列
是左
对齐
?我试过将一般cellloc设置为一边...
赞
踩
article
OpenJudge
-
13
:
大
整数
的因子...
总时间限制
:
1000ms内存限制
:
65536kB。
OpenJudge
-
13
:
大
整数
的因子 ...
赞
踩
article
词法
分析
二(
词法
分析
程序)_编写一个将输入
的
源代码
识别出
词法
分析
的
二元组
,
并且输出
。
...
1、
词法
分析
功能输入:所给文法
的
源程序字符串
。
输出:二元组(syn
,
token或sum)构成
的
序列
。
其中,syn为单词种...
赞
踩
article
MySQL
MHA
工具的
优缺点
归纳...
MHA
是由日本DeNA公司youshimaton(现就职于Facebook公司)开发的一套优秀的作为
MySQL
高可用性环...
赞
踩
article
鸿蒙:
This
device
type
does
not match the project pro...
鸿蒙出现:
This
device
type
does
not match the project profile.Err...
赞
踩
article
AIGC
|
Agentbot
的
构建实践...
被选择
的
代理进行回复,管理员则会再次工作。该框架中,智能体有着可定制
的
、可对话
的
特点,对话中
的
每个代理有着特定
的
能力和角...
赞
踩
article
es6
类,判断
数据类型
...
es6
类,判断
数据类型
es6
类,判断
数据类型
es6
的类 今日目...
赞
踩
相关标签
uni-app
人脸核身
harmonyos
物联网
算法
数据结构
阿里云
服务器
云计算
flask
python
后端
开发语言
跳槽
typescript
华为
javascript
鸿蒙
鸿蒙系统
ts
arkTS
猫头虎