词法分析程序(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 }
知识兔