#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
using namespace std;
map<string,char *> key;
map<char,char *> ssym;
void scanner(FILE *fp)
{
char word[20]={‘\0‘};
char ch;
int i,c,k,flag;
ch=fgetc(fp);//获取字符,指针fp并自动指向下一个字符
if(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘)))
{
k=0;
word[k++]=ch;
ch=fgetc(fp);
while(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))||(ch>=‘0‘&&ch<=‘9‘))
{
word[k++]=ch;
ch=fgetc(fp);
}
word[k]=‘\0‘;
fseek(fp,-1,1);
flag=1;
for(i=0;i<9;i++)
{
if(key[word]!=NULL)
{
printf("%20s\t\t%s\n\n",word,key[word]);
flag=0;
break;
}
}
if(flag)
printf("%20s\t\t标示符\n\n",word);
}
else
{
if(ch>=‘0‘&&ch<=‘9‘)
{
k=0;
word[0]=ch;
ch=fgetc(fp);
while(ch>=‘0‘&&ch<=‘9‘)
{
word[k++]=ch;
ch=fgetc(fp);
}
word[k]=‘\0‘;
fseek(fp,-1,1);
printf("%20s\t\t无符号实数\n\n",word);
}
else
{
word[0]=ch;
switch(ch){
case‘[‘:
case‘]‘:
case‘(‘:
case‘)‘:
case‘{‘:
case‘}‘:
case‘,‘:
case‘"‘:
case‘;‘:printf("%20s\t\t界符%s\n\n",word,ssym[word[0]]);break;
case‘+‘:ch=fgetc(fp);
word[1]=ch;
if(ch==‘=‘){
printf("%20s\t\t运算符%s\n\n",word,ssym[word[0]]);//运算符“+=”
}
else if(ch==‘+‘){
printf("%20s\t\t运算符%s\n\n",word,ssym[word[0]]); //判断结果为“++”
}
else {
fseek(fp,-1,1);
printf("%20s\t\t运算符%s\n\n",word,ssym[word[0]]); //判断结果为“+”
}
break;
case‘-‘:ch=fgetc(fp);
word[1]=ch;
if(ch==‘=‘){
printf("%20s\t\t运算符%s\n\n",word,ssym[word[0]]); }
else if(ch==‘-‘){
printf("%20s\t\t运算符%s\n\n",word,ssym[word[0]]); //判断结果为“--”
}
else {
fseek(fp,-1,1);
printf("%20s\t\t运算符%s\n\n",word,ssym[word[0]]); //判断结果为“-”
}
break;
case‘*‘:
case‘/‘:
case‘!‘:
case‘=‘:ch=fgetc(fp);
if(ch==‘=‘){
printf("%20s\t\t运算符\n\n",word);
}
else {
fseek(fp,-1,1);
printf("%20s\t\t运算符\n\n",word);
}
break;
case‘<‘:ch=fgetc(fp);
word[1]=ch;
if(ch==‘=‘){
printf("%20s\t\t运算符\n\n",word); //判断结果为运算符“<=”
}
else if(ch==‘<‘){
printf("%20s\t\t运算符\n\n",word); //判断结果为“<<”
}
else {
fseek(fp,-1,1);
printf("%20s\t\t运算符\n\n",word); //判断结果为“<”
}
break;
case‘>‘:ch=fgetc(fp);
word[1]=ch;
if(ch==‘=‘) printf("%20s\t\t运算符\n\n",word);
else {
fseek(fp,-1,1);
printf("%20s\t\t运算符\n\n",word);
}
break;
case‘%‘:ch=fgetc(fp);
word[1]=ch;
if(ch==‘=‘){printf("%20s\t\t运算符\n\n",word);}
if(ch>=‘a‘&&ch<=‘z‘) printf("%20s\t\t类型标识符\n\n",word);
else {
fseek(fp,-1,1);
printf("%20s\t\t取余运算符\n\n",word);
}
break;
default:printf("无法识别字符!\n\n"); break;
}
}
}
}
void init()
{
int i;
for(i=0;i<=255;i++) ssym[i]="";
ssym[‘+‘]="plus";
ssym[‘-‘]="minus";
ssym[‘*‘]="times";
ssym[‘/‘]="slash";
ssym[‘(‘]="lparen";
ssym[‘)‘]="rparen";
ssym[‘=‘]="eql";
ssym[‘,‘]="comma";
ssym[‘.‘]="period";
ssym[‘#‘]="neq";
ssym[‘;‘]="semicolon";
key["main"]="关键字主函数";
key["void"]="关键字空";
key["int"]="关键字整形";
key["char"]="关键字字符型";
key["printf"]="关键字打印";
key["scanf"]="关键字输入";
key["else"]="关键字条件语句";
key["if"]="关键字条件语句";
key["return"]="关键字返回";
}
int main()
{
char in_fn[30];//文件路径
char ch;
init();
FILE *fp;
printf("\n请输入源文件路径:");
while(1)
{
gets(in_fn);
if((fp=fopen(in_fn,"r"))!=NULL) break;
else printf("文件路径错误!请重新输入:");
}
printf("\n词法分析结果如下:\n");
do
{
ch=fgetc(fp);
if(ch==‘#‘) break;//文件以#结尾,作为扫描结束条件
else if(ch==‘ ‘||ch==‘\t‘||ch==‘\n‘){} //忽略空格,空白,和换行
else
{
fseek(fp,-1,1);//回退一个字节开始识别单词流
scanner(fp);
}
}while(ch!=‘#‘);
return 0;
}
原文:http://blog.csdn.net/u011032846/article/details/24320883