#include <stdio.h>
#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"};   //关键字字符数组。用来和键盘输入的字符串作比较
void Scaner()     //词法分析器
{    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;
    }
}
int main()
{    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语言--简易词法分析器的更多相关文章

  1. Dart 语言简易教程系列

    google Fuchsia系统 及 dart语言简介 在 InteIIiJ IDEA 中搭建 Dart 的开发环境 Dart Linux 开发环境搭建 Dart 语言简易教程(一) Dart 语言简 ...

  2. 02.从0实现一个JVM语言之词法分析器-Lexer-03月02日更新

    从0实现JVM语言之词法分析器-Lexer 本次有较大幅度更新, 老读者如果对前面的一些bug, 错误有疑问可以复盘或者留言. 源码github仓库, 如果这个系列文章对你有帮助, 希望获得你的一个s ...

  3. 用C/C++手撕CPlus语言的集成开发环境(1)—— 语言规范 + 词法分析器

    序言 之所以叫做CPlus语言,是因为原本是想起名为CMinus的,结果发现GitHub和Gitee上一堆的CMinus的编译器(想必都是开过编译原理课程并且写了个玩具级的语言编译器的大佬们吧).但是 ...

  4. 简单c语言子集词法分析器

    概述 词法分析是编译的第一个环节,其输入是高级语言程序,输出是单词串.词法分析器的主要任务是将高级语言程序作为字符串输入,然后依据词法规则将字符串组合成单词,并输出单词串. 为了方便之后的编译环节,通 ...

  5. Java语言的词法分析器的Java实现

    一.实验目的 1. 学会针对DFA转换图实现相应的高级语言源程序. 2. 深刻领会状态转换图的含义,逐步理解有限自动机. 3. 掌握手工生成词法分析器的方法,了解词法分析器的内部工作原理. 二.实验内 ...

  6. 自己动手开发编译器(五)miniSharp语言的词法分析器

    稍微说明一点,整型常量和上面的标识符的词法,在调用lex.DefineToken时都多传了一个参数.这个参数是可选的描述信息,如果不传会直接使用正则表达式的字符串形式.而标识符的正则表达式有4万多个字 ...

  7. 简单的C语言编译器--词法分析器

    1. 定义词法单元Tag   首先要将可能出现的词进行分类,可以有不同的分类方式.如多符一类:将所有逗号.分号.括号等都归为一类,或者一符一类,将一个符号归为一类.我这里采用的是一符一类的方式.C代码 ...

  8. C语言: 简易图书管理系统

    这只是一个简易的图书管理系统,虽然它有千余行代码,不过终究是个简单基本的东西. 在Linux系统下,用Vim编写,如要在Windows上运行则需要一些改动,主要是一些调用系统函数的改动.如Window ...

  9. C语言简易三子棋

    这是本人依据现学知识写的简易三子棋,也不是那么简洁明了,望大佬指点 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include&l ...

随机推荐

  1. DT包 -- R语言中自定义表格数据

    DT 包提供了 JavaScript 库 DataTables 的一个R接口,它使得R对象(矩阵或数据框)可以在HTML页面上显示为表格. 该包的DataTables函数生成的表格提供了数据的筛选.分 ...

  2. GSEA 基因集富集分析

    http://software.broadinstitute.org/gsea/index.jsp GSEA(Gene Set Enrichment Analysis)是一种生物信息学的计算方法,用于 ...

  3. Spring实现多数据源配置

    一.前言 对于小型项目,服务器与数据库是可以在同一台机子上的,但随着业务的庞大与负责,数据库和服务器就会分离开来.同时随着数据量的增大,数据库也要分开部署到多台机子上. 二.Spring配置文件修改 ...

  4. mapdb的适用场景介绍

    对于大部分系统来说,mapdb并无太大价值,而且增加了成本.但是如果一级缓存巨大例如数以十GB级别,或占据了整个JVM的1/2以上,mapdb的价值就会体现出来.正如其官网介绍: MapDB prov ...

  5. Oracle 日期各个部分常用写法

    --1.日期的各部分的常用的的写法 --- --1) 取时间点的年份的写法: SELECT TO_CHAR(SYSDATE,'YYYY') FROM DUAL; --结果:2019 --2) 取时间点 ...

  6. kotlin基础 空值检查

    NULL检查机制 Kotlin的空安全设计对于声明可为空的参数,在使用时要进行空判断处理,有两种处理方式,字段后加!!像Java一样抛出空异常,另一种字段后加?可不做处理返回值为 null或配合?:做 ...

  7. css---【vw,vh】进行自适应布局单位

    在进行CSS3自适应布局,会用到 vw 和 vh 进行布局 视口单位(Viewport units) 什么是视口? 在桌面端,视口指的是在桌面端,指的是浏览器的可视区域:而在移动端,它涉及3个视口:L ...

  8. Ant Design Pro Vue 时间段查询 问题

    <a-form-item label="起止日期" :labelCol="{lg: {span: 7}, sm: {span: 7}}" :wrapper ...

  9. java继承实现的基本原理

    方法调用的过程 寻找要执行的实例方法的时候,是从对象的实际类型信息开始查找的,找不到的时候,再查找父类类型信息. 动态绑定,而动态绑定实现的机制就是根据对象的实际类型查找要执行的方法,子类型中找不到的 ...

  10. bootCDN引用的bootstrap前端框架套件和示例

    这是bootCDN上引用的bootstrap前端框架套件,由多个框架组合而成,方便平时学习和测试使用.生产环境要仔细琢磨一下,不要用开发版,而要用生产版.bootCDN的地址是:https://www ...