#include <stdio.h>
#include <string.h> char string[],word[],ch;
int type,p,i,n,sum;
char keyword[][]={"begin","if","then","while","do","end"}; //关键字数组 void scaner(void); main()
{
p=;
printf("\n\n请输入一个程序段(以'#'结束):\n");
do{
scanf("%c",&ch);
string[p++]=ch;
}while(ch!='#');
printf("单词符号\t种别码 \n");
p=;
do{
scaner();
switch(type)
{
case :
printf(" %-10d%5d\n",sum,type);
break;
case -:
printf("有无法识别的字符\n");
return ;
break;
default:
printf(" %-10s%5d \n",word,type);
break;
}
}while(type!=);
} void scaner(void)
{
sum=;
for(i=;i<;i++)
word[i++]= NULL; ch=string[p++];
i=; while((ch==' ')||(ch=='\n'))
ch=string[p++]; if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
{
while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='')&&(ch<='')))
{
word[i++]=ch;
ch=string[p++];
} p--;
type=; //先将以字母开头的字符识别为标识符 for(n=;n<;n++)
if(strcmp(word,keyword[n])==) //关键字数组比较,相同则表示为关键字,种别码即为下标值加一
{
type=n+;
break;
}
} else if((ch>='')&&(ch<=''))
{
while((ch>='')&&(ch<=''))
{
sum=sum*+ch-''; //将字符型转化为整形sum
ch=string[p++];
}
p--;
type=;
} else //else语句内识别除关键字、标识符、数字以外的其他字符
{
switch(ch)
{
case '+':
type=;
word[i++]=ch;
break; case '-':
type=;
word[i++]=ch;
break; case '*':
type=;
word[i++]=ch;
break; case '/':
type=;
word[i++]=ch;
break; case ':':
word[i++]=ch;
ch=string[p++];
if(ch=='=')
{
type=;
word[i++]=ch;
}
else
{
type=;
p--;
}
break; case '<':
word[i++]=ch;
ch=string[p++];
if(ch=='=')
{
type=;
word[i++]=ch;
}
else
{
type=;
p--;
}
break; case '>':
word[i++]=ch;
ch=string[p++];
if(ch=='=')
{
type=;
word[i++]=ch;
}
else
{
type=;
p--;
}
break; case '=':
type=;
word[i++]=ch;
break; case ';':
type=;
word[i++]=ch;
break; case '(':
type=;
word[i++]=ch;
break; case ')':
type=;
word[i++]=ch;
break; case '#':
type=;
word[i++]=ch;
break; default:
type=-;
break;
}
}
word[i++]='\0'; //word字符数组变字符串
}

词法分析程序(C)的更多相关文章

  1. 词法分析程序 LEX和VC6整合使用的一个简单例子

    词法分析的理论知识不少,包括了正规式.正规文法.它们之间的转换以及确定的有穷自动机和不确定的有穷自动机等等... 要自己写一个词法分析器也不会很难,只要给出了最简的有穷自动机,就能很方便实现了,用if ...

  2. 用C语言编写一个简单的词法分析程序

    问题描述: 用C或C++语言编写一个简单的词法分析程序,扫描C语言小子集的源程序,根据给定的词法规则,识别单词,填写相应的表.如果产生词法错误,则显示错误信息.位置,并试图从错误中恢复.简单的恢复方法 ...

  3. 0917 词法分析程序(java版)

    1.运行结果: 2.源代码: package 词法分析;import java.util.Scanner;public class fenxi {public static void main(Str ...

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

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

  5. PL/0与Pascal-S编译器程序详细注释

    学校编译课的作业之一,要求阅读两个较为简单的编译器的代码并做注释, 个人感觉是一次挺有意义的锻炼, 将自己的心得分享出来与一同在进步的同学们分享. 今后有时间再做进一步的更新和总结,其中可能有不少错误 ...

  6. Yacc 与 Lex 快速入门(词法分析和语法分析)

    我们知道,高级语言,一般的如c,Java等是不能直接运行的,它们需要经过编译成机器认识的语言.即编译器的工作. 编译器工作流程:词法分析.语法分析.语义分析.IR(中间代码,intermediate ...

  7. Go语言程序结构分析初探

    每一种编程语言都有自己的语法.结构以及自己的风格,这也是每种语言展现各自魅力及众不同的地方.Go也不例外,它简单而优雅,与此同时使用起来也很有趣.在本文中,我们将讨论以下几点: Go程序结构 如何运行 ...

  8. 第一章 flex单词计数程序

    学习Flex&Bison目标, 读懂SQLite中SQL解析部分代码 Flex&Bison简介Flex做词法分析Bison做语法分析 第一个Flex程序, wc.fl, 单词计数程序 ...

  9. 【C/C++】程序如何来,编译全过程

    概述    编译的目的是把人书写的高级语言代码翻译成目标程序的语言处理程序,编译用的程序(例如gcc)称为编译系统. 一个编译系统把一个源程序翻译成目标程序的工作过程分为5个阶段:词法分析.语法分析. ...

随机推荐

  1. 第3月第27天 uitableviewcell复用

    1. 有需求cell一行放两个子view,也可以放3个.子view控件都是一样,只有大小区分.需要复用吗? 复用实现:创建时创建3个,拿到数据时是两个就设置两个的frame,是3个就设置3个的fram ...

  2. linux 下串口独占方式打开

    参考文章: http://blog.csdn.net/rl529014/article/details/51336161  http://blog.csdn.net/lin_fs/article/de ...

  3. .Net Core--目录

    参考资料: .Net Core官网 https://www.microsoft.com/net/core 官方文档: https://docs.asp.net 博客园中文文档: http://www. ...

  4. HTTP缓存

    本文是<HTTP权威指南>读书笔记 Web缓存是可以自动保存常见文档副本的设备.当Web请求抵达缓存时,如果本地在“已缓存”的的副本,就可以从本地存储设备而不是原始服务器中提取这个文档.使 ...

  5. MarkdownPad2.5 注册码

    邮箱: Soar360@live.com 授权秘钥: GBPduHjWfJU1mZqcPM3BikjYKF6xKhlKIys3i1MU2eJHqWGImDHzWdD6xhMNLGVpbP2M5SN6b ...

  6. 学习 opencv---(6)玩转opencv源代码:生成opencv 工程解决方案与opencv 源码编译

    在这篇中,我们探讨如何通过已安装的opencv选择不同的编译器类型,生成高度还原的OpenCV开发时的解决方案工程文件,欣赏OpenCV新版本中总计 六十六多万行的精妙源代码.我们可以对其源代码进行再 ...

  7. PostgresSQL的安装与基本命令使用

    安装与配置 yum install http://yum.postgresql.org/9.5/redhat/rhel-7-x86_64/pgdg-redhat95-9.5-2.noarch.rpm ...

  8. ubuntu 配置VPN

    1.  sudo apt-get install pptpd 2.  修改/etc/pptpd.conf , vi /etc/pptpd.conf 找到#localip 192.168.0.1和#re ...

  9. oracle中trunc()和to_char()函数用法

    -----trunc(for date) select sysdate from dual; --当前时间  2016/9/7 10:32:04select trunc(sysdate) from d ...

  10. 中国知网cnki(永久会员账号)

    中国知网cnki(永久会员账号)大男孩免费分享   网站简介: (中国知网http://www.cnki.net/)中国知网是国家知识基础设施(National Knowledge Infrastru ...