编译原理实验1-词法分析
2023-03-14 10:27:10 时间
#include<stdio.h> #include<stdlib.h> #include<string.h> #define KEYWORDEND "waiting for your expanding" typedef struct { int typenum; char *word; } WORD; char input[255]; char token[255]=""; int pinput; int ptoken; char ch; char *rwtab[]= {"begin","if","then","while","do","end",KEYWORDEND}; WORD *scaner(); int main() { int over=1; WORD *oneword=new WORD; printf ("enter your words(end with #):"); scanf("%[^#]s",input); pinput=0; printf ("your words:\n%s\n",input); while(over<1000 && over!=-1) { oneword=scaner(); if (oneword->typenum<1000) printf ("(%d,%s)",oneword->typenum,oneword->word); over=oneword->typenum; } printf("\npress # to exit:"); scanf("%[^#]s",input); return 0; } char mgetch() //读取一个字符到ch { ch=input[pinput]; pinput=pinput+1; return(ch); } void getbc() //去掉空白符号 { while(ch==' ' || ch==10) { ch=input[pinput]; pinput=pinput+1; } } void concat() { token[ptoken]=ch; ptoken=ptoken+1; token[ptoken]='\0'; } int letter() { if (ch>='a' && ch<='z'||ch>='A'&&ch<='z')return 1; else return 0; } int digit() { if (ch>='0' && ch<='9') return 1; else return 0; } int reserve() { int i=0; while(strcmp(rwtab[i],KEYWORDEND)) { if(!strcmp(rwtab[i],token)) { return i+1; } i=i+1; } return 10; } void retract() { pinput=pinput-1; } char *dtb() { return NULL; } WORD *scaner() { WORD *myword=new WORD; myword->typenum=10; myword->word=""; ptoken=0; mgetch(); getbc(); if (letter()) { while(letter() || digit()) { concat(); mgetch(); } retract(); myword->typenum=reserve(); myword->word=token; return(myword); } else if(digit()) { while(digit()) { concat(); mgetch(); } retract(); myword->typenum=11; myword->word=token; return(myword); } else switch(ch) { case'=': mgetch(); if (ch=='=') { myword->typenum=39; myword->word="=="; return(myword); } retract(); myword->typenum=21; myword->word="="; return(myword); break; case'+': myword->typenum=13; myword->word="+"; return(myword); break; case'-': myword->typenum=14; myword->word="-"; return(myword); break; case'*': myword->typenum=15; myword->word="*"; return(myword); break; case'/': myword->typenum=16; myword->word="/"; return(myword); break; case'(': myword->typenum=27; myword->word="("; return(myword); break; case')': myword->typenum=28; myword->word=")"; return(myword); break; case'[': myword->typenum=28; myword->word="["; return(myword); break; case']': myword->typenum=29; myword->word="]"; return(myword); break; case'{': myword->typenum=30; myword->word="{"; return(myword); break; case'}': myword->typenum=31; myword->word="}"; return(myword); break; case',': myword->typenum=32; myword->word=","; return(myword); break; case':': mgetch(); if (ch=='=') { myword->typenum=18; myword->word=":="; return(myword); } retract(); myword->typenum=17; myword->word=":"; return(myword); break; case';': myword->typenum=26; myword->word=";"; return(myword); break; case'>': mgetch(); if (ch=='=') { myword->typenum=37; myword->word=">="; return(myword); } retract(); myword->typenum=35; myword->word=">"; return(myword); break; case'<': mgetch(); if (ch=='=') { myword->typenum=38; myword->word="<="; return(myword); } if (ch=='>') { myword->typenum=21; myword->word="<="; return(myword); } retract(); myword->typenum=20; myword->word="<"; return(myword); break; case'!': mgetch(); if (ch=='=') { myword->typenum=40; myword->word="!="; return(myword); } retract(); myword->typenum=-1; myword->word="ERROR"; return(myword); break; case'\0': myword->typenum=1000; myword->word="OVER"; return(myword); break; default: myword->typenum=-1; myword->word="ERROR"; return(myword); } }
相关文章
- k8s上部署JupyterHub实现多用户空间(第一篇)
- OpenCV这么简单为啥不学——2.1、imwrite逐帧保存图片
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-Java全排列公式
- DxO FilmPack 6 for Mac(胶片模拟效果滤镜软件)
- 【企业必读】如何降本增效?全在这了
- 学习LAMBDA函数:将Excel公式转换为自定义函数(上)
- NFTS和去中心化金融连接 NFT开发
- ChatGPT爆火,我要失业了吗?
- 学习LAMBDA函数:将Excel公式转换为自定义函数(下)
- Python+chatGPT编程5分钟快速上手,强烈推荐!!!
- Kaizen的六步法
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-试题 基础练习 数列排序(四种语言对照)
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-试题 基础练习 十六进制转八进制
- 做精益生产管理咨询有哪些公司可以选?
- 同行不同命:极兔喜、韵达愁?
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 十六进制转十进制
- composer clear-cache 清空缓存
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 特殊回文数
- 用git上传项目到GitHub或者码云全过程
- 不背锅运维:Go实现aes加密,并带你手撸一个命令行应用程序