// exp1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "stdio.h"
#include"string.h"
char str[100];
//保留字表,这里只列举一部分
char pro[15][10]={"int","float","double","scanf","printf","if","else","switch","case","for","while","break","continue"};
int isLetter(char ch)
{
if((ch >= 'a' && ch <= 'z') || (ch >='A' && ch <= 'Z'))
return 1;
return 0;
}
int isDigit(char ch)
{
if(ch >= '0' && ch <= '9')
return 1;
return 0;
}
int isKey(char s[]){
for(int i=0;i<15;i++){
if(strcmp(pro[i],s)==0)
return 1;
}
return 0;
}
int main()
{
char ch;
int t,i=0;
char word[100];
printf("请输入待分析的句子(以#结束):\n");
for(t=0;;t++){
scanf("%c",&ch);
if(ch=='#')
break;
str[t]=ch;
}
printf("\n分析结果如下:\n");
for(t=0;str[t];t++){
ch = str[t];
if(ch=='\t'||ch==' '||ch=='\0'||ch=='\n'){
//空格,结束符,回车等不做处理
}
else if(isLetter(ch)){
i=0;
while(isLetter(ch)||isDigit(ch)){
printf("%c",ch);
word[i]=ch;i++;
t++;
ch=str[t];
}
word[i]='\0';//一定要加结束符!!!
if(isKey(word))
printf("\t保留字\n");
else
printf("\t标识符\n");
t--;//回退一个字符
}
else if(isDigit(ch)){
while(isDigit(ch)){
printf("%c",ch);
t++;
ch=str[t];
}
printf("\t整常数\n");
t--;
}
else {
switch(ch){
case '+':{
if(str[t+1]=='+'){
printf("%c%c\t逻辑运算符\n",ch,str[t+1]);
t++;break;
}
case '-':{
if(str[t+1]=='-'){
printf("%c%c\t逻辑运算符\n",ch,str[t+1]);
t++;break;
}
}
case '=':{
if(str[t+1]=='='){
printf("%c%c\t逻辑运算符\n",ch,str[t+1]);
t++;break;
}
}
//这里不完全列举,像逻辑运算的与或非,标点符号的!?。,界符的《》<>等等,原理是一样的,需要可以加上
case '*':
case '/':
printf("%c\t算术运算符\n",ch);break;
case '(':
case ')':
case '[':
case ']':
printf("%c\t界符\n",ch);break;
case ',':
case ';':
case ':':
printf("%c\t标点符号\n",ch);break;
default:
printf("%c\t其他\n",ch);break;
}
t--;
}
}
}
return 0;
}
【编译原理】一个简单的词法分析器
最新推荐文章于 2023-10-13 08:30:00 发布