C语言--简易词法分析器
#include <stdlib.h>
#include <string.h>
int p,m,syn,n,sum; //p和m,作用相当于指针,用来指向下一个字符或回退一个字符,syn用于判别字符种类。
//n为循环控制变量,sum用来判别整型数是否溢出。
char token[10],prog[80]; //全局变量,一个数组用来接收键盘输入,另一个用于词法分析。
char ch; //从键盘输入的字符数组里一个个取出,做判别。
char *keywords[7]={"begin","else","if","while","do","end","then"}; //关键字字符数组。用来和键盘输入的字符串作比较
{ p=0;
n=0;
ch = prog[p++]; //从键盘输入的字符数组,读取一个字符,用于做判别。p指向下一个字符。
for(n=0;n<10;n++) //初始化用于存储判别过后字符的字符数组
token[n] = ' ';
while(ch==' ') //当读取字符不为空时,开始判别
{
ch = prog[p++]; //为空,p一直往下走。
p++;
}
if((ch>='a'&&ch<='z')||(ch<='Z'&&ch>='A')) //若为字母。
{
m=0;
while((ch>='a'&&ch<='z')||(ch<='Z'&&ch>='A')) //循环,读取下一个为字母的字符。
{
token[m++]= ch; //存进判别过的字符数组
ch = prog[p++];
}
token[m++]='\0';//字符数组后一位设为空。
p--; //p回退一位,因为此时不满足if条件。
syn = 10; //字母的种别码,为10.
for(n=0;n<7;n++)
if(strcmp(token,keywords[n])==0) //读进的字符数组与关键词字符串数组作比较
{
syn=n+1; //若相同,则返回1-6的关键字种别码
break;
}
}
else if(ch>='0'&&ch<='9') //若读进的字符为数字。
{
sum = 0;
while(ch<='9'&&ch>='0') //累加。
{
sum=sum*10+ch-'0'; //由于是字符,所以要手动进位。sum乘10,
ch=prog[p++];
}
p--;
syn = 11;
if(sum>32767) //判断是否溢出。int类型(C语言里)最大为32767,最小为-32766
syn = -1; //种别码为-1,说明溢出。
}
else switch(ch) //若为运算符
{
case '<':
m=0;
token[m++] = ch;
ch = prog[p++];
if(ch=='>') //形成尖括号<>
{
token[m++]=ch;
syn=21; //尖括号的种别码
}
else if(ch=='=') //形成<=
{
token[m++] = ch;
syn = 22;
}
else
{
syn = 20;
p--;
}
break;
case '>': //与<同理
m=0;
token[m++]=ch;
ch=prog[p++];
if(ch=='<')
{
token[m++]=ch;
syn = 21;
}
else if(ch=='=')
{
token[m++]=ch;
syn=24;
}
else
{
syn = 25;
p--;
}
break;
case '(': //与尖括号同理
m=0;
token[m++]=ch;
ch=prog[p++];
if(ch==')')
{
token[m++]=ch;
syn = 26;
}
else
{
syn = 27;
p--;
}
break;
case ')':
m=0;
token[m++]=ch;
ch=prog[p++];
if(ch=='(')
{
token[m++]=ch;
syn=26;
}
else
{
syn=27;
p--;
}
break;
case '+':token[0]=ch;syn = 12;break; //其他的一些运算符处理
case '-':token[0]=ch;syn = 13;break;
case '*':token[0]=ch;syn = 14;break;
case '/':token[0]=ch;syn = 15;break;
case '!':token[0]=ch;syn = 16;break;
case ':':token[0]=ch;syn = 17;break;
case ';':token[0]=ch;syn = 18;break;
case '#':token[0]=ch;syn = 0;break;
default:syn =-1;break;
}
}
{ p=0;
printf("Please enter a string:\n");
gets(prog); //键盘输入一组字符。
do
{
Scaner();//做词法分析
if(syn<10&&syn>0)
{printf("This is keywords!\n");break;} //关键字
else if(syn==10)
{printf("This is a words!\n");break;} //标识符
else if(syn==11)
{printf("This is a number!\n");break;} //数字
else
{printf("Other words!\n");break;} //运算符或者结束符#
}
while(syn!=0);
return 0;
}
C语言--简易词法分析器的更多相关文章
- Dart 语言简易教程系列
google Fuchsia系统 及 dart语言简介 在 InteIIiJ IDEA 中搭建 Dart 的开发环境 Dart Linux 开发环境搭建 Dart 语言简易教程(一) Dart 语言简 ...
- 02.从0实现一个JVM语言之词法分析器-Lexer-03月02日更新
从0实现JVM语言之词法分析器-Lexer 本次有较大幅度更新, 老读者如果对前面的一些bug, 错误有疑问可以复盘或者留言. 源码github仓库, 如果这个系列文章对你有帮助, 希望获得你的一个s ...
- 用C/C++手撕CPlus语言的集成开发环境(1)—— 语言规范 + 词法分析器
序言 之所以叫做CPlus语言,是因为原本是想起名为CMinus的,结果发现GitHub和Gitee上一堆的CMinus的编译器(想必都是开过编译原理课程并且写了个玩具级的语言编译器的大佬们吧).但是 ...
- 简单c语言子集词法分析器
概述 词法分析是编译的第一个环节,其输入是高级语言程序,输出是单词串.词法分析器的主要任务是将高级语言程序作为字符串输入,然后依据词法规则将字符串组合成单词,并输出单词串. 为了方便之后的编译环节,通 ...
- Java语言的词法分析器的Java实现
一.实验目的 1. 学会针对DFA转换图实现相应的高级语言源程序. 2. 深刻领会状态转换图的含义,逐步理解有限自动机. 3. 掌握手工生成词法分析器的方法,了解词法分析器的内部工作原理. 二.实验内 ...
- 自己动手开发编译器(五)miniSharp语言的词法分析器
稍微说明一点,整型常量和上面的标识符的词法,在调用lex.DefineToken时都多传了一个参数.这个参数是可选的描述信息,如果不传会直接使用正则表达式的字符串形式.而标识符的正则表达式有4万多个字 ...
- 简单的C语言编译器--词法分析器
1. 定义词法单元Tag 首先要将可能出现的词进行分类,可以有不同的分类方式.如多符一类:将所有逗号.分号.括号等都归为一类,或者一符一类,将一个符号归为一类.我这里采用的是一符一类的方式.C代码 ...
- C语言: 简易图书管理系统
这只是一个简易的图书管理系统,虽然它有千余行代码,不过终究是个简单基本的东西. 在Linux系统下,用Vim编写,如要在Windows上运行则需要一些改动,主要是一些调用系统函数的改动.如Window ...
- C语言简易三子棋
这是本人依据现学知识写的简易三子棋,也不是那么简洁明了,望大佬指点 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include&l ...
随机推荐
- 避免MySQL出现重复数据处理方法
对于常规的MySQL数据表中可能存在重复的数据,有些情况是允许重复数据的存在,有些情况是不允许的,这个时候我们就需要查找并删除这些重复数据,以下是具体的处理方法! 方法一:防止表中出现重复数据 当表中 ...
- Mongoose 两个表关联查询aggregate 以及 Mongoose中获取ObjectId
Mongoose 两个表关联查询aggregate 通常两个表关联查询的时候,是一种一对多的关系,比如订单与订单详情就是一对多的关系,一个订单下面有多个商品 数据模拟 首先我们先将数据模拟出来,先选择 ...
- 20175211 《实验三 敏捷开发与XP实践》实验报告
目录 一.实验内容 二.实验步骤 四.实验过程中遇到的问题及其解决方法 五.心得体会 六.码云链接 七.结对成员链接 八.参考资料 一.实验内容 (1)编码标准 (2)Git的使用 (3)重构 (4) ...
- 三个面向对象相关的装饰器@property@staticmathod@classmethod
@property 先看实例: from math import pi class Circle: def __init__(self,r): self.r = r @property def per ...
- dubbo源码分析之基于SPI的强大扩展
https://blog.csdn.net/luoyang_java/article/details/86609045 Dubbo采用微内核+插件体系,使得设计优雅,扩展性强.那所谓的微内核+插件体系 ...
- centos7安装yum
由于不小心把自带的yum给卸载了,卸载命令:rpm -qa yum: 在浏览器打开链接:http://mirrors.163.com/centos/6/os/x86_64/Packages/下载这四个 ...
- nginx 安装 ssl 证书
nginx 安装 ssl 证书 关键词: pem 转 crt , 证书续期, nginx 部署 ssl 证书, 解决 SSL23_GET_SERVER_HELLO 错误. 之前免费申请的 1年的证书过 ...
- “无法启动IIS Express Web服务器”的解决办法
“无法启动IIS Express Web服务器”的解决办法 听语音 原创 | 浏览:259 | 更新:2019-07-15 13:02 1 2 3 4 5 6 7 分步阅读 在使用visual stu ...
- Nginx修改时间戳
1.安装nginx,注意不要安装nginx-common或者nginx-full sudo apt-get install nginx sudo apt-get install nginx-commo ...
- table 随td固宽
//给table,td定最小宽度 table.sheetbody{table-layout: %;} td,th{ min-width: 100px; } <table border=" ...