词法分析
词法分析程序的功能:
将用户输入的程序段进行分析,逐个字符进行读取,根据关键字、数字、标识符等的文法规则,将它们拼在
一起组成一个有意义的单词,并输出自身值及其种别码。
符号与种别码对照表:
单词符号 |
种别码 |
单词符号 |
种别码 |
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 |
文法描述词法规则:
•<字母>→ a|b|c|……y|z
•<数字>→d|<整数>|.<小数>
•<整数常数>→1|2|3|···
•<标识符>→l|l<字母数字>
•<关键字>→→if|else|while|do|for|int|char|···
•<运算符>→+|-|-|/|=|=<等号>···
•<界符>→,|;|(|)|···
词法分析程序:
#include<stdio.h> /*定义I/O库所用的某些宏和变量*/ #include<string.h> /*定义字符串库函数*/ / char prog[80]={'\0'}, token[8]; /*存放构成单词符号的字符串*/ char ch; int syn, n,sum, m,p; char *rwtab[6]={"begin","if","then","while","do","end"}; void scaner(){ m=0; sum=0; for(n=0;n<8;n++) token[n]='\0'; ch=prog[p++]; while(ch==' ') ch=prog[p++]; if(isalpha(ch)) /*ch为字母字符*/{ while(isalpha(ch)||isdigit(ch)) /*ch 为字母字符或者数字字符*/{ token[m++]=ch; ch=prog[p++];} token[m++]='\0'; ch=prog[p--]; syn=10; for(n=0;n<6;n++) if(strcmp(token,rwtab[n])==0) /*字符串的比较*/{ syn=n+1; break;}} else if(isdigit(ch)) /*ch是数字字符*/{ while(isdigit(ch)) /*ch是数字字符*/{ sum=sum*10+ch-'0'; ch=prog[p++];} ch=prog[p--]; syn=11;} else switch(ch){ case'+':syn=12;token[0]=ch;break; case'-':syn=13;token[0]=ch;break; case'*':syn=14;token[0]=ch;break; case'/':syn=15;token[0]=ch;break; case'=':syn=16;token[0]=ch;break; case';':syn=17;token[0]=ch;break; case'(':syn=18;token[0]=ch;break; case')':syn=19;token[0]=ch;break; case'#':syn=0;token[0]=ch;break; default:syn=-1;}} main() { printf("请输入单词符号:"); p=0; do { ch=getchar(); prog[p++]=ch; }while(ch!='#'); p=0; do{ scaner(); switch(syn){ case 11: printf("(%d,%d)\n",syn,sum);break; case -1: printf("\n 出错!;\n");break; default: printf("(%d,%s)\n",syn,token); } }while(syn!=0); getch(); }