码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-10-10 17:27:04      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:nbsp   case   输入   print   语句   get   数据   容器   add   

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

以下是我用c语言写的词法分析程序:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<string.h>
  4 typedef struct {
  5     int key;
  6     char *value;
  7 }HASH;
  8 HASH hash[100];
  9 char str[1000];//存储输入语句数组 
 10 char ch;//存储源程序段 
 11 int j=0;// hash[100] 的下标
 12 int Long=0;//str[]的下标 
 13 char word[10];//存储单词的容器 
 14 char num[10];//存储数字的容器 
 15 
 16 void danzifu(char Str[]){
 17     int i;
 18     int k=0;// word[10] 的下标
 19     int h=0;// num[10] 的下标
 20     bool flag=false;
 21     for(i=0;i<Long;i++){
 22         switch(Str[i]){
 23             case +: hash[j].key=13; hash[j].value="+";j++;break;
 24             case -: hash[j].key=14; hash[j].value="-";j++;break;
 25             case *: hash[j].key=15; hash[j].value="*";j++;break;
 26             case /: hash[j].key=16; hash[j].value="/";j++;break;
 27             case :: 
 28                 if(Str[++i]===){
 29                     hash[j].key=18; hash[j].value=":=";j++;
 30                 }else{
 31                     hash[j].key=17; hash[j].value=":";j++;
 32                     i--;
 33                 }
 34                 break;
 35             case <: 
 36                 if(Str[++i]===){
 37                     hash[j].key=21; hash[j].value="<=";j++;
 38                 }else if(Str[i]==>){
 39                     hash[j].key=22; hash[j].value="<>";j++;
 40                 }else{
 41                     hash[j].key=20; hash[j].value="<";j++;
 42                     i--;
 43                 }
 44                 break;
 45             case >: 
 46                 if(Str[++i]===){
 47                     hash[j].key=24; hash[j].value=">=";j++;
 48                 }else{
 49                     hash[j].key=23; hash[j].value=">";j++;
 50                     i--;
 51                 }
 52                 break;
 53             case =: hash[j].key=25; hash[j].value="=";j++;break;
 54             case ;: hash[j].key=26; hash[j].value=";";j++;break;
 55             case (: hash[j].key=27; hash[j].value="(";j++;break;
 56             case ): hash[j].key=28; hash[j].value=")";j++;break;
 57             case #: hash[j].key=0; hash[j].value="#";j++;break;
 58         }
 59         if(Str[i]>=a&&Str[i]<=Z){
 60             word[k]=Str[i];
 61             k++;
 62         }else{
 63             if(strcmp(word,"begin")==0){
 64                 hash[j].key=1; hash[j].value="begin";j++;
 65             }else if(strcmp(word,"if")==0){
 66                 hash[j].key=2; hash[j].value="if";j++;
 67             }else if(strcmp(word,"then")==0){
 68                 hash[j].key=3; hash[j].value="then";j++;
 69             }else if(strcmp(word,"while")==0){
 70                 hash[j].key=4; hash[j].value="while";j++;
 71             }else if(strcmp(word,"do")==0){
 72                 hash[j].key=5; hash[j].value="do";j++;
 73             }else if(strcmp(word,"end")==0){
 74                 hash[j].key=6; hash[j].value="end";j++;
 75             }
 76             k=0;
 77             word[10]=NULL;
 78         }
 79         if(Str[i]>=0&&Str[i]<=9){
 80             num[h]=Str[i];
 81             h++;
 82             flag=true;
 83         }else{
 84             if(flag){
 85 //                hash[j].key=11; hash[j].value=num;j++;
 86                 hash[j].key=11; hash[j].value="数字串";j++;
 87                 h=0;
 88                 num[10]=NULL;
 89                 flag=false;
 90             }
 91         }
 92     }
 93 }
 94 main(){
 95     printf("请输入源程序段:\n");
 96     do{
 97         ch=getchar();
 98         str[Long++]=ch;
 99     } while(ch!=#);
100     printf("\n%s",str);
101     danzifu(str);
102     int k=0;
103     while(hash[k].key!=0){
104         printf("\n<%d,%s>",hash[k].key,hash[k].value);
105         k++;
106     }
107 }

 

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

标签:nbsp   case   输入   print   语句   get   数据   容器   add   

原文地址:https://www.cnblogs.com/mogong/p/11649327.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!