05 词法分析程序的设计与实现 10/10

词法分析程序(Lexical Analyzer)要求:

- 从左至右扫描构成源程序的字符流

-  识别出有词法意义的单词(Lexemes

-  返回单词记录(单词类别,单词本身)

-  滤掉空格

-  跳过注释

-  发现词法错误

程序结构:

输入:字符流(什么输入方式,什么数据结构保存)

处理:

–遍历(什么遍历方式)

–词法规则

输出:单词流(什么输出形式)

–二元组

单词类别:

1.标识符(10)

2.无符号数(11)

3.保留字(一词一码)

4.运算符(一词一码)

5.界符(一词一码)

单词符号

种别码

单词符号

种别码

begin

1

:

17

if

2

:=

18

then

3

<

20

while

4

<=

21

do

5

<>

22

end

6

>

23

l(l|d)*

10

>=

24

dd*

11

=

25

+

13

;

26

-

14

(

27

*

15

)

28

/

16

#

0

1、代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char wsym[80],ssym[8]; //wsym用于存放输入数组,ssym用于存放输出数组 
char ch;
int row,syn,sum,m,i,p;
char *word[6]={"begin","if","then","while","do","end"};

void getsyn(){
  for(i=0;i<8;i++)
    ssym[i]=NULL; //初始化 
  ch=wsym[p++]; 
  while(ch==' '){   //若为空格,则不进行操作,下标下移 
    ch=wsym[p]; 
    p++;
  }
  if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){   //判断是否为字母 
    m=0;
  while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
    ssym[m++]=ch;
    ch=wsym[p++];
  }
  ssym[m++]='';
  p--;
  syn=10;
  for(i=0;i<6;i++){
    if(strcmp(word[i],ssym)==0){   //判断于关键字是否一样 
      syn=i+1;
      break;
    }
  }
  }else if(ch>='0'&&ch<='9'){   //判断是否为字母 
    sum=0;
    while(ch>='0'&&ch<='9'){
      sum=sum*10+(ch-'0');
      ch=wsym[p++];
    }
    p--;
    syn=11;
  }else switch(ch){   //其它字符 
    case '+':
      ssym[0]=ch;syn=13;
      break;
    case '-':
      ssym[0]=ch;syn=14;
      break;
    case '*':
      ssym[0]=ch;syn=15;
      break;
    case '/':
      ssym[0]=ch;syn=16;
      break;
    case ':':
      i=0;
      ssym[i++]=ch;
      ch=wsym[p++];
      if(ch=='='){
        ssym[i++]=ch;
        syn=18;
      }else{
        syn=17;
        p--;
      }
      break;
    case '<':
      i=0; 
      ssym[i++]=ch;
      ch=wsym[p++];
      if(ch=='='){
        ssym[i++]=ch;  
        syn=21;
      }else if(ch=='>'){
        ssym[i++]=ch;
        syn=22;
      }else{
        syn=20;
        p--;
      }  
      break;
    case '>':
      i=0;
      ssym[i++]=ch;
      ch=wsym[p++];
      if(ch=='='){
        ssym[i++]=ch;
        syn=24;
      }else{
        syn=23;
        p--;
      }
      break;
    case '=':
      ssym[0]=ch;syn=25;
      break;
    case ';':
      ssym[0]=ch;syn=26;
      break;
    case '(':
      ssym[0]=ch;syn=27;
      break;
    case ')':
      ssym[0]=ch;syn=28;
      break;
    case '#':
      ssym[0]=ch;syn=0;
      break;
    case ' ':
      syn=100;
      break;
    default:
      syn=-1;
      break;
  }
}

int main(){
    p=0;
    row=1;
    printf("请输入语句段:");
    do{
      ch=getchar();
      wsym[p++]=ch; 
    }while(ch!='#');
    p=0;
    do{
      getsyn();
    switch(syn){
      case -1:
        printf("在第%d行有错误!",row);
        break;
      case 100:
        row+=1;
        break;
      case 11:
        printf("(%d,%d) ",sum,syn);
        break;
      default:
        printf("(%s,%d) ",ssym,syn);
        break;
  }
    }while(syn!=0);
}

2、测试结果

    

原文地址:https://www.cnblogs.com/jwwzone/p/11647176.html