博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
0921 词法分析
阅读量:5797 次
发布时间:2019-06-18

本文共 6956 字,大约阅读时间需要 23 分钟。

#include
//包含库所用的某些宏和变量#include
//包含库#include
//包含字符串处理库#define _KEY_WORD_END "waiting for your expanding" //定义关键字结束标志typedef struct { int typenum; char * word;}WORD;char input[255]; //输入换缓冲区char token[255]=""; //单词缓冲区int p_input; //输入换缓冲区指针int p_token; //单词缓冲区指针char ch; //当前所读的字符char *rwtab[]={
"begin","if","then","while","do","end",_KEY_WORD_END}; //C语言关键字WORD * scaner(); //词法扫描函数,获得关键字main(){ int over=1; WORD *oneword; oneword=(WORD *)malloc(sizeof(WORD)); printf("Enter Your words(end with #):"); //读入源程序字符串到缓冲区,以#结束,允许多行输入 scanf("%[^#]s",input); p_input=0; printf("Your words:%s\n\n",input); while(over<1000&&over!=-1) { oneword=scaner(); printf("单词符号:%s\t种别码:%d\n",oneword->word,oneword->typenum); over=oneword->typenum; }}char m_getch(){ ch=input[p_input]; p_input=p_input+1; return (ch);}//去掉空白字符void getbc(){ while(ch==' '||ch==10) { ch=input[p_input]; p_input=p_input+1; }}//拼接单词void concat(){ token[p_token]=ch; p_token=p_token+1; token[p_token]='\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],_KEY_WORD_END)) { if(!strcmp(rwtab[i],token)) { return i+1; } i=i+1; } return 10;}//回退一个字符void retract(){ p_input=p_input-1;}WORD *scaner(){ WORD *myword ; myword=(WORD *)malloc(sizeof(WORD)); myword->typenum=10; myword->word=""; p_token=0; m_getch(); getbc(); if(letter()){ while(letter()||digit()){ concat(); m_getch(); } retract(); myword->typenum=reserve(); myword->word=token; return(myword); } else if(digit()){ while(digit()) { concat(); m_getch(); } retract(); myword->typenum=20; myword->word=token; return(myword); } else { switch(ch) { 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 ':': m_getch(); if(ch=='='){ myword->typenum=18; myword->word=">="; return(myword); } retract(); myword->typenum=17; myword->word=":"; return(myword); break; case '<': m_getch(); if(ch=='='){ myword->typenum=21; myword->word="<="; return(myword); } else if(ch=='>'){ myword->typenum=22; myword->word="<>"; return(myword); } retract(); myword->typenum=20; myword->word="<"; return(myword); break; case '>': m_getch(); if(ch=='='){ myword->typenum=24; myword->word=">="; return(myword); } retract(); myword->typenum=23; myword->word=">"; return(myword); break; case '=': myword->typenum=25; myword->word="="; return(myword); break; case ';': myword->typenum=26; 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=0; myword->word="OVER"; return(myword); break; default: myword->typenum=-1; myword->word="ERROR"; return(myword); } } }

 

转载于:https://www.cnblogs.com/wangzekai/p/4860784.html

你可能感兴趣的文章
我的第一篇博客
查看>>
小属性
查看>>
https://doc.opensuse.org/projects/kiwi/doc/
查看>>
大话无线通信
查看>>
XSLT+XML导出EXCEL,如何设定打印区域(以行数与列数)大小?
查看>>
我第一个篇随笔
查看>>
9.6、魔法常量
查看>>
table的拖拽选中区域(包含行合并和列合并的处理)
查看>>
TCP连接探测中的Keepalive和心跳包. 关键字: tcp keepalive, 心跳, 保活
查看>>
安装Tomcat指定JDK(转)
查看>>
Netflix
查看>>
使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件(转)
查看>>
你真的了解try{ return }finally{}中的return?(转)
查看>>
Android 手机上安装并运行 Ubuntu 12.04(转,没实测)
查看>>
java 正则表达式应用
查看>>
C语言(2)
查看>>
dubbo+zookeeper+dubbo-admin环境的搭建
查看>>
数据库阿里连接池 druid配置详解
查看>>
REST笔记:一种标准的超媒体格式:Atom
查看>>
ajax全局函数运用
查看>>