简单词法编译器
1.词法分析程序的功能:
词法分析器所输出单词符号常常表示成如下的二元式:
(单词种别,单词符号的属性值)
单词种别通常用整数编码。标识符一般统归为一种。常数则宜按类型(整、实、布尔等)分种。关键字可将其全体视为一种。运算符可采用一符一种的方法。界符一般用一符一种的方法。对于每个单词符号,除了给出了种别编码之外,还应给出有关单词符号的属性信息。单词符号的属性是指单词符号的特性或特征。
2.符号和种别码的对照表:
3.用文法描述词法规则:
程序设计语言中的几类单词可用下述规则描述:
1.增长的趋势:a^2n,aa aaaa aaaaaa........
b^2n,bb bbbb bbbbbb.......
2.循环规律:A->aa A->Aaa
B->bb B->Bbb
3.S->A|B
A->aa|Aaa // 意思是aa为开头,循环不断增加aa
B->bb|Bbb // 意思是bb为开头,循环不断增加bb
4.已完成的代码:
#include<stdio.h> #include<string.h> char one[9][10]={"begin","if","then","while","do","end","main","int","char"}; int number; int fenxi(char a[],int p) { char b[10]; int i=0,j=1,q; do{ b[0]=a[i]; if((b[0]>='a'&&b[0]<='z')||(b[0]>='A'&&b[0]<='Z')) { for(j=1;j<10;j++) { b[j]=a[j]; if(b[j]==' ') { b[j]='\0'; p=j; break; } } b[j+1]='\0'; puts(a); puts(b); for(j=0;j<9;j++) if(strcmp(b,one[j])==0) { printf("(%d,%s)",j+1,b); q=0; return p; } else q=1; if(q==1) { printf("(10,%s)",b); } return p; } if((b[0]>=0)&&(b[0]<=9)) { for(j=1;j<10;j++) { b[j]=a[j]; if(b[j]==' ') { b[j]='\0'; p=j; break; } } printf("(11,%s)",b); return p; } if((b[0]=='+')||(b[0]=='-')||(b[0]=='*')||(b[0]=='/')||(b[0]=='=')||(b[0]=='(')||(b[0]==')')||(b[0]=='#')) { if(a[1]!=' ') p=1; else p=2; switch(b[0]) { case '+':j=13;break; case '-':j=14;break; case '*':j=15;break; case '/':j=16;break; case '=':j=25;break; case ';':j=26;break; case '(':j=27;break; case ')':j=28;break; case '#':j=0;break; } printf("(%d,%s)",j,b); return p; } if((b[0]==':')||(b[0]=='>')||(b[0]=='<')) { puts(a); if((a[1]!='=')&&(a[1]!='>')&&a[1]!='<') { switch(b[0]) { case ':':j=17;break; case '<':j=20;break; case '>':j=23;break; } printf("(%d,%s)",j,b); return p; } else { b[1]=a[1]; b[2]='\0'; p=2; if((b[0]==':')&&(b[1]=='='))j=18; else if((b[0]=='<')&&(b[1]=='='))j=21; else if((b[0]=='>')&&(b[1]=='='))j=24; else if((b[0]=='<')&&(b[1]=='>'))j=22; printf("(%d,%s)",j,b); return p; } } }while(0); } void maopao(char a[],int p) { int i; for(i=0;a[p+i]!='\0';i++) a[i]=a[p+i+1]; } main() { char a[100]; int p; printf("ÇëÊäÈëÒ»¶Î³ÌÐò£º"); gets(a); do{ p=fenxi(a,p); maopao(a,p); }while(a[0]!='\o'); printf("%d",p); }