#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. ObjC运行时部分概念解析(一)

    转型iOS已经许久了,Runtime(运行时)还没有好好了解过.之前没有阅读过源码,紧紧凭借自己的臆测.现在阅读下源码,做一些笔记.方便再次翻阅 SEL SEL是一个关键字,如果没有涉及runtime ...

  2. MVC中使用Entity Framework 基于方法的查询学习笔记 (二)

    解释,不解释: 紧接上文,我们在Visual Studio2012中看到系统为我们自动创建的视图(View)文件Index.cshtml中,开头有如下这句话: @model IEnumerable&l ...

  3. c语言内存原理

    1.内存寻址由大到小,优先分配内存地址比较大得字节给变量 2.变量越先定义,内存地址就越大 3.取得变量的地址:&变量名 4.输出地址  %p

  4. Nodejs 的 Express框架 学习体会 补充中。。。

    最近为了用Shadow Socket FQ,到https://bandwagonhost.com上买了一个便宜的vps,19.99美元一年.服务器闲着也是闲着,就想搭建一个简单的博客. Express ...

  5. MySQL备份mydumper的原理

    本文来自:http://baiyangtx.net/2016/09/04/mydumper-principle/ 相对于MySQL官方提供的逻辑备份工具 mysqldump , mydumper最大的 ...

  6. mysql常用函数

    一.数学函数 数学函数主要用于处理数字,包括整型.浮点数等. 注:对大小写不敏感 ABS(x) 返回x的绝对值 SELECT ABS(-1) -- 返回1 CEIL(x),CEILING(x) 返回大 ...

  7. C#之反射

    Assembly assembly = Assembly.Load("PeopleDal"); //获取程序集名称 Module[] modules = assembly.GetM ...

  8. No plugin found for prefix 'mybatis-generator' in the current project

    http://blog.csdn.net/you23hai45/article/details/50792430 1.错误描述 F:\workspaces\Mybatis>mvn mybatis ...

  9. ViewPager适配器FragmentStatePagerAdapter 与FragmentPagerAdapter

    使用FragmentPagerAdapter存在删除dataSet顺序错乱的问题 改用FragmentStatePagerAdapter

  10. 判断是否为gif/png图片的正确姿势

    判断是否为gif/png图片的正确姿势 1.在能取到图片后缀的前提下 1 2 3 4 5 6 7 8 9 //假设这是一个网络获取的URL NSString *path = @"http:/ ...