#include <stdio.h>
#include <string.h>
#include <ctype.h>
typedef struct node
{
  char list[81];
  int tempi;
}sentance;//分离出一个个关键字所用临时结构
void printch(char stack[][10],int top);
int main()
{
  sentance one,two,three;
  char whole[800];//存放用户输入数据
  char word=NULL;
  char stack[800][10];//存放关键字以及变量的栈
  int top=-1;
  int i=1;
  one.tempi=two.tempi=three.tempi=0;
  printf("Please input the code and end with the '#':");
  while(word!='#')
  {
    i=1;
    gets(whole);
    word=whole[0];//将字符串第一个字符赋给word
    while(word!='#')
      {
        while(ispunct(word)&&(word!='#'))
        {
          two.list[two.tempi]=word;
          two.tempi++;
          word=whole[i];//i是以1开始,所以whole[i]是下一个字符
          i++;
          if(two.list[two.tempi-1]!=':'&&two.list[two.tempi-1]!='<'&&two.list[two.tempi-1]!='>')//若果不是这三个符号,则直接入栈
          {
            two.list[two.tempi]='\0';
            top++;
            strcpy(stack[top],two.list);
            two.tempi=0;
          }
          else if(word=='='&&two.list[two.tempi-1]==':'||word=='='&&two.list[two.tempi-1]=='<'||word=='='&&two.list[two.tempi-      1]=='>'||word=='>'&&two.list[two.tempi-1]=='<')//比较是否为双标点情况
          {
            two.list[two.tempi]=word;
            two.list[two.tempi+1]='\0';
            top++;
            strcpy(stack[top],two.list);
            two.tempi=0;
            word=whole[i];//将下一个字符赋给word
            i++;//i指向下一个字符
          }
          else//当下一个字符没有组成双标点,则入栈
          {
            two.list[two.tempi]='\0';
            top++;
            strcpy(stack[top],two.list);
            two.tempi=0;
          }
        }
        while(isalpha(word)&&(word!='#'))
        {
          one.list[one.tempi]=word;
          one.tempi++;
          word=whole[i];
          i++;
          if(!(isalpha(word)))
          {
            one.list[one.tempi]='\0';
            top++;
            strcpy(stack[top],one.list);
            one.tempi=0;
          }
        }
        while(isdigit(word))
        {
          three.list[three.tempi]=word;
          three.tempi++;
          word=whole[i];
          i++;
          if(!(isdigit(word)))
          {
            three.list[three.tempi]='\0';
            top++;
            strcpy(stack[top],three.list);
            three.tempi=0;
          }
        }
        if(word==' ')//忽略空格
        {
          word=whole[i];
          i++;
        }
        if(word=='\0')//遇到结束符跳出循环
          break;
      }
  }
  if(top!=-1)//如果栈里无元素,则函数结束
    printch(stack,top);
  return 0;
}
void printch(char stack[][10],int top)
{
  char clist[][6]={"begin","if","then","while","do","end","","","","","","","+","-","*","/",":",":=","","<","<=","<>",">",">=","=",";","(",")","#"};
  int i,k;
  for(k=0;k<=top;k++)
  {
    if(strlen(stack[k])!=0)
    {
      if(stack[k][0]>='0'&&stack[k][0]<='9')//数字的输出
      {
        printf("<11,\"%s\">\n",stack[k]);
        continue;//如果是数字则continue循环
      }
      for(i=0;i<=28;i++)
      {
        if(strcmp(clist[i],stack[k])==0)
        {
          printf("<%d,\"%s\">\n",i+1,stack[k]);//关键字的输出
          break;
        }
        if(i==28)//找不到相同的字符串,则作为一个变量输出
        {
          printf("<10,\"%s\">\n",stack[k]);
        }
      }
    }
  }
}

v2.0的更多相关文章

  1. 《我常用的股票投资工具与网站》v2.0

    <我常用的股票投资工具与网站>v2.0 王大海 职业投资,抽空做一点分享. 661 人赞同了该文章 "少年你好,想不到你竟有如此因缘际会看到这里.我看你骨骼精奇,定是万中无一的交 ...

  2. 常用HTML meta 标签属性(网站兼容与优化需要),meta标签

    常用HTML meta 标签属性(网站兼容与优化需要),meta标签 标签提供关于HTML文档的元数据.元数据不会显示在页面上,但是对于机器是可读的.它可用于浏览器(如何显示内容或重新加载页面),搜索 ...

  3. [python]爬代理ip v2.0(未完待续)

    爬代理ip 所有的代码都放到了我的github上面, HTTP代理常识 HTTP代理按匿名度可分为透明代理.匿名代理和高度匿名代理. 特别感谢:勤奋的小孩 在评论中指出我文章中的错误. REMOTE_ ...

  4. Atitit jquery  1.4--v1.11  v1.12  v2.0  3.0 的新特性

    Atitit jquery  1.4--v1.11  v1.12  v2.0  3.0 的新特性 1.1. Jquery1.12  jQuery 2.2 和 1.12 新版本发布 - OPEN资讯.h ...

  5. 运维工程师打怪升级进阶之路 V2.0

    在此之前,发布过两个版本: 运维工程师打怪升级之路 V1.0 版本发布 运维工程师打怪升级必经之路 V1.0.1 很多读者伙伴们反应总结的很系统.很全面,无论是0基础初学者,还是有基础的入门者,或者是 ...

  6. 【JS】heatmap.js v1.0 到 v2.0,详细总结一下:)

    前段时间,项目要开发热力图插件,研究了heatmap.js,打算好好总结一下. 本文主要有以下几部分内容: 部分源码理解 如何迁移到v2.0 v2.0官方文档译文 关于heatmap.js介绍,请看这 ...

  7. 怎样在IDEA中使用JUnit4和JUnitGenerator V2.0自动生成测试模块

     因为项目的需要,所以研究了一下自动生成测试代码.将经验记录下来,总会有用的.我个人认为,好记性不如多做笔记多反思总结. 1.    前提条件 开发环境已正确配置 工程已解决JUnit依赖关系(pom ...

  8. 转发 win7+iis7.5+asp.net下 CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files 解决方案

    win7+iis7.5+asp.net下 CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NE ...

  9. Heatmap.js v2.0 – 最强大的 Web 动态热图

    Heatmap 是用来呈现一定区域内的统计度量,最常见的网站访问热力图就是以特殊高亮的形式显示访客热衷的页面区域和访客所在的地理区域的图示.Heatmap.js 这个 JavaScript 库可以实现 ...

  10. 数据获取以及处理系统 --- 功能规格说明书V2.0

    产品规格说明书: 版本号: V2.0 版本说明: Version 1.0 简单得需求分析以及构思,初稿形成 Version 2.0 细化beta阶段设计,增加典型用户尝尽以及功能罗列 1. 引言 1. ...

随机推荐

  1. Aqua Data Studio中文乱码

    使用Aqua Data Studio 查询数据时,如果表中的数据有中文时,会显示乱码,如下图: 解决方法很简单,只能更改字体即可,步骤如下: 更改字体后,显示的结果如下:

  2. mysql的统计函数

    一:统计函数 MySQL提供5个统计函数来对对数据进行统计.分别是实现对记录进行统计数,计算和,计算平均数,计算最大值和计算最小值. 1. 统计数据记录条数 可以有两种方式: COUNT(*)使用方式 ...

  3. java中equals和hashCode方法的解析

    解析Java对象的equals()和hashCode()的使用 前言 在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个.在多 ...

  4. ACM-ICPC国际大学生程序设计竞赛北京赛区(2015)网络赛 B Mission Impossible 6

    #1228 : Mission Impossible 6 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 You must have seen the very famou ...

  5. centos 安装网络错误

    yum install vnc-server 提示安装成功 rpm -q vnc-server 返回  package vnc-server is not installed 然而再重新安装时  yu ...

  6. NOIP 2002过河卒 Label:dp

    题目描述 如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点.例如 ...

  7. POJ 1177 Picture(求周长并)

    题目链接 看的HH的题解..周长有两部分组成,横着和竖着的,横着通过,sum[1] - last来计算,竖着的通过标记,记录有多少段. #include <cstdio> #include ...

  8. BZOJ2738: 矩阵乘法

    Description 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. Input 第一行两个数N,Q,表示矩阵大小和询问组数: 接下来N行N列一共N*N个数,表示这个矩阵: ...

  9. elasticsearch1.0 升级2.2的数据备份和恢复

    近期由于elasticsearch的版本升级,需要研究下elasticsearch的快照(snapshot)和恢复(restore)功能.   先说下背景,目前环境采用的是elasticsearch1 ...

  10. CentOS 拷贝mysql数据库到新的硬盘报错了

    服务器硬盘满了,加了一块,在目录 下新建了 mkdir /mysql cp -r /var/lib/mysql/* /mysql chown -R mysql:root /mysql 更改/etc/m ...