#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define _KEY_WOED_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_WOED_END}; //C语言关键字

WORD * scaner(); //词法扫描函数,获得关键字

main()
{
int over=1;
WORD *oneword;
oneword=(WORD *)malloc(sizeof(WORD));
printf("请输入您的字符串(以#作为结束标志):");
scanf("%[^#]s",input);
p_input=0;
printf("您输入的字符串是:%s\n\n",input);
while(over<1000&&over!=-1)
{
oneword=scaner();
printf("(%d,%s)\n",oneword->typenum,oneword->word);
over=oneword->typenum;
}

}

//需要用到的自编函数参考实现
//从输入缓冲区读取一个字符到ch中

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;
for(i=0;i<7;i++)
{
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 '=':m_getch();
if(ch=='=')
{
myword->typenum=39;
myword->word="==";
return(myword);
}
retract();
myword->typenum=21;
myword->word="=";
return(myword);
break;
case '+':
myword->typenum=22;
myword->word="+";
return(myword);
break;
case '-':
myword->typenum=23;
myword->word="-";
return(myword);
break;
case '*':
myword->typenum=24;
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=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 ':':
myword->typenum=33;
myword->word=":";
return(myword);
break;
case ';':
myword->typenum=34;
myword->word=";";
return(myword);
break;
case '>':
myword->typenum=35;
myword->word=">";
return(myword);
break;
case '<':
myword->typenum=36;
myword->word="<";
return(myword);
break;
case '!':
m_getch();
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);
}
}
}

转载于:https://www.cnblogs.com/Rick00/p/4826954.html

0916编译原理作业二词法分析相关推荐

  1. 编译原理 实验二 词法分析程序设计

    1. 实验内容 ● TINY语言的词法由TINY Syntax.ppt描述: ● TINY语言的词法分析器由TINY Scanner.rar的C语言代码实现: ● TINY+语言的词法由TINY+ S ...

  2. 编译原理last集c语言,编译原理作业集-第七章.doc

    编译原理作业集-第七章 第七章 语义分析和中间代码产生 本章要点 1. 中间语言,各种常见中间语言形式: 2. 说明语句赋值语句布尔表达式控制语句的翻译: 3. 过程调用的处理: 4. 类型检查: 本 ...

  3. 编译原理实验二:赋值语句的语法分析程序设计

    编译原理实验二:赋值语句的语法分析程序设计 1.1实验内容 目的: 在前面实验的基础上,通过设计.编制.调试一个典型的赋值语句的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查,进一步掌握 ...

  4. 编译原理课程设计词法分析

      编译原理课程设计词法分析任务书 5)参考文献: (1)张素琴,吕映芝. 编译原理[M]., 清华大学出版社 (2)蒋立源.康慕宁等,编译原理(第2版)[M],西安:西北工业大学出版社 6)课程设计 ...

  5. 编译原理实验二:Bison

    编译原理实验二:Bison 实验要求 1.了解Bision基础知识,如何将文法产生式转换为Bison语句 2.阅读/src/common/SyntaxTree.c,对应头文件 /include/Syn ...

  6. 编译原理实验二(全部存储到数组再逐行验证语法版.....这种思路被老师否了,应该是验证一行扔掉一行才对)

    编译原理实验二(可能还有BUG,不确定继续找) 要大改一次23333,老师的意思是不能用数组存储,而是一边识别单词,然后识别完一行就判断一次语法 写实验二的时候找到的实验一的一个逻辑错误 改动了实验一 ...

  7. 编译原理实验:词法分析

    编译原理实验:词法分析 1. 实验题目:词法分析 实验目的 实验内容 实验要求 输入输出 2. 设计思想 3.算法流程 4. 源程序 5. 调试数据 1. 实验题目:词法分析 实验目的 根据PL/0语 ...

  8. 编译原理实验二 macos系统 itoa方法报错解决方法

    编译原理实验二 生成符号表的前期准备中使用itoa函数报错问题 执行 gcc -o parser lex.yy.c parser.tab.c ast.c 显示: itoa 函数是一个广泛应用的,从非标 ...

  9. 2ab对应的c语言表达式是,编译原理 作业标准答案

    <编译原理>第一次作业参考答案 一.下列正则表达式定义了什么语言(用尽可能简短的自然语言描述)? 1.b*(ab*ab*)* 所有含有偶数个a的由a和b组成的字符串. 2.c*a(a|c) ...

最新文章

  1. $(@_config=)什么意思?
  2. linux命令学习之:ifconfig
  3. java怎么往右浮动_[Java教程]jQuery实现页面滚动时智能浮动定位
  4. oracle cusor 定义
  5. 算法应用-百钱买百鸡
  6. 【编辑器】在VSCode中使用JetBrains Clion主题
  7. 和运营开会的知道的一些点
  8. 关于用mybatis调用存储过程时的入参和出参的传递方法
  9. python 对象_python中对象可不可以
  10. GAN生成式对抗网络简介及MINST实现
  11. 模拟实现CRC校验算法课程设计代码(C语言)
  12. 简单分析实现运维利器---webssh终端
  13. url 转码 java_HttpClient请求URL字符集转码问题解决方法
  14. 河北古村落版画展开幕 河北这些古村落你值得去看看
  15. 如何治疗水龟脖子长的大包
  16. node.js基于JavaScript网上商城毕业设计源码261620
  17. 使用hanewin实现 win系统主机,vm虚拟机中linux系统和开发板三方共享文件夹
  18. veritas msi_使用适用于AIX 5.3和6.1的Veritas Volume Manager(VxVM)V5管理逻辑卷
  19. 看雪2W课-Frida逆向与利用自动化 Frida开发和调试环境搭建 课时1
  20. 车速与档位匹配关系_车速与档位的关系汇总

热门文章

  1. Android MVVM基础版 DataBinding+Retrofit+RxJava(一)
  2. 愿世间再无人不懂正则
  3. [转]玩转Angular2(4)--制作左侧自动定位菜单
  4. 十一、OpenGL的坐标系统
  5. 干货满满:FCPX安装插件路径以及如何彻底删除插件(也适用于m1芯片)
  6. Java 学习day12 枚举 容器
  7. 我的世界服务器自动刷矿机,我的世界自动刷矿机怎么制作 | 我的世界 | MC世界侠...
  8. 武汉工程大学计算机科学与工程学院调剂公告,武汉工程大学计算机科学与工程学院2017年考研复试安排...
  9. 驾考科目一:安全行车和文明驾驶
  10. Kotlin 使用高阶函数实现回调