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

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

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

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

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

-  滤掉空格

-  跳过注释

-  发现词法错误

程序结构:

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

处理:

扫描二维码关注公众号,回复: 7445378 查看本文章

–遍历(什么遍历方式)

–词法规则

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

–二元组

单词类别:

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 }

猜你喜欢

转载自www.cnblogs.com/mogong/p/11649327.html