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 |
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char prog[800],token[20];//
char ch,error;
int syn,p,m,n,sum;//syn,sum,pp
char *word[6]={"begin","if","then","while","do","end"};
int main(){
p=0;
printf("\n(#)");
do{
ch=getchar();
prog[p++]=ch;
} while(ch!='#');
p=0;
do{
ch=prog[p++];
switch(ch){
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=20;token[0]=ch;
break;
case '<>':
syn=21;token[0]=ch;
break;
case '>':
syn=22;token[0]=ch;
break;
case '>=':
syn=23;token[0]=ch;
break;
case '(':
syn=24;token[0]=ch;
break;
case ')':
syn=25;token[0]=ch;
break;
case '#': //prog'#'停止
for(int i=0;i<20;i++)
token[i]=NULL;
syn=0;token[0]=ch;
break;
default:
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){//
m=0;
while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
token[m++]=ch;
ch=prog[p++];
}
token[m++]='\0';
p--;
syn=10;
for(int i=0;i<6;i++){
if(strcmp(word[i],token)==0){
syn=i+1;
break;
}
}
}else if((ch>='0'&&ch<='9')){//
sum=0;
while(ch>='0'&&ch<='9'){
sum=sum*10+(ch-'0');
ch=prog[p++];
}
p--;
syn=11;
}else if(ch==' '){//
ch=prog[p];
syn=100;
}else{
int n=p-1;
syn=-1;
error=prog[n];
}
break;
}
switch(syn){
case 100:
break;
case 11:
printf("\n(%d,%d)",syn,sum);
break;
case -1:
printf("\n'%c'",error);
break;
default:
printf("\n(%d,%s)",syn,token);
break;
}
}while(syn!=0);
}
截图如下:
来源:博客园
作者:董学沉啦
链接:https://www.cnblogs.com/xuechendong/p/11656176.html