⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subset.cpp

📁 一个简单的词法分析子程序
💻 CPP
字号:
// subset.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<fstream>

void parse(FILE* fpin,FILE* fpout);

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
}
void parse(FILE* fpin,FILE* fpout)
{
	      const int MAXBUF=255;
          char arr[MAXBUF];
          int i=0;//分析含字母的字符串用
          int j=0;//分析纯数字的字符串用
		  int lineno;
		  char ch;
           while(1)
      {
           fscanf(fpin,"%c",&ch);//从输入文件中读入一个字符
           if( ch==' ' || ch =='\t')//过滤掉空格和tab
            ;
            else if( ch=='\n')//回车换行符,为下面进行错误判断
            lineno++;
            else if( IsDigit(ch))//读入的是数字
      {
           while(IsDigit(ch))
      {
           arr[j] = ch;
            j++;
            fscanf(fpin,"%c",&ch);
      }
            fseek(fpin,-1L,SEEK_CUR);//文件指针后退一个字节
            char* temp1 =(char*)malloc(j+1);
             memcpy(temp1,arr,j);
             temp1[j] ='\0';
			 //把数组里面的内容拷贝到另外一个数组里面,实际上写不到那么多,所以只拷贝实际上有数据的
             j=0;//恢复初始状态,以备下次使用
             fprintf(fpout,"%s\t\t%d\n",temp1,2);//常数
             free(temp1);//释放内存
       }
            else if(IsAlpha(ch))//是字母开头的
       {
            while(IsAlpha(ch) || IsDigit(ch))
       {
            arr[i] =ch;
            i++;
            fscanf(fpin,"%c",&ch);
      }
            fseek(fpin,-1L,SEEK_CUR);

           char* temp = (char*)malloc(i+1) ;
           memcpy(temp,arr,i);
           temp[i] ='\0';
           i=0;
           /*基本思想同处理数字的*/

          if(FindOK(temp))//FindOK函数在关键字表中查找和temp字符串相同的,找到就返回类别编号
     {
          fprintf(fpout,"%s\t\t%d \n",temp,FindOK(temp));
     }
         else
     {
         fprintf(fpout,"%s\t\t%d\n",temp,1);//标示符号
     }
        free(temp);
     }
       //以下为2字节的运算符号
        else if(ch==':')//符号":="
     {
        fscanf(fpin,"%c",&ch);
        if(ch=='=') 
        fprintf(fpout,"%s\t\t%d\n",":=",20);
        else 
        fprintf(fpout,"error in compileing %d lines unknown character %c \n",lineno,ch);//出错了
     }
        else if(ch=='>')//符号 "> " 和">="
     { 
        fscanf(fpin,"%c",&ch);
        if(ch=='=')
        fprintf(fpout,"%s\t\t%d\n",">=",16);
        else
        fprintf(fpout,">\t\t15\n");
      }
        else if( ch=='<') //符号 "< " 和"<="	
      {
        fscanf(fpin,"%c",&ch);
        if(ch=='=')
       {fprintf(fpout,"<=\t\t18\n");}
        else if( ch=='>')
        {fprintf(fpout,"<>\t\t19");}
        else 
        {fprintf(fpout,"<\t\t19\n");}
      }
        else {
        //以下为一个字节的运算符号
        if(ch=='-') {fprintf(fpout,"%s\t\t%d\n",'-',10);continue;}//在文件中输出为"- 10"
        if(ch==';') {fprintf(fpout,";\t\t21\n");continue;}
        if(ch=='+') {fprintf(fpout,"+\t\t9\n");continue;}
        if(ch=='*') {fprintf(fpout,"*\t\t11\n");continue;}
        if(ch=='/') {fprintf(fpout,"/ \t\t12\n");continue;}
        if(ch=='(') {fprintf(fpout,"(\t\t13\n");continue;}
        if(ch==')') {fprintf(fpout,")\t\t14\n");continue;}
        if(ch=='.') {fprintf(fpout,".\t\t22\n");continue;}
        if(ch==',') {fprintf(fpout,",\t\t23\n");continue;}
        if(ch=='#') break;//分析结束
        else fprintf(fpout,"error in compileing %d lines unknown character %c \n",lineno,ch);//出错了,输出出错信息
      }
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -