搜索
查看
编辑修改
首页
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
Heads Up Notification (setFullScreenIntent not work on Mate8)_notification中的headsupnotification指什么
2
MathType2024破解版激活序列号_mathtype免费使用
3
鸿蒙智慧屏安装应用,谁说华为智慧屏不能装APP,我来打脸了,附零难度安装APP教程...
4
百度地图Android API实现点聚合功能以及设置最小聚合数和最大显示数_百度地图合并展示数字怎么弄
5
多态、虚函数举例(人与复读机)_在右侧编辑器中的begin-end之间补充代码,设计三个复读机类和一个普通函数,具体要
6
【网站项目】新冠肺炎疫苗接种管理系统
7
docker的简单安装_libltdl.so.7
8
APP在后台启动Activity_app.startactivity
9
RxJava 线程切换,AndroidSchedulers 源码分析(三)
10
【VSCode】VScode 配置 Linux 驱动环境(简单版)_linux vscode
当前位置:
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
java
代码
中修改
shape
的
颜色
_
shape
object
怎么
调字体
颜色
为最淡...
1.
shape
代码
:them
_
all
[详细]
-->
赞
踩
article
扇区
架次数
动态
展示...
注意:在上面代码中【 v-show="isShow('/section/detail')" 】属性的作用是判断当前登录的...
赞
踩
article
VSCode
提交
本地
文件
到
Github
远程仓库详细教程_
vscode
提交
代码
到
github
...
github
简单使用教程_
vscode
提交
代码
到
github
vscode
提交
代码
到
github
...
赞
踩
article
Android
时
区
更改笔记
_
tvsettings
添加网络更新
时
区
...
时
区
更改主要就是拿到
时
区
,设置
时
区
这两大功能位置:/frameworks/base/packages/SettingsL...
赞
踩
article
剑指
offer
-
python
:37.求
最小
的
k
个数
/最大
的
k
个数
_不去重
的
k
个数
的
数组...
给定一个长度为 n
的
可能有重复值
的
数组,找出其中不去重
的
最小
的
k
个数
。例如数组元素是4,5,1,6,2,7,3,8...
赞
踩
article
基于
HarmonyOS
的
HTTPS
请求
过程开发示例(ArkTS)_
harmonyos
ark...
介绍本篇 Codelab 基于
网络
模块以及 Webview 实现一次
HTTPS
请求
,并对其过程进行抓包分析。效果如图...
赞
踩
article
ThreadLocal
实战
及
详解
_
threadlocal
實戰...
本次给大家介绍重要的工具
ThreadLocal
。讲解内容如下,同时介绍什么场景下发生内存泄漏,如何复现内存泄漏,如何正确...
赞
踩
article
java
寻找
最大
数_
寻找
最大
的
K
个数
优化解法...
寻找
最大
的
K
个数
优化解法2014/4/11 9:48:24 exceptionhelp 程序员俱乐部 我要评论(0)摘要...
赞
踩
article
Linux
开发之——Ubuntu创建桌面
快捷
方式
_
linux
创建
android
studio
桌面快...
一 概述
Linux
系统中,软件安装完成后,默认是没有桌面
快捷
方式
的,本文以Android Studio为例介绍 如何创建...
赞
踩
article
MHA
概念...
MySQL
MHA
一、
MHA
概念
MHA
(MasterHigh Availability)是一套优秀的MySQL高可用环境...
赞
踩
article
聚类
算法
之
层次
聚类
和
密度
聚类
(
图文并茂
)_
层次
聚类
算法
结构图
...
前言
层次
聚类
方法对给定的数据集进行
层次
的分解,直到达到某种条件为止。具体又可分为:凝聚的
层次
聚类
——AGNES
算法
采用自...
赞
踩
article
Python
第三方
库
安装
详细教程(图文结合)_
python
安装
第三方
库
的
方法
...
超详细
Python
第三方
库
安装
,(图文结合)小白也能看懂!_
python
安装
第三方
库
的
方法
python
安装
第三方
库
的
方法
...
赞
踩
article
HarmonyOS
ArkTS
HTTP
请求
简单
封装
(二十二)_
arkts
封装
http
请求
...
请确保在项目中添加对应的依赖库,以及在 config.json 中配置 TypeScript 编译选项,确保项目能够正确...
赞
踩
article
世界
时
区
_
世界
各城市
时
区
代码...
国码
世界
时
区
世界
时
区
(英文)
时
间(绿色为日光节约) GMTAD 欧洲/安道尔Europe/Andorra 2015...
赞
踩
article
如何
下载
android
studio
的历史
版本
_
android
studio
下载
历史
版本
...
4、找到对应的
版本
进行
下载
。_
android
studio
下载
历史
版本
android
studio
下载
历史
版本
...
赞
踩
article
java
并发2(
守护
线程
|
ThreadLocal
|
内存
可见性|原子性|
CAS
|
Unsafe
|伪共享|...
目录
线程
优先级
守护
线程
守护
线程
和用户
线程
的区别
线程
优先级Java中每个
线程
有一个优先级,默认情况下
线程
继承父
线程
的优先级...
赞
踩
article
Java
的前世今生_
java
: -
source
1.5
中不
支持
lambda
表达式
(请使用 -...
搞
Java
6年了,一直想对
Java
有一个系统的认识,今天终于做了这件事。
Java
不仅仅是一门编程语言,还是一个由一系列...
赞
踩
article
CUDA
下载
安装
教程,新手详细_
cuda
安装
...
新手入门,详细
安装
教程_
cuda
安装
cuda
安装
目录 一、...
赞
踩
article
vue项目_
const
{
data
: res } =
await
this
.$
http
.
post
(...
前端和服务器之间存在跨域问题就使用token,不存在跨域问题就使用cookie和session来维持状态创建分支并且切换...
赞
踩
article
Java求解
TopK
问题_
10
亿
个
数
中如何高效地找到
最大
的
一
个
数
以及
最大
的
第 k
个
数
...
TopK
问题
10
亿
个
数
中如何高效地找到
最大
的
一
个
数
以及
最大
的
K
个
数
参考链接参考1:https://github.com...
赞
踩
相关标签
javascript
前端
vue.js
github
vscode
git
android
android studio
ide
python
算法
https
华为
HarmonyOS
java
spring
开发语言
Thread
ThreadLocal
java寻找最大数
linux
mysql
聚类
聚类算法