zoukankan      html  css  js  c++  java
  • 144+梁肇森

      1 #include <stdio.h>
      2 #include <string.h> 
      3 #include <stdlib.h> 
      4 /* 
      5 变量说明: 
      6  line 
      7 从终端读入的字符串;  
      8 当前所指位置在计数器p, 
      9 
     10 字符为ch  sym 每个单词符号种类token为存放的单词自身字符串;当前所指位置在计数器m number 整型常数 word 保留字表
     11 */ 
     12 char line[80],token[8],ch; 
     13 
     14 int sym, p,m, number; 
     15 int n;
     16 char *word[6]={"begin","end","if","then","while","do"}; 
     17 void getsym(); 
     18 void main() //读了字符串, 直到遇.结束
     19 { 
     20 p=0; 
     21 printf("\n 请输入一个单词符号,以'.'结束\n "); 
     22 do 
     23 { 
     24 scanf("%c",&ch); 
     25 line[p++]=ch; 
     26     }while(ch!='.'); 
     27 line[p++]='\0'; 
     28 //逐个单词扫描;  
     29 p=0; 
     30 do 
     31 { 
     32 getsym(); 
     33 //当前扫描的单词存放在sym中
     34 switch (sym) 
     35 { 
     36 case 0: 
     37 return; 
     38 case 2: printf("( %5d,%-10d )\n",sym,number); 
     39 //NUMBER 
     40 break; 
     41 case -1:printf("you have input a wrong string\n"); 
     42 //getchar(); 
     43 break; 
     44 default: printf("( %5d,%-10s )\n",sym,token); 
     45 break; 
     46 } 
     47 } while (sym !=0); 
     48 getchar(); 
     49 } 
     50 void getsym() 
     51 { 
     52 for(m=0; m<8;m++) 
     53 token[m++]=NULL; 
     54 ch=line[p++]; 
     55 m=0; 
     56 while((ch==' ')||(ch=='\n')) 
     57 //略去空格,无效字符
     58 { 
     59 ch=line[p++]; 
     60 } 
     61 //字母打头的字符串: 标识符
     62 if ( (ch<='z' && ch>='a') ||(ch<='Z' && ch>='A') ) 
     63 {  
     64     do 
     65 { 
     66 token[m++]=ch; 
     67     ch=line[p++]; 
     68 }while((ch<='z' && ch>='a')|| (ch<='Z' &&ch>='A')||(ch>='0')&&(ch<='9')); 
     69 sym=1; 
     70 token[m++]='\0'; 
     71 ch=line[p--]; 
     72 for( n=0;n<6;n++) 
     73 { 
     74 if(strcmp(token,word[n])==0) 
     75 { 
     76 sym=n+17; 
     77 break; 
     78 } 
     79 } 
     80 /********************************************************* 
     81  *********** TODO:识别标识符IDENT 和保留字 ************** 
     82 
     83          *********************************************************/ 
     84 } 
     85 else if((ch>='0')&&(ch<='9')) 
     86 /* 数字number : 1*/ 
     87     {  
     88         number=0; 
     89         do 
     90 { 
     91 number=number*10+ch-'0'; 
     92         ch=line[p++]; 
     93 }while((ch>='0')&&(ch<='9')); 
     94          ch=line[p--]; 
     95      sym=2;  
     96 
     97  
     98 
     99    /********************************************************* 
    100    ***********  TODO:识别数字NUMBER   ********************* 
    101 
    102         ********************************************* ***********/ 
    103 } 
    104 else switch(ch) 
    105 { 
    106 case ':': 
    107 /* 赋值符号 */ 
    108 token[m++]=ch; 
    109 ch=line[p++]; 
    110 if (ch == '=') 
    111 { 
    112 sym = 16; 
    113 token[m++]=ch; 
    114 } 
    115 else 
    116 { 
    117 sym = -1; 
    118 } 
    119 break; 
    120 case '<': 
    121 /* <= 和< 符号 */ 
    122 token[m++]=ch; 
    123 ch=line[p++]; 
    124 if(ch =='=') 
    125             {   
    126    token[m++]=ch; 
    127    sym=10;                
    128             } 
    129 else if(ch =='>') 
    130             {   
    131 token[m++]=ch; 
    132 sym=8; 
    133             } 
    134 else 
    135 { 
    136 sym = 9; 
    137 p--; 
    138 } 
    139 break; 
    140 case '>': 
    141 /* >= 和> 符号*/ 
    142 token[m++]=ch; 
    143 ch=line[p++]; 
    144 if(ch =='=') 
    145             {   
    146    sym=12; 
    147                token[m++]=ch; 
    148             } 
    149 else 
    150 {   
    151 sym=11; 
    152 p--; 
    153             } 
    154 break; 
    155 case '+': sym=3; 
    156            token[m++]=ch; 
    157            break; 
    158 case '-': sym=4; 
    159            token[m++]=ch; 
    160            break; 
    161 case '*': sym=5; 
    162            token[m++]=ch; 
    163            break; 
    164 case '/': sym=6; 
    165            token[m++]=ch; 
    166            break; 
    167  case '=': sym=7; 
    168            token[m++]=ch; 
    169            break; 
    170 case '(': sym=13; 
    171            token[m++]=ch; 
    172            break; 
    173 case ')': sym=14; 
    174            token[m++]=ch; 
    175            break; 
    176 case ';': sym=15; 
    177           token[m++]=ch; 
    178           break; 
    179 case '.': sym=0; 
    180 token[m++]=ch; 
    181 break; 
    182 default: 
    183 sym=-1; 
    184 break; 
    185 } 
    186 token[m++]='\0'; 
    187 } 

  • 相关阅读:
    不喜欢数据库编程
    配置 yum 源的两种方法
    编译内核后iptables无法启动问题
    国外免费空间
    iptables--静态防火墙实例教程
    25 Most Frequently Used Linux IPTables Rules Examples
    如何开启或关闭SELinux
    google提供免费企业邮局
    RAID 0, RAID 1, RAID 5, RAID 10 Explained with Diagrams
    CentOS软件管理之fastestmirror和RPMforge
  • 原文地址:https://www.cnblogs.com/lzs741788135/p/5924016.html
Copyright © 2011-2022 走看看