首页 > 其他 > 详细

编译原理词法分析器之简易版

时间:2014-04-23 02:49:58      阅读:504      评论:0      收藏:0      [点我收藏+]



#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;
}


编译原理词法分析器之简易版,布布扣,bubuko.com

编译原理词法分析器之简易版

原文:http://blog.csdn.net/u011032846/article/details/24320883

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!