作业5 词法分析程序的设计与实现

别来无恙 提交于 2019-12-01 02:52:45

词法分析程序(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

代码如下:

//引入头文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//声明变量
char prog[800],token[8]; //程序段 单词
char ch; //单词中的字符
int syn,p,m=0; //单词符号种别码 指针p
int n,sum=0; //整数sum
char *word[6]={"begin","if","then","while","do","end"}; //保留字
//主函数
int main(void){
  //指针从0开始
  p=0;
  printf("请输入源程序段:");
  //逐个字符读入,放入字符数组prog中,直到'#'停止
  do{
    ch=getchar();
    prog[p++]=ch;
  }while(ch!='#');
  //指针从0开始
  p=0;
  //逐个字符判断其单词符号种别码
  do{
    //初始化数组token
    for(n=0;n<8;n++){
      token[n]=NULL;
    }
    ch=prog[p++];
    //遇到空格指针加1
    while(ch==' '){
      ch=prog[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')){
        token[m++]=ch;
        ch=prog[p++];
      }
      p--;
      syn=10;
      //保留字
      for(n=0;n<6;n++){
        if(strcmp(token,word[n])==0){
          syn=n+1;
          break;
        }
      }
    }
    //数字
    else if((ch>='0'&&ch<='9')){
      sum=0;
      while((ch>='0'&&ch<='9')){
        sum=sum*10+ch-'0';
        ch=prog[p++];
      }
      p--;
      syn=11;
    }
    else{
      switch(ch){
        case '<':m=0;
          token[m++]=ch;
          ch=prog[p++];
          if(ch=='>'){
            syn=22;
            token[m++]=ch;
          }
          else if(ch=='='){
            syn=21;
            token[m++]=ch;
          }
          else{
            syn=20;
            p--;
          }
          break;
        case '>':m=0;
          token[m++]=ch;
          ch=prog[p++];
          if(ch=='='){
            syn=24;
            token[m++]=ch;
          }
          else{
            syn=23;
            p--;
          }
          break;
        case ':':m=0;
          token[m++]=ch;
          ch=prog[p++];
          if(ch=='='){
            syn=18;
            token[m++]=ch;
          }
          else{
            syn=17;
            p--;
          }
          break;
        case '*':syn=15;token[0]=ch;break;
        case '/':syn=16;token[0]=ch;break;
        case '+':syn=13;token[0]=ch;break;
        case '-':syn=14;token[0]=ch;break;
        case '=':syn=25;token[0]=ch;break;
        case ';':syn=26;token[0]=ch;break;
        case '(':syn=27;token[0]=ch;break;
        case ')':syn=28;token[0]=ch;break;
        case '#':syn=0;token[0]=ch;break;
        case '\n':syn=-2;token[0]=ch;break;
      }
    }
    switch(syn){
      case 11:printf("(%d,%d)\n",syn,sum);break;
      default:printf("(%d,%s)\n",syn,token);break;
    }
  }while(syn!=0);
}

测试截图如下:

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!