#include<stdio.h>
#include<string.h>
int i,j,k,sign,flag,number,run;
char ch;
char word[10];
char program[500];
int Scan(char program[])
{
char *keyword[8]={"iii""begin","if","then","while","do","end"};
number=0;
flag=0;
j=0;
ch=program[i++];
while(ch=='\n'||ch==' '||ch=='\t'||ch=='\r')
{
ch=program[i++];
}
if(ch>='a'&&ch<='z')
{
while(ch>='a'&&ch<='z')
{
word[j++]=ch;
ch=program[i++];
}
i--;
word[j++]='\0';
for(k=0;k<8;k++)
{
if(strcmp(word,keyword[k])==0)
{
flag=1;
sign=k+1;
}
else
{
flag=0;
sign=300;
} //是关键字,不是标识符//
break;

}

}

if(ch>'0'&&ch<'9') //是不是数字//
{
number=0;
while(ch>'0'&&ch<'9')
{
number=number*10+(ch-'0');
ch=program[i++];
}
sign=200;
i--;
}
else
switch(ch)
{
case '=':{
if(ch=='=')
{
word[j++]=ch;
word[j]='\0';
sign=25; //=//

}
break;
}

case '<':{
if(ch=='<')
{
word[j++]=ch;
word[j]='\0';
ch=program[i++];
}
if(ch=='=')
{
word[j++]=ch;
word[j]='\0';
sign=21;
}
else
{
i--;
sign=20;
}
break;
}
case '>':{
if(ch=='>')
{
word[j++]=ch;
word[j]='\0';
ch=program[i++];
}
if(ch=='=')
{
word[j++]=ch;
word[j]='\0';
sign=24;
}
else
{
i--;
sign=23;
}
break;
}
case '(':{
if(ch=='(')
{
word[j++]=ch;
word[j]='\0';
sign=27;
}
break;
}
case ')':{
if(ch==')')
{
word[j++]=ch;
word[j]='\0';
sign=28;
}
break;
}
case ':':{
if(ch==':')
{
word[j++]=ch;
word[j]='\0';
ch=program[i++];
}
if(ch=='=')
{
word[j++]=ch;
word[j]='\0';
sign=18;
}
else
{
i--;
sign=17;
}
break;
}
case '#':{
if(ch=='#')
{
word[j++]=ch;
word[j]='\0';
sign=0;
}
break;
}
case ';':{
if(ch==';')
{
word[j++]=ch;
word[j]='\0';
sign=26;
}
break;
}
case '+':{
if(ch=='+')
{
word[j++]=ch;
word[j]='\0';
sign=13;
}
break;
}
case '-':{
if(ch=='-')
{
word[j++]=ch;
word[j]='\0';
sign=14;
}
break;
}
case '*':{
if(ch=='*')
{
word[j++]=ch;
word[j]='\0';
sign=15;
}
break;
}
case '/':{
if(ch=='/')
{
word[j++]=ch;
word[j]='\0';
sign=16;
}
break;
}
case '@':{
if(ch=='@')
{
word[j++]=ch;
word[j]='\0';
sign=0;
}

}

return sign;
}
int main()
{
int i=0,run=1,sign=0,sum=1,ent;
while(run)
{
int j;
for(j=0;j<500;j++)
program[j]=' ';
for(j=0;j<10;j++)
word[j]=' ';
printf("请输入一段源代码");
do{
ch =getchar();
program[i++]=ch;

}while(ch!='@');
i=0;
do{
sign=Scan(program);
if(sign==13)
{
printf("操作符 %8s %5d",word,sign);
sum++;
ent=1;
}
if(sign==14)
{
printf("操作符 %8s %5d",word,sign);
sum++;
ent=1;
}
if(sign==15)
{
printf("操作符 %8s %5d",word,sign);
sum++;
ent=1;
}
if(sign==16)
{
printf("操作符 %8s %5d",word,sign);
sum++;
ent=1;
}
if(sign==17)
{
printf("操作符 %8s %5d",word,sign);
sum++;
ent=1;
}
if(sign==18)
{
printf("操作符 %8s %5d",word,sign);
sum++;
ent=1;
}
if(sign==20)
{
printf("操作符 %8s %5d",word,sign);
sum++;
ent=1;
}
if(sign==21)
{
printf("操作符 %8s %5d",word,sign);
sum++;
ent=1;
}
if(sign==22)
{
printf("操作符 %8s %5d",word,sign);
sum++;
ent=1;
}
if(sign==24)
{
printf("操作符 %8s %5d",word,sign);
sum++;
ent=1;
}
if(sign==25)
{
printf("操作符 %8s %5d",word,sign);
sum++;
ent=1;
}
if(sign==26)
{
printf("操作符 %8s %5d",word,sign);
sum++;
ent=1;
}
if(sign==27)
{
printf("操作符 %8s %5d",word,sign);
sum++;
ent=1;
}
if(sign==28)
{
printf("操作符 %8s %5d",word,sign);
sum++;
ent=1;
}
if(sign>=1&&sign<=8)
{
printf("关键字 %8s %5d",word,sign);
sum++;
ent=1;
}
} while(sign!=0);
printf("是否继续?y or N");
getchar();
ch=getchar();
if(ch=='n'||ch=='N')
run=0;
}

return 0;

词法分析用c++实现的的更多相关文章

  1. js词法分析

    JavaScript的高级知识---词法分析 词法分析 词法分析方法: js运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤: 分析参数 再分析变量的声明 分析函数说明 函数在运行的瞬间, ...

  2. 编译原理-词法分析05-正则表达式到DFA-01

    编译原理-词法分析05-正则表达式到DFA 要经历 正则表达式 --> NFA --> DFA 的过程. 0. 术语 Thompson构造Thompson Construction 利用ε ...

  3. 跟vczh看实例学编译原理——二:实现Tinymoe的词法分析

    文章中引用的代码均来自https://github.com/vczh/tinymoe.   实现Tinymoe的第一步自然是一个词法分析器.词法分析其所作的事情很简单,就是把一份代码分割成若干个tok ...

  4. 深入JavaScript:词法分析、连续赋值猜想

    JavaScript:词法分析.连续赋值猜想 原创文章,转摘请注明出处:苏福:http://www.cnblogs.com/susufufu/p/5851642.html 深夜发文,先吐槽下博客园的编 ...

  5. 简单的词法分析和语法分析(C++实现,CodeBlocks+GCC编译)

    说明: 分析的语言是SNL语言,详见<编译程序的设计与实现>( 刘磊.金英.张晶.张荷花.单郸编著) 词法分析就是实现了词法分析的自动机 语法分析使用递归下降法 运行结果: 词法分析 得到 ...

  6. 编译原理-词法分析04-NFA & 代码实现

    编译原理-词法分析04-NFA & 代码实现 0.术语 NFA 非确定性有穷自动机nondeterministic finite automation. ε-转换ε-transition 是无 ...

  7. js的高级知识---词法分析

    词法分析 词法分析方法: js运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤: 分析参数 再分析变量的声明 分析函数说明 具体步骤如下: 函数在运行的瞬间,生成一个活动对象(Active ...

  8. python成长之路【第十六篇】:JavaScript的高级知识---词法分析

    一.词法分析方法 js运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤: 分析参数 再分析变量的声明 分析函数说明 二.具体步骤如下: 函数在运行的瞬间,生成一个活动对象(Active O ...

  9. Javascript词法分析

    词法分析的过程: 先分析参数 分析变量声明 分析函数声明 具体步骤: 在函数运行前的一瞬间,先生成Active Object活动对象; 函数声明的参数,形成AO的属性,值为undefined 接收参数 ...

  10. Atitit 发帖机系列(7) 词法分析的方法attilax大总结)

    Atitit 发帖机系列(7) 词法分析的方法attilax大总结) 1.1. 词法分析貌似俩大方法,一个直接根据状态图转换,一个根据dfa1 1.2. switchcase或者ifelse 最原始方 ...

随机推荐

  1. Home Assistant系列 -- 基于树莓派安装并设置自启动

    Home Assistant 是当前智能家居最火热的开源DIY 软件,之前的文章  智能家居系统 Home Assistant 系列 --介绍篇  已经详细介绍过了,这里就不详细介绍了,今天介绍 如何 ...

  2. MySQL用全库备份数据恢复单表数据

    备份数据库时,采用了全库备份,但是因为某些原因需要回滚一个表的数据到备份数据库上,如果回滚整个库就比较费时间,因为可能这个表只有几十M,但是其它表可能有十几上百G,这时候就需要将需要恢复的表提取出来了 ...

  3. intel-FPGA的片内存储器问题

    FPGA的片内有很多的存储器资源,可以配置成单端口的ROM.RAM和双端口的ROM.RAM,以及移位寄存器和FIFO等.在学习过程中,笔者遇到过几个小问题,总结如下: 片内是不是有ROM或者RAM? ...

  4. [arc067F]Yakiniku Restaurants[矩阵差分]

    Description 传送门 Solution 假如我们确定了烧烤店区间[l,r],则票j必定会选择在B[i][j](l<=i<=r)最大的烧烤店使用. 反过来想,我们想要票j在第i个烧 ...

  5. 10_SpringBoot集成TkMybatis插件

    10_SpringBoot集成TkMybatis插件 明天你好向前奔跑 关注  0.5 2018.09.11 11:15 字数 163 阅读 3794评论 0喜欢 3 @Author Jacky Wa ...

  6. Q&As:1.cocos2d-html5如何获得鼠标划过事件

    不喜欢按部就班学东西,感觉各种框架各种技术就应该是拿到手用的,这应该是导致我现在学了这么多却没一样精通的缘故吧. 发现自己喜欢在QQ群回答一些菜鸟的问题,就算自己不清楚也会乐意看代码帮助解决╮(╯_╰ ...

  7. 前端--javaScript之简单介绍

    一.javaScript(以下简称js)的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端 ...

  8. Java的Graphics类进行绘图的方法详解

    Graphics类提供基本绘图方法,Graphics2D类提供更强大的绘图能力. Graphics类提供基本的几何图形绘制方法,主要有:画线段.画矩形.画圆.画带颜色的图形.画椭圆.画圆弧.画多边形等 ...

  9. Configure,Makefile.am, Makefile.in, Makefile文件

    一 软件安装关于 makefile文件问题 如果拿到的工程文件中,没有Makefile文件,而只有configure.in和Makefile.am文件,我们是不能够直接进行编译的,必须根据config ...

  10. jenkins 入门教程

    jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更直白点,就是各种项目的"自动化"编译.打包.分发部署.jenkins可以很好的支持各种语言(比如:java, ...