#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. 用Python实现一个简单的——人脸相似度对比

    近几年来,兴起了一股人工智能热潮,让人们见到了AI的能力和强大,比如图像识别,语音识别,机器翻译,无人驾驶等等.总体来说,AI的门槛还是比较高,不仅要学会使用框架实现,更重要的是,需要有一定的数学基础 ...

  2. easyui datagrid生成序号列formatter

    var opts1; $('#datagrid_1').datagrid({ columns: [ [{ field: 'myNo', title: '序号', align: 'center', wi ...

  3. 简述 IntentFilter(意图过滤器)

    1.什么是IntentFilter ? IntentFilter翻译成中文就是“意图过滤器”,主要用来过滤隐式意图.当用户进行一项操作的时候,Android系统会根据配置的 “意图过滤器” 来寻找可以 ...

  4. Linux权限:提示-bash: ./startup.sh: Permission denied的解决方案

    Linux权限:提示-bash: ./startup.sh: Permission denied的解决方案 Linux上启动Tomcat,结果弹出:-bash: ./startup.sh: Permi ...

  5. Linux创建用户,SFTP只允许访问指定目录

    首先创建用户 useradd lus1passwd lus1 我这里配置lus1这个用户目录,为sftp指向目录,即/home/lus1/ vim /etc/ssh/sshd_config //这个记 ...

  6. 分布式事务一2PC

    分布式事务解决方案之2PC(两阶段提交) 前面已经学习了分布式事务的基础理论,以理论为基础,针对不同的分布式场景业界常见的解决方案有2PC.TCC.可靠消息最终一致性.最大努力通知这几种. 3.1.什 ...

  7. IfcColumn

    IfcColumn is a vertical structural member which often is aligned with a structural grid intersection ...

  8. ORA-01126: 数据库必须已装载到此实例并且不在任何实例中打开

    原因:修改归档模式的操作只能在 mount 状态下进行,不能处于 open 状态. SQL> alter database archivelog;alter database archivelo ...

  9. [LeetCode] 768. Max Chunks To Make Sorted II 可排序的最大块数 II

    This question is the same as "Max Chunks to Make Sorted" except the integers of the given ...

  10. 破解MySQL登录密码的几种方法

    工具列表 Medusa Ncrack Hydra Metasploit Medusa medusa  -h 192.168.1.106 –U /root/Desktop/user.txt –P /ro ...